これはなに?
WAFCharm導入後、AWS Shield Advancedを追加導入するためレートベースルールを同じWebACLに追加を試みた結果です。
元々の構成もTerraformで構築されており、多仕向へのデプロイを想定していたのでTerraformもしくはcliで実行したかったですが上手くいかなかったので備忘録です。
まず考えたこと
構築済の部分はTerrafomで構築されていたので、Terraformに定義されたWebACLリソースのRuleに追加する案。
https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/wafv2_web_acl#rules
問題1
構築後、WAFCharmから配信されるルールはTerraform管理外ではあるが差分として出てくるのでruleをignoreしていた。
なのでルールをさらに追加しようとするとWAFCharmから配信されるルールをimport or追記してapplyする必要がある。
問題2
今後WAFCharmからルールが配信される度に差分が出るし、tfファイルがごちゃつくのでナシで。
次に考えたこと
Terraformのlocal-execの機能を用いてaws cliを叩いてルールを追加する案。
https://www.terraform.io/docs/language/resources/provisioners/local-exec.html
問題1
まずはaws cliで叩いてどんなもんか試してみようとした。
アップデートに必要な--lock-tokenを取得するコマンド
aws wafv2 get-web-acl --name test-webacl --scope CLOUDFRONT --id xxxxxxxxxx-4332-b1e6-3fdae9dfc0d3 --region us-east-1 | jq -r '.LockToken'
・アップデートのコマンド
aws wafv2 update-web-acl --name test-webacl --scope CLOUDFRONT --id XXXXXXXXX-b1e6-3fdae9dfc0d3 --default-action=Block={} --rules file://ratebase-rule.json --visibility-config SampledRequestsEnabled=true,CloudWatchMetricsEnabled=true,MetricName=test-webacl --lock-token 1b53ce78-04a3-4a3b-xxxxxxxxxxx --region us-east-1
・ratebase-rule.json
[
{
"Name": "ratebase-rule",
"Priority": 0,
"Statement": {
"RateBasedStatement": {
"Limit": 10000,
"AggregateKeyType": "FORWARDED_IP",
"ForwardedIPConfig": {
"HeaderName": "X-Forwarded-For",
"FallbackBehavior": "MATCH"
}
}
},
"Action": {
"Block": {}
},
"VisibilityConfig": {
"SampledRequestsEnabled": true,
"CloudWatchMetricsEnabled": true,
"MetricName": "ratebase-rule"
}
}
]
しかし、update-web-aclなので--rulesで渡すルールのjsonはWAFCharmで配信されたルールも含めて実行してあげないと、jsonに定義されたルール以外が消えてしまうことに気が付く。。。
まとめ
・結果的にShieldAdvancedの導入は部分的にコードでデプロイし、ルールの追加はマネジメントコンソールから行いました。
・複数環境へWAFCharmのルールを入れる際はタイミングは少し考えた方が良い。
・WebACLのcliの意外と大変だったので誰かの役に立てば幸いです。