cdk-deployで自動生成されるユニークIDのリソースから出力されるlogsにCDで期間指定を行ってみる
AWSの利用料金はまさに地理も積もれば山となりうるものです。特にCloudWatch Logsの料金は曲者です。不要になった古いログによる利用費は気がつくと嵩みやすく、破棄することでの利用費圧縮はよくある手段です。
cdkでのスタック作成でもlogsを使う場合は忘れず retention
のプロパティを設定していることでしょう。ただ cdk deploy
時に自動生成されるリソースが少々厄介です。
-CustomCDKBucketDeploymentXXX..
という文字列が含まれているリソースについては、cdkを使ったことがある場合はお馴染みかもしれません。このリソースから出力されるlogsにはcdk上で有効期間の指定手段がありません。仕様面の記載がドキュメント上でも見当たらないため困りものなのですが、リポジトリのIssueにて以下のコメントがありました。
Regarding log retention, I believe there may be legal requirements to retain "forever" in some cases, and I would allow users to opt into that (i.e: I agree "retain forever" shouldn't be the default).
「永久に保持する」法的要件の可能性を考慮するとのことで、やむを得ないものと受け止めるしかなさそうです。とはいえ、開発時の本データではない不要なものについてはこれにあてはまりません。該当するlogsに忘れず期間を設定するため、GitHub Actions を使ったCDにて行ってみました。
期間を指定する手段
手段として以下の手法が考えられます。
- 管理コンソールでの手作業
- cdkによるスタック設定
- awscliによるコマンド設定
1の管理コンソールによる作業はリソース生成毎に発生するため好ましくありません。2のcdkによる設定は新規作成時に限られ、特に自動生成リソースについてはランダムなユニーク名であり設定不可能なため論外です。結果、3のawscliに限定されます。
awscliによるコマンド設定
ログへの期間設定は aws logs put-retention-policy
にて行いますが、問題は --log-group-name
でグループ名を指定する必要があるところ。流石にユニークIDが含まれる自動生成リソース経由のログを個別指定するのは現実的ではありません。
そこで aws logs describe-log-groups
にて該当ユニークIDが含まれるロググループを抜粋して期間を適用します。
for name in $(aws logs describe-log-groups | jq -r '.logGroups[].logGroupName | match(".*-CustomCDKBucketDeployment.*") | .string') do aws logs put-retention-policy --log-group-name $name --retention-in-days 731 done
なお、retention-in-days
に指定可能な日数は以下の通り。
日数 | 補足 |
---|---|
1 | 1日 |
3 | 3日 |
5 | 週辺りの平日 |
7 | 1週間 |
14 | 2週間 |
30 | 1ヶ月 |
60 | 2ヶ月 |
90 | 3ヶ月 |
120 | 4ヶ月 |
150 | 5ヶ月 |
180 | 半年 |
365 | 1年 |
400 | 1年1ヶ月 |
545 | 1年半年 |
731 | 1年1日 |
1827 | 5年と2日 |
3653 | 10年と3日 |
ポイントは1年分を設定したい場合 365 * 2
ではなく 365 * 2 + 1
となっているところです。
上記にない日付を指定するとエラーになります。
An error occurred (InvalidParameterException) when calling the PutRetentionPolicy operation: Invalid retention value. Valid values are: [1, 3, 5, 7, 14, 30, 60, 90, 120, 150, 180, 365, 400, 545, 731, 1827, 3653]
GitHub Actionsでの設定
composite-run-steps-action を用いてやってみました。環境に応じた日数指定を変更可能にするため、日数をパラメータとして受付可能にしています。
vim .github/actions/set_log_retaintion/action.yml
name: "set logs retaintion" inputs: days: description: day of retaintion default: 731 required: false runs: using: "composite" steps: - name: set retaintion shell: bash run: | for name in $(aws logs describe-log-groups | jq -r '.logGroups[].logGroupName | match(".*-CustomCDKBucketDeployment.*|/aws-glue/jobs/.*") | .string') do aws logs put-retention-policy --log-group-name $name --retention-in-days ${{ inputs.days }} done
Workflow本体では以下の通り。cdk deploy
実行後に行うことを忘れずに。
- name: Logs retaintion uses: ./.github/actions/set_log_retaintion with: days: 30
他のログにも対処してみる
awscliでの設定にしておくと楽なログは他にもあります。例えばAWS GlueのGlueJob。設定ではロググループ名指定のみ可能(--continuous-log-logGroup
)で、期間指定は不可能です。
標準のグループ名は以下3つの固定。なので決め打ちも可能です。
- /aws-glue/jobs/logs-v2/
- /aws-glue/jobs/error
- /aws-glue/jobs/output
ただ、 /aws-glue/jobs/
までは一致しています。前方一致にして、cdkリソースと纏めて設定してみます。
for name in $(aws logs describe-log-groups | jq -r '.logGroups[].logGroupName | match(".*-CustomCDKBucketDeployment.*|/aws-glue/jobs/.*") | .string') do aws logs put-retention-policy --log-group-name $name --retention-in-days 731 done
あとがき
cdkによる自動生成リソースは仕様が検索しても見つからず、ログについても出力されたものに対しての上書き措置としました。要件上で維持の必要があり、期間指定不要であれば問題ありません。が、単なるコストでしかなく、利用費対策として都度の手作業が面倒な場合には今回の手順が一つの手段になるかと思われます。