末尾ひとつ前のフィールドを取得

`awk`で表題の通り。

■ 環境

  • awk 3.1.7
  • CentOS 6.7

■ awk

`awk`で末尾のフィールドの値を取得することがある。例えば下記のようなCSVである場合。

$ cat test.csv
1,aaa,bbb,ccc
2,aiueo,aiueo,aiueo
3,test1,test2,test3
$
$ awk -F, '{print $NF}'
ccc
aiueo
test3
$

フィールド数を取得できる”NF“と”$“で末尾の値を取得している。フィールド数がそれほどなければ末尾ひとつ前のフィールドの値もわかりやすいが、これ何番目だ?と数えるのが億劫な場合は下記で取得することができる。

$ awk -F, '{print $(NF-1)}' test.csv
bbb
aiueo
test2
$

以上。

TLS1.1/1.2で接続確認

Macで表題を行いたい。

■ 環境

  • OpenSSL
  • Mac OSX El Capitan

■ openssl

下記コマンドでSSL2/SSL3/TLS1.0/TLS1.1/TLS1.2あたりの接続を確認しようとした。

SSL2

$ echo | openssl s_client -connect example.com:443 -ssl2

SSL3

$ echo | openssl s_client -connect example.com:443 -ssl3

TLS1

$ echo | openssl s_client -connect example.com:443 -tls1

TLS1.1をやろうとしたところでコマンドの実行エラー。`openssl`のヘルプが表示されてしまった。どうやら`-tls1_1`や`-tls1_2`というオプションが無いようである。versionを調べると下記であった。

$ openssl version
OpenSSL 0.9.8zh 14 Jan 2016
$

ちなみにAmazonLinuxでは下記のversionであった。

$ openssl version
OpenSSL 1.0.1k-fips 8 Jan 2015
$

AmazonLinuxのversionであれば、`-tls1_1`や`-tls1_2`のオプションが存在する。

そういえばHomebrewで`openssl`は入れている気がする。ので確認。

$ brew info openssl

現時点で最新の”1.0.2k“がインストールされていた。上記に記載された下記の通り、”PATH“を通す使い方が良いのだろうか。

If you need to have this software first in your PATH run:
  echo 'export PATH="/usr/local/opt/openssl/bin:$PATH"' >> ~/.bash_profile

とりあえず必要な時はデフォルトではなくこっちの`openssl`を使うようにする。

TLS1.1

$ echo | /usr/local/opt/openssl/bin/openssl s_client -connect example.com:443 -tls1_1

TLS1.2

$ echo | /usr/local/opt/openssl/bin/openssl s_client -connect example.com:443 -tls1_1

以上。

COUNTIFS関数

表題の関数がExcelでもGoogleスプレッドシートでもあるのを知った。COUNTIFを複数の条件に一致した場合に計上したい。COUNTIF関数は知っていたのだが、これは1つの条件でしか計上されない。

■ 環境

  • Excel
  • Googleスプレッドシート

■ Excel

COUNTIFS関数 – OFFICEサポート
https://support.office.com/ja-jp/article/COUNTIFS-%E9%96%A2%E6%95%B0-dda3dc6e-f74e-4aee-88bc-aa8c2a866842

■ Googleスプレッドシート

COUNTIFS
https://support.google.com/docs/answer/3256550?hl=ja

単なるヘルプへのメモになってしまったが仕方ない。

以上。

AWS WAF metrics

表題の件についてのメモ。

■ 環境

  • AWS WAF
  • CloudWatch
  • awscli 1.11.80

■ list-metrics

まずはどんなメトリクスがあるのかを調べる。

$ aws cloudwatch list-metrics --namespace WAF

`–namespace WAF`を入れないと、全メトリクスが取得できてしまうので絞る。自身の環境の場合は下記のようなレスポンスが得られた。

$ aws cloudwatch list-metrics --namespace WAF
{
    "Metrics": [
        {
            "Namespace": "WAF",
            "Dimensions": [
                {
                    "Name": "WebACL",
                    "Value": "withsintest"
                },
                {
                    "Name": "Region",
                    "Value": "ap-northeast-1"
                },
                {
                    "Name": "Rule",
                    "Value": "testrule1"
                }
            ],
            "MetricName": "BlockedRequests"
        },
        {
            "Namespace": "WAF",
            "Dimensions": [
                {
                    "Name": "WebACL",
                    "Value": "withsintest"
                },
                {
                    "Name": "Region",
                    "Value": "ap-northeast-1"
                },
                {
                    "Name": "Rule",
                    "Value": "ALL"
                }
            ],
            "MetricName": "BlockedRequests"
        }
    ]
}
$

■ get-metric-statistics

続いてこれらのメトリクスデータを取得する。

$ aws cloudwatch get-metric-statistics

オプションが多々必要なようである。

  • –namespace WAF
  • –metric-name BlockedRequests
  • –start-time 2017-04-24T15:00:00Z
  • –end-time 2017-04-25T15:00:00Z
  • –period 3600

これら必須のオプションだけで取得できるかと思いきや、下記エラーが出た。

An error occurred (InvalidParameterCombination) when calling the GetMetricStatistics operation: At least one of the parameters Statistics and ExtendedStatistics must be specified.
  • –statistics Sum

これを追加したところ、エラーは出なくなったがデータは何も取得できず。

{
    "Datapoints": [],
    "Label": "BlockedRequests"
}

上記のように空である。続いて書きオプションも追加。

  • –dimensions

これも指定する必要がありそうだ。”MetricName“が同じだから”Dimensions“で判断するしかないということか。と自身の中では納得し、結果下記のように実行。

$ aws cloudwatch get-metric-statistics \
--namespace WAF \
--metric-name BlockedRequests \
--start-time 2017-04-24T15:00:00Z \
--end-time 2017-04-205T15:00:00Z \
--period 3600 \
--statistics Sum \
--dimensions Name=WebACL,Value=withsintest Name=Region,Value=ap-northeast-1 Name=Rule,Value=ALL
{
    "Datapoints": [
        {
            "Timestamp": "2017-04-24T19:00:00Z",
            "Sum": 3.0,
            "Unit": "None"
        },
        {
            "Timestamp": "2017-04-25T02:00:00Z",
            "Sum": 4.0,
            "Unit": "None"
        },
        {
            "Timestamp": "2017-04-25T02:00:00Z",
            "Sum": 2.0,
            "Unit": "None"
        }
    ],
    "Label": "BlockedRequests"
}
$

`–period`で指定した1時間ごとのデータが取得できた。”0“件の場合には省略されるようだ。

以上。

■ 関連

waf or waf-regional

waf or waf-regional

AWSの表題の件について。単なるメモである。

■ 環境

  • awscli 1.11.80
  • Mac OSX El Capitan

■ waf

WAFの設定をしたのだが、下記のように`awscli`で取得できない。

$ aws waf list-web-acls
{
    "WebACLs": []
}
$

さてなぜであろう???としばらく悩んでいたら気がついた。”waf-regional“なるものがあることに。

■ waf-regional

$ aws waf-regional list-web-acls
{
    "WebACLs": [
        {
            "WebACLId": "XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXXX",
            "Name": "withsintest"
        }
    ]
}
$

こちらでは思い通りの結果が得られた。管理コンソールから見てみると、”Filte“が下記で分かれていた。

  • CloudFront WAF resources:
    • Global (Cloudfront)
  • ALB WAF resources:
    • US East (N.Virginia)
    • US West (Oregon)
    • Eu (Ireland)
    • Asia Pacific (Tokyo)

なるほど。ALBで検証していたので”waf-regional“の方に入っていたようだ。それなのに`awscli`では”waf“でコマンド実行していた為、”Cloudfront“のリソースしか取得できていなかったのが原因であった。

waf-regional“にしかないサブコマンド。

  • associate-web-acl
  • disassociate-web-acl
  • get-web-acl-for-resource
  • list-resources-for-web-acl

これ以外はどちらでも同じように使えるようだ。

以上。