Upgrade to Pro — share decks privately, control downloads, hide ads and more …

AWS CodePipelineでコンテナアプリをデプロイした際に、古いイメージを自動で削除する

Makky12
November 02, 2024

AWS CodePipelineでコンテナアプリをデプロイした際に、古いイメージを自動で削除する

2024/11/02(土) に開催された、JAWS-UG金沢支部×コンテナ支部の合同企画イベント「物理コンテナ見ながらコンテナ勉強会!」における、私の発表「AWS CodePipelineでコンテナアプリをデプロイした際に、古いイメージを自動で削除する」の発表資料です。(connpassにも公開済みです)

https://jawsug-kanazawa.connpass.com/event/325803/

#jawsug #jawsug_kanazawa_ct

Makky12

November 02, 2024
Tweet

More Decks by Makky12

Other Decks in Technology

Transcript

  1. #jawsug_Kanazawa_ct 自己紹介 ◼ 名前: 鈴木 正樹 (Masaki Suzuki) ◼ Job:

    クラウドアーキテクト&バックエンドエンジニア(※現職では違う) ◼ 主な活動拠点: JAWS-UG 名古屋支部 & CDK支部 ◼ 好きな技術: • クラウド(特にAWS) • サーバーレス, IaC(特にAWS CDK), CI/CD (GitHub Actions, AWS CodePipeline) etc. • 好きなAWSサービス:AWS Lambda, CDK ◼ SNS: • @makky12 (SUZUKI Masaki@クラウドエンジニア) • @makky12.bsky.social • https://github.com/smt7174/ • http://makky12.hatenablog.com/ 3
  2. #jawsug_Kanazawa_ct 導入&コンテナセキュリティ 9 The Power of PowerPoint - thepopp.com ◼

    ECRのイメージに対して、セキュリティ的に下記の対処が必要 (※1) • 古いイメージを削除する(未知の脆弱性がある場合がある) • イミュータブルなタグ名のみ許可する(=タグの重複は不可)(※2) ◼ アプリの仕様上、今回は発表資料に記載の「ECRライフサイクルポリシー」 で対応できなかったので、別の方法で対応する必要があった(※3) ◼ 一例として、「CodePipelineのイベント」を利用する例を紹介 ※1:もちろん他にも対応しなければならない事項は山程あります ※2:該当イメージの元コミットが分からなくなるため(「latestパターン」と呼ばれるアンチパターン) ※3:CDKでの対応例については、佐藤さんの発表資料に記載されているので、そちらを参照
  3. #jawsug_Kanazawa_ct CodePipelineで古いイメージを削除するタイミング 11 The Power of PowerPoint - thepopp.com ◼

    CodePipelineで古いイメージを削除するタイミングは、以下2つ ◼ ECRにイメージをpushした時(pushトリガ) ◼ CodePipelineが正常終了した時 ◼ 前者は「ECRにはpushしたが、その後のアプリデプロイが失敗する」場合 があるので(※1)、後者がおすすめ(※2) ◼ 問題は「CodePipelineの正常終了」をどうEventBridgeで検知するか? ※1:最終的に「ECRイメージのソース」と「デプロイされているソース」が一致しない問題が発生する ※2:データベースのACID特性で言う「原子性(Atomicity)」を担保する
  4. #jawsug_Kanazawa_ct 「CodePipelineの正常終了」を検知する方法 12 The Power of PowerPoint - thepopp.com ◼

    EventBridgeイベントパターンの「detail-type」に「CodePipeline Pipeline Execution State Change」を設定することで、CodePipeline実行状態の変更を検知できる(※1) ◼ AWS CDKにも「detailType」プロパティ(※2)があるので、ここに先程の文字列を(配列 形式で)指定する(※3) ◼ 「『正常終了』のみの検知」は、AWS CDKの「detail」プロパティ(※2)に「state: [‘SUCCEEDED’]」の形式で指定することで可能 ◼ 後は「addTarget」メソッドでLambdaやStep Functionsなどの「古いイメージを削除 する処理を行うサービス」をターゲットに指定する ※1: AWS公式ドキュメント「CodePipeline イベントのモニタリング」を参照 ※2: いずれも「aws-events.Rule.eventPattern」のプロパティ ※3:上記公式ドキュメントにも「EventBridgeでのイベント発火時、『detail-type』は『detailType』に 変換される」という記載がある
  5. #jawsug_Kanazawa_ct 最終的なCDKのソースコード&ワークフロー ◼ AWS CDKのソースコード ◼ ワークフロー 13 // import文は省略します

    // resourcesの「pipeline.pipelineArn」はCodePipelineのARN const eventRule = new Rule(this, 'CodePipelineCompletedEventRule', { eventPattern: { detail: { state: ['SUCCEEDED'], }, detailType: ['CodePipeline Pipeline Execution State Change'], source: ['aws.codepipeline'], resources: [pipeline.pipelineArn], }, }); // deleteEcrImageFunctionは古いイメージを削除するLambda関数のインスタンス eventRule.addTarget(new targets.LambdaFunction(deleteEcrImageFunction)); GitHub CodePipeline Lambda(Web) ECR Amazon EventBridge Pull Monitoring Trigger Event Delete Old Image(s)
  6. #jawsug_Kanazawa_ct まとめ 15 The Power of PowerPoint - thepopp.com ◼

    セキュリティ的な観点から、古いイメージはECRから削除すべき ◼ 「ECRライフサイクルポリシー」を設定することで、ポリシー(※1)に沿った 古いイメージの自動削除を行うことができる(※2) ◼ EventBridgeでは「CodePipeline実行状態の変更」を検知できるので、 「CodePipelineの正常終了」をトリガに古いイメージを削除することがで きる(※3) ※1:「イメージの経過日数」「イメージ数」「イメージタグ名(のワイルドカード指定)」など ※2:ただし「(イメージタグ名が)条件に一致しないイメージの削除」はできないので「最新ではないイ メージの一括削除」ができないのがネック ※3:もちろん「正常終了」以外のイベントをトリガにすることも可能(失敗、停止など)