S3デフォルト暗号化

表題について。

■ 環境

  • AWS S3
  • awscli 1.11.190
  • Mac OSX El Capitan

■ デフォルト暗号化

S3上でデフォルト暗号化がされるようにバケットの設定をすることができる。2017/11頃からであったと記憶している。ManagementConsoleから下記で変更することが可能である。

バケット > プロパティ > デフォルト暗号化

とりあえず”AES-256“を選択した。

`aws`コマンドでオブジェクトをput/getしても特に何もしなくても問題無い。

このManagementConsoleで”デフォルト暗号化”を設定するが、awscliでできるのか?を見てみた。

■ s3

$ aws s3 mb help

マニュアルを見ても、特にオプションと思わしきものはない。”region“を指定することができるくらいのようである。

■ s3api

$ aws s3api create-bucket help

上記では”–create-bucket-configuration“オプションがあるので指定できるのかと思ったのだが、”LocationConstraint“しか指定できないように読める…。その他は権限周りのオプションのようだ。

デフォルト暗号化の設定は後からでも変更できるな、と思い他のサブコマンドも確認してみる。

get-bucket-encryption

$ aws s3api get-bucket-encryption --bucket withsin
{
    "ServerSideEncryptionConfiguration": {
        "Rules": [
            {
                "ApplyServerSideEncryptionByDefault": {
                    "SSEAlgorithm": "AES256"
                }
            }
        ]
    }
}
$

暗号化しているか?は”get-bucket-encryption“サブコマンドで取得できる。ちなみにデフォルト暗号化をしていないバケットに対して同様のコマンドを実行すると下記のようになるようだ。

$ aws s3api get-bucket-encryption --bucket withsin2

An error occurred (ServerSideEncryptionConfigurationNotFoundError) when calling the GetBucketEncryption operation: The server side encryption configuration was not found
$

put-bucket-encryption

$ aws s3api put-bucket-encryption help

どうやらこのサブコマンドで設定することが可能なようである。試してみよう。

$ aws s3api put-bucket-encryption --bucket withsin2 --server-side-encryption-configuration '{
  "Rules": [
    {
      "ApplyServerSideEncryptionByDefault": {
        "SSEAlgorithm": "AES256"
      }
    }
  ]
}'
$
$ aws s3api get-bucket-encryption --bucket withsin2
{
    "ServerSideEncryptionConfiguration": {
        "Rules": [
            {
                "ApplyServerSideEncryptionByDefault": {
                    "SSEAlgorithm": "AES256"
                }
            }
        ]
    }
}
$

上記のように設定ができたようである。

以上。

AWS PriceList API

表題の件について。

■ 環境

  • awscli 1.11.190
  • Mac OSX El Capitan

■ AWS Price List API

`awscli`から使えるとのことなので試してみたいと思いやってみた。`help`を見てみると下記のサブコマンドがあるようだった。

  • describe-services
  • get-attribute-values
  • get-products

とりあえず`describe-services`を試す。

$ aws pricing describe-services

Could not connect to the endpoint URL: "https://api.pricing.ap-northeast-1.amazonaws.com/"
$

region“をデフォルト設定で東京にしているのでバージニアとかにしなければいけないのかな…と思い確認してみた。

http://docs.aws.amazon.com/ja_jp/awsaccountbilling/latest/aboutv2/using-pelong.html

上記のURLによるとエンドポイントは下記2つがある様子。

  • us-east-1
  • ap-south-1

というわけでなんとなく近そうな”ap-south-1“を使用する。

$ aws --region ap-south-1 pricing describe-services

An error occurred (AccessDeniedException) when calling the DescribeServices operation: User: arn:aws:iam::XXXXXXXXXXXX:user/withsin is not authorized to perform: pricing:DescribeServices
$

普段使用しているAccessKeyには権限が無いようだ。ManagementConsoleのIAM権限を追加した。とりあえずFull権限。

AWSPriceListServiceFullAccess

権限を追加後に再度実行してみたところ取得できた。

$ aws --region ap-south-1 pricing describe-services
{
    "Services": [
        {
            "ServiceCode": "AWSBudgets",
            "AttributeNames": [
                "productFamily",
  :

他のコマンドも試してみよう。実際の値を取得するには”get-products“だろうか…と適当にやってみた。

$ aws --region ap-south-1 pricing get-products

An error occurred (InvalidParameterException) when calling the GetProducts operation: Input Parameters are invalid. serviceCode cannot be null or empty
$

serviceCode“を指定する必要があるらしい。これは`describe-services`で取得できるのであろうと再度確認し実行する。

$ aws --region ap-south-1 pricing get-products --service-code awswaf
{
    "FormatVersion": "aws_v1",
    "PriceList": [
        "{\"product\":{\"productFamily\":\"Web Application Firewall\",\"attributes\":{\"servicecode\":\"awswaf\",\"groupDescription\":\"Number of Rules added per Web Access Control Lists\",\"usagetype\":\"Rule\",\"locationType\":\"AWS Edge Location\",\"location\":\"Any\",\"operation\":\"\",\"group\":\"Rule\"},\"sku\":\"7G4GAKZPYS82NXZT\"},\"serviceCode\":\"awswaf\",\"terms\":{\"OnDemand\":{\"7G4GAKZPYS82NXZT.JRTCKXETXF\":{\"priceDimensions\":{\"7G4GAKZPYS82NXZT.JRTCKXETXF.6YS6EN2CT7\":{\"unit\":\"month\",\"endRange\":\"Inf\",\"description\":\"Price per Rule\",\"appliesTo\":[],\"rateCode\":\"7G4GAKZPYS82NXZT.JRTCKXETXF.6YS6EN2CT7\",\"beginRange\":\"0\",\"pricePerUnit\":{\"USD\":\"1.0000000000\"}}},\"sku\":\"7G4GAKZPYS82NXZT\",\"effectiveDate\":\"2017-05-01T00:00:00Z\",\"offerTermCode\":\"JRTCKXETXF\",\"termAttributes\":{}}}},\"version\":\"20170526185723\",\"publicationDate\":\"2017-05-26T18:57:23Z\"}",
  :

取得できた。が、ここまで来て気がついた。これは料金表を得られるだけなのか。自身への請求情報じゃないのか、と。

当初イメージしていたものと違っていたのでここまでにしておく。

以上。

aws s3 ls bucket

知らなかったので表題をメモ。

■ 環境

  • awscli 1.11.113
  • Mac OSX El Capitan

■ aws s3 ls

いつもは下記のようにやっていた。

$ aws s3 ls s3://withsin/
                           PRE project1/
                           PRE project2/
$

何の気なしに下記のようにやっても同じ結果が得られた。

$ aws s3 ls withsin
                           PRE project1/
                           PRE project2/
$

s3://“のスキームはなくても良いらしい。知らなかった。

以上。

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

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

以上。

■ 関連

AWS WAF metrics