Slide 1

Slide 1 text

#jawsug_Kanazawa_ct AWS CodePipelineでコンテナアプリをデプロイした 際に、古いイメージを自動で削除する Masaki Suzuki 2024/11/02 JAWS-UG金沢支部×コンテナ支部合同企画 物理コンテナ見ながらコンテナ勉強会!

Slide 2

Slide 2 text

#jawsug_Kanazawa_ct アジェンダ 1. 導入&コンテナセキュリティ 2. CodePipelineでの対応方法 3. まとめ & JAWS-UG 名古屋 から宣伝 2

Slide 3

Slide 3 text

#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

Slide 4

Slide 4 text

#jawsug_Kanazawa_ct 自己紹介その2 4 • 5/17(金)発売のSoftware Design6月号にて、Bun.jsの記事を執筆しました • 第2特集の「実証Bun 次世代JavaScriptランタイムの実態に迫る」の第1章お よび第3章を執筆しています

Slide 5

Slide 5 text

#jawsug_Kanazawa_ct 注意事項 ◼ 今回の発表資料・発言内容は、すべて個人の見解・知見になります ◼ 各サービスの詳細説明は割愛します ◼ 本資料は、下記URLで公開しています • この資料です 5

Slide 6

Slide 6 text

#jawsug_Kanazawa_ct 1. 導入&コンテナセキュリティ

Slide 7

Slide 7 text

#jawsug_Kanazawa_ct 導入&コンテナセキュリティ ◼ 業務でAWS CDKでコンテナアプリを作成することに(関連部分のみ抜粋) 7 AWS Coud Virtual private cloud (VPC) Private subnet Public subnet Private subnet Aurora CodePipeline ECS ECR NAT gateway GitHub (Infra/Frontend)

Slide 8

Slide 8 text

#jawsug_Kanazawa_ct 導入&コンテナセキュリティ ◼ 「Security-JAWS DAYS」において、クラスメソッド 佐藤智樹さんのコンテナセキュ リティについての発表で、コンテナセキュリティについて学ぶ ◼ コンテナセキュリティの把握にすごく役に立つので、ぜひ読んでみて下さい 8

Slide 9

Slide 9 text

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

Slide 10

Slide 10 text

#jawsug_Kanazawa_ct 2. CodePipelineでの対応方法

Slide 11

Slide 11 text

#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)」を担保する

Slide 12

Slide 12 text

#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』に 変換される」という記載がある

Slide 13

Slide 13 text

#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)

Slide 14

Slide 14 text

#jawsug_Kanazawa_ct 3. まとめ

Slide 15

Slide 15 text

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

Slide 16

Slide 16 text

#jawsug_Kanazawa_ct JAWS-UG 名古屋 から宣伝 ◼ 11/16(土)、名古屋でAWS GameDayをやります! ◼ まだ少しだけ枠がありますので、参加可能な方はぜひ参加を! 16

Slide 17

Slide 17 text

#jawsug_Kanazawa_ct ご清聴ありがとうございました 以上です