AWS認定資格 WEB問題集&徹底解説

DevOpsエンジニア-プロフェッショナル

正解 B問題
分野1:SDLC の自動化 タスクステートメント1.4:インスタンス・コンテナ・サーバーレス環境向けのデプロイ戦略の実装 タスクステートメント1.1:CI/CD パイプラインの実装
合格に向けて、もっと深く学習する
豊富な問題と詳細なAWSサービス解説を、24時間無料でお試しいただけます
プレミアム会員機能を無料で試す ❯
問題文と選択肢
あるオンライン診療予約プラットフォームの開発チームは、AWS CodeCommitのmasterブランチへの変更をトリガーに、アプリケーションをDockerコンテナイメージとしてビルドしてAmazon ECRへ自動的にプッシュし、そのイメージをAmazon ECS上のサービスへBlue/Green戦略で自動デプロイするCI/CDパイプラインを構築しようとしています。

この要件を満たす、最も効率的な構成はどれですか。
  • AWS CodePipelineからAWS CodeBuildステージを起動する。CodeBuildはCLIヘルパーを使ってECRの認証情報を取得し、イメージをビルドしてECRへプッシュする。ECRへのプッシュに反応するAmazon EventBridgeルールを作成し、ターゲットとしてAWS CodeDeployを直接指定してECSクラスターへデプロイする。
  • AWS CodePipelineからAWS CodeBuildステージを起動する。CodeBuildはCLIヘルパーを使ってECRの認証情報を取得し、イメージをビルドしてECRへプッシュする。CodeBuildステージの成功後、ターゲットをECSサービスとするAWS CodeDeployステージを開始する。
  • AWS CodePipelineからAWS CodeBuildステージを起動する。CodeBuildは、担当者のIAMユーザーのアクセスキーIDとシークレットアクセスキーを環境変数として渡してECRの認証情報を取得し、イメージをビルドしてECRへプッシュする。CodeBuildステージの成功後、2つ目のCodeBuildステージで `aws ecs update-service` コマンドを実行してECSサービスを直接更新する。
  • AWS CodePipelineからAWS CodeBuildステージを起動する。CodeBuildはCLIヘルパーを使ってECRの認証情報を取得し、イメージをビルドしてECRへプッシュする。CodeBuildステージの成功後、AWS CodeCommitのAPIを呼び出して新しいECSタスク定義を自動生成し、AWS CloudFormationアクションでECSサービスへ適用する。
解説 頻出度★★★★
この問題は、「CodeCommit のマージを起点 × ECR へイメージをプッシュ × ECS へ Blue/Green」の要件で、デプロイをパイプラインの外に出さず、CodeBuild ステージの次に CodeDeploy ステージを置くという標準構成を選べるかがポイント

A. AWS CodePipelineからAWS CodeBuildステージを起動する。CodeBuildはCLIヘルパーを使ってECRの認証情報を取得し、イメージをビルドしてECRへプッシュする。ECRへのプッシュに反応するAmazon EventBridgeルールを作成し、ターゲットとしてAWS CodeDeployを直接指定してECSクラスターへデプロイする。

前半のビルドとプッシュは妥当ですが、後半が成立しません。Amazon EventBridge のターゲット一覧に AWS CodeDeploy は含まれていないため、ECR へのプッシュイベントから CodeDeploy を直接呼び出すことはできません(呼ぶなら Lambda 関数などを 1 段挟む必要があります)。
加えて、デプロイをパイプラインの外へ出すと CodePipeline 上で成否の追跡・承認・再実行を一元管理できなくなり、「最も効率的」からも遠ざかります。

正解

B. AWS CodePipelineからAWS CodeBuildステージを起動する。CodeBuildはCLIヘルパーを使ってECRの認証情報を取得し、イメージをビルドしてECRへプッシュする。CodeBuildステージの成功後、ターゲットをECSサービスとするAWS CodeDeployステージを開始する。

正解です。CodePipeline のデプロイステージに Amazon ECS(Blue/Green)アクションを置くと、実体である CodeDeploy が新しいタスクセット(Green)を起動し、ロードバランサーのリスナーを切り替えて入れ替えます。
CodeBuild ステージが出力したイメージ定義や appspec.yaml・taskdef.json といった成果物を、そのまま次のステージが受け取る標準的な受け渡しで完結します。
ソース・ビルド・デプロイが 1 本のパイプラインに収まるため、実行状況の可視化も、切り替え失敗時の自動ロールバックも CodeDeploy に任せられます。

C. AWS CodePipelineからAWS CodeBuildステージを起動する。CodeBuildは、担当者のIAMユーザーのアクセスキーIDとシークレットアクセスキーを環境変数として渡してECRの認証情報を取得し、イメージをビルドしてECRへプッシュする。CodeBuildステージの成功後、2つ目のCodeBuildステージで `aws ecs update-service` コマンドを実行してECSサービスを直接更新する。

2 か所で要件に反します。まず、CodeBuild にはサービスロールがあり、ECR の認証はそのロールから取得できます。IAM ユーザーのアクセスキーを環境変数で渡すのは長期認証情報をビルド環境に持ち込むアンチパターンです。
さらに aws ecs update-service はローリング更新を行うコマンドであり、Blue/Green デプロイにはなりません。要件のデプロイ戦略そのものを満たしていません。

D. AWS CodePipelineからAWS CodeBuildステージを起動する。CodeBuildはCLIヘルパーを使ってECRの認証情報を取得し、イメージをビルドしてECRへプッシュする。CodeBuildステージの成功後、AWS CodeCommitのAPIを呼び出して新しいECSタスク定義を自動生成し、AWS CloudFormationアクションでECSサービスへ適用する。

AWS CodeCommit は Git リポジトリのサービスであり、ECS のタスク定義を自動生成するような API は存在しません。前提からして成立しない構成です。
また、CloudFormation で ECS サービスを更新した場合の既定の挙動はローリング更新で、Blue/Green にするには別途 CodeDeploy を組み込む構成が必要になります。
タスク定義とイメージの受け渡しは、CodeBuild の出力アーティファクトとデプロイアクションが担うのが本来の役割分担です。

構成図

AWS CodeCommit(master ブランチ)
   │ 変更を検知
   ▼
AWS CodePipeline
   ├─ CodeBuild ステージ ──docker push──▶ Amazon ECR
   │        │ 成功後に開始
   │        ▼
   └─ CodeDeploy ステージ ──トラフィック切替──▶ Amazon ECS サービス
これだけ覚える(記憶フック)
ECS の Blue/Green は CodeDeploy が担当。ビルドの次のステージに置くだけで完結する。
正解への思考ルート 問題文から要件を抽出し、選択肢の適否を判断するのがポイントです。
要件 判断ポイント
CodeCommit の master ブランチへの変更を起点にする 4 つの選択肢とも CodePipeline から CodeBuild を起動するところまでは共通。差が出るのは後半のデプロイ方法
→選択肢(A・B・C・D)は候補
ECR へプッシュするための認証 CodeBuild のサービスロールから取得するのが正道。IAM ユーザーの長期アクセスキーを渡す構成は選ばない
→選択肢(C)を消す
ECS へ Blue/Green 戦略でデプロイする ECS の Blue/Green は CodeDeploy の担当。update-service も CloudFormation の既定更新もローリング更新にしかならない
→選択肢(C・D)を消す
最も効率的な構成にする デプロイを EventBridge で外出しすると成否の追跡とロールバックが分断される。そもそも EventBridge のターゲットに CodeDeploy は無い
→選択肢(A)を消す
既存の CI/CD パイプライン 1 本で完結させる ビルドステージの成功を受けてCodeDeploy ステージが続くだけの構成が最小かつ標準
→選択肢(B)が正解
ひっかけポイント
  • 4 択とも前半(CodeBuild が CLI ヘルパーで ECR 認証してプッシュ)はほぼ同文。読み分けるべきは後半のデプロイ方法だけで、前半の正しさに引きずられない
  • 選択肢 A は EventBridge で疎結合にする現代的な設計に見えるが、EventBridge のターゲットに CodeDeploy は存在しない。ECR プッシュを起点にするなら、ターゲットに指定できるのは CodePipeline や Lambda
  • 選択肢 C の aws ecs update-service はローリング更新。「デプロイできる」ことと「Blue/Green でデプロイできる」ことは別物
  • 「CLI ヘルパーで ECR の認証情報を取得」という記述自体は正しい。正しい記述が混ざっていても、要件(Blue/Green・長期キーを使わない)を外していれば誤答
出題バリエーション 同じ知識が本番では条件を変えて出題されます。
問題文がこう変わったら 正解はこう変わる
「デプロイ戦略はローリング更新でよい」に変わったら CodePipeline の Amazon ECS 標準デプロイアクション(imagedefinitions.json)で足り、CodeDeploy は不要に。
「デプロイ先が EC2 やオンプレミスサーバー」に変わったら CodeDeploy の In-Place / Blue-Green(Auto Scaling グループ)とデプロイグループの設計が論点に。
AWS Lambda 関数を段階的に切り替えたい」に変わったら CodeDeploy の Canary / Linear(エイリアスの重み付け)が正解軸に。
ECR へのプッシュを起点にパイプラインを開始したい」に変わったら EventBridge ルールのターゲットに CodePipeline を指定する(CodeDeploy の直接指定は不可)。
「切り替え後も一定時間 Blue を残して即座に戻せるようにしたい」に変わったら CodeDeploy のトラフィック再ルーティングと元タスクセットの終了待機時間の設定が論点に。
関連サービスの解説 Amazon Elastic Container Service (Amazon ECS)
AWS CodeBuild
AWS CodeDeploy
AWS CodePipeline
リファレンス この問題を解くために必要な知識を扱う公式ドキュメントです。
知識項目 公式ドキュメント
EventBridge ルールのターゲットとして指定できるサービス(CodeDeploy は非対応) Amazon EventBridge のイベントバスターゲット
+ 質問 / コメント
解答・解説に疑問がある場合や、よりよい解説がある場合など、お気軽にコメントください。ただし、短文コメントは表示されません。また、中傷などコメントの内容によっては、会員機能を停止させて頂きます。教え学び合える場になれば嬉しいです。(コメント投稿にはログインが必要です)
正答率 0%
No.8 解説
あるオンライン診療予約プラットフォームの開発チームは、AWS CodeCommitのmasterブランチへの変更をトリガーに、アプリケーションをDockerコンテナイメージとしてビルドしてAmazon ECRへ自動的にプッシュし、そのイメージをAmazon ECS上のサービスへBlue/Green戦略で自動デプロイするCI/CDパイプラインを構築しようとしています。

この要件を満たす、最も効率的な構成はどれですか。
  • AWS CodePipelineからAWS CodeBuildステージを起動する。CodeBuildはCLIヘルパーを使ってECRの認証情報を取得し、イメージをビルドしてECRへプッシュする。ECRへのプッシュに反応するAmazon EventBridgeルールを作成し、ターゲットとしてAWS CodeDeployを直接指定してECSクラスターへデプロイする。
  • AWS CodePipelineからAWS CodeBuildステージを起動する。CodeBuildはCLIヘルパーを使ってECRの認証情報を取得し、イメージをビルドしてECRへプッシュする。CodeBuildステージの成功後、ターゲットをECSサービスとするAWS CodeDeployステージを開始する。
  • AWS CodePipelineからAWS CodeBuildステージを起動する。CodeBuildは、担当者のIAMユーザーのアクセスキーIDとシークレットアクセスキーを環境変数として渡してECRの認証情報を取得し、イメージをビルドしてECRへプッシュする。CodeBuildステージの成功後、2つ目のCodeBuildステージで `aws ecs update-service` コマンドを実行してECSサービスを直接更新する。
  • AWS CodePipelineからAWS CodeBuildステージを起動する。CodeBuildはCLIヘルパーを使ってECRの認証情報を取得し、イメージをビルドしてECRへプッシュする。CodeBuildステージの成功後、AWS CodeCommitのAPIを呼び出して新しいECSタスク定義を自動生成し、AWS CloudFormationアクションでECSサービスへ適用する。

(会員限定)当問題の評価をお願いします。改善に活用します。