cdk-deployで自動生成されるユニークIDのリソースから出力されるlogsにCDで期間指定を行ってみる

cdk deployにて自動生成されるリソースが出力するログは、期間指定手段が見当たらないために処置を忘れていると残り続けやすい代物です。ランダムなユニークIDが名前に含まれていることもあり、手作業ではなくCDによる自動での期間指定を試してみました。
2021.08.06

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にて行ってみました。

期間を指定する手段

手段として以下の手法が考えられます。

  1. 管理コンソールでの手作業
  2. cdkによるスタック設定
  3. 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による自動生成リソースは仕様が検索しても見つからず、ログについても出力されたものに対しての上書き措置としました。要件上で維持の必要があり、期間指定不要であれば問題ありません。が、単なるコストでしかなく、利用費対策として都度の手作業が面倒な場合には今回の手順が一つの手段になるかと思われます。