Amazon DOP-C02: CI/CDパイプラインとデプロイ戦略 — 学習ガイド
こちらの一部です: AWS DevOps Engineer Professional DOP-C02 — 学習ガイド. 検証済みの解答で練習: Amazon試験ハブ, または時間制限付き模擬試験に挑戦: ExamRoll.io.
概要
AWS上の堅牢なCI/CDシステムは、ソース管理、ビルド、テスト、アーティファクトガバナンス、デプロイオーケストレーション、そして安全なリリース戦略を、複数のアカウントとリージョンにわたって連携させます。中核となるマネージドサービス群—CodeCommit、CodeArtifact、CodeBuild、CodePipeline、CodeDeploy—は、サーバーメンテナンスを不要にし、IAMやKMSと緊密に統合され、EC2/Auto Scaling、ECS、Lambdaへのブルー/グリーン、カナリア、ローリング、インプレースデプロイに対してファーストクラスのサポートを提供します。効果的なパイプラインは、正確なトリガー(Webhook、EventBridge、スケジュール)、規律あるアーティファクト管理、速度向上のためのビルドキャッシュ、そして自動ロールバックのためのヘルスアラームと連携した規範的なトラフィックシフトにも依存します。エンタープライズ向けには、クロスアカウントおよびクロスリージョンパターンが必須であり、ロールの引き受け、リージョン別のアーティファクトストア、一貫した暗号化ポリシーが要求されます。
AWS Developer Toolsによるオーケストレーション
CodeCommitを、プライベートで高可用性なGitサービスとして使用します。リポジトリやプルリクエストのイベントをEventBridgeと統合し、承認ルールテンプレートをサポートし、きめ細かな認可のためにIAMを使用します。サードパーティのGit(GitHub/Bitbucket)の場合、ほぼリアルタイムのトリガーを実現するために、CodePipelineのソースアクションをWebhookで設定します。
CodeArtifactは、複数のエコシステム(npm、Maven、PyPI、NuGet)のパッケージ管理を一元化します。キャッシュ機能付きのパブリックレジストリへのアップストリーム接続、リポジトリごとのKMS暗号化、自動的に期限切れとなるスコープが限定された認証トークンをサポートします。CodeBuildに統合するには、pre_buildフェーズで
undefined
を呼び出し、有効期間の長いシークレットを埋め込むことなくパッケージマネージャーを設定します。
CodeBuildは、ワーカーを管理することなく、エフェメラルなコンテナ化されたビルド環境を提供します。主な機能は以下の通りです。
- プライベートな依存関係のための環境分離とVPCサポート。Dockerビルドには特権モードを有効にし、イメージビルドを高速化するためにローカルのDockerレイヤーキャッシュを有効にします。
- 3つのソースからの環境変数:プレーンテキスト、SSM Parameter Store、Secrets Manager(デフォルトでセキュア、シークレットのハードコーディングは不要)。CodePipelineから変数を渡すこともできます。
- ビルド時間を短縮するためのキャッシュ:
- ローカルキャッシュ:ソースキャッシュ、Dockerレイヤーキャッシュ、ビルドホスト上のカスタムディレクトリ。
- S3キャッシュ:ビルド間で共有される再利用可能な依存関係セット。
- アーティファクト管理:
primaryとsecondaryArtifactsを指定して、複数の出力(例:アプリケーションバンドルとCloudFormationテンプレート)を公開します。アーティファクトはKMSキーで暗号化し、パブリックACLを避けます。 - レポート機能:ログをCloudWatch Logs/S3に送信します。テスト結果にはレポートを、PRフィードバックにはCodeBuildバッジを使用します。
CodePipelineはオーケストレーターです。ステージ(ソース、ビルド、テスト、デプロイ、承認)を定義し、その中で並列または直列に実行できるアクションを定義します。ベストプラクティスは以下の通りです。
- トリガー:
- GitHub/BitbucketソースにはWebhookを使用。
- CodeCommitのブランチ変更にはEventBridgeルールを使用。パイプラインの開始に失敗した場合は、ルールの存在を確認します。
StartPipelineExecutionを呼び出すEventBridgeのスケジュールルールによる、スケジュール実行パイプライン。
- アーティファクトストア:パイプラインが使用するリージョンごとにS3バケットを用意し、カスタマーマネージドKMSキーを使用します。クロスリージョンアクションのためには、リージョン別のアーティファクトストアを追加します。
- 手動承認:SNSまたはEventBridgeを使用してチャット/Webhookと統合し、ほぼリアルタイムの通知を実現します。
- きめ細かなIAM:最小権限を持つパイプラインサービスロール。クロスアカウント操作には、アクションごとのロールが引き受けられます。
CodeDeployは、EC2/オンプレミス、ECS、Lambdaターゲットをサポートするデプロイエンジンです。ライフサイクルフック、トラフィックシフト、ヘルスチェック、そしてCloudWatchアラームによる自動ロールバックを管理します。EC2インスタンスでCodeDeployエージェントが実行されていること、インスタンスプロファイルがアタッチされていること、そしてCodeDeployエンドポイントへのアウトバウンド接続(またはNAT経由のEgress)が確保されていることを確認してください。イベントのスキップやno-op(操作なし)デプロイは、多くの場合、エージェント、権限、または接続性の問題を示唆しています。
デプロイ戦略とCodeDeployのライフサイクル
リスク、キャパシティ、プラットフォームに応じて戦略を選択します。
- In-place (EC2/オンプレミス): 既存のインスタンス上でアプリケーションを更新します。OneAtATime、HalfAtATime、またはAllAtOnceのデプロイ設定と組み合わせます。ELBをアタッチして、インスタンスのドレインと再登録を行います。
- Rolling (ECS): 同じサービス上でタスクをバッチで置き換えます。ネイティブのECSローリング、またはCodeDeployを介して制御されたシフトを伴うブルー/グリーンとして管理されます。
- ブルー/グリーン:
- EC2/Auto Scaling: グリーンのASGをプロビジョニングし、検証後、トラフィックをブルーからグリーンに切り替えます。オプションで、ブルー環境を終了または保持します。
- ECS: 2つ目のターゲットグループの背後に代替タスクセットを作成し、検証後、リスナーを切り替えます。
- Lambda: エイリアスのトラフィックを新しい関数バージョンにシフトし、モニタリングします。
- Canary: 最初に小さな割合(例:10%)をシフトし、一定期間監視してから、残りを完了させます。
- Linear: トラフィックを均等なステップで増やします(例:5分ごとに10%)。
CodeDeployのappspec.ymlは、何をインストールし、いつスクリプトを実行するかを定義します。
- EC2/オンプレミス用 (YAML):
- files: ファイルを配置する場所。
- permissions: カスタムスクリプトなしでファイルの所有権/モードを更新。
- hooks (共通): ApplicationStop, BeforeInstall, Install, AfterInstall, ApplicationStart, ValidateService.
- トラフィック制御フック (ロードバランサー使用時): BeforeBlockTraffic, AfterBlockTraffic, BeforeAllowTraffic, AfterAllowTraffic.
- 事前定義された環境変数 (例: DEPLOYMENT_GROUP_NAME, DEPLOYMENT_ID, LIFECYCLE_EVENT) を使用して、個別のリビジョンなしで動的に動作を変更します。例えば、デプロイグループごとにApacheのログレベルを切り替えるなど。
- ECS用:
- resources: TaskDefinitionとLoadBalancerInfoを持つTargetService。
- hooks: BeforeInstall, AfterInstall, AfterAllowTestTraffic, BeforeAllowTraffic, AfterAllowTraffic.
- AfterAllowTestTrafficは、テストリスナーを使用してグリーンタスクセットでスモーク/統合テストを実行するのに最適です。
- Lambda用:
- resources: シフトする関数、バージョン、エイリアスを定義します。
- hooks: BeforeAllowTraffic, AfterAllowTraffic.
トラフィックのシフトとロールバック:
- デプロイ設定を構成します:
- Lambda/ECS: Canary10Percent15Minutes, Canary10Percent5Minutes, Linear10PercentEvery1Minute, AllAtOnce, またはカスタム。
- EC2 ブルー/グリーン: ロードバランサーのリスナー/ターゲットグループを介した、All-at-once、カナリア、またはリニアなトラフィック再ルーティング。
- デプロイグループにCloudWatchアラームを追加して、エラー、5xx、またはカスタムメトリクス発生時に自動的にロールバックします。ECSの場合、アラームはターゲットグループの5xxやサービスメトリクスを監視できます。Lambdaの場合、エイリアス/バージョンのディメンションを持つ関数のErrors/Throttlesを監視します。
- ライフサイクルフック (例: AfterAllowTestTraffic) を使用して、LambdaやSSM経由で検証を実行します。ゼロ以外の終了コードはロールバックを引き起こします。
EC2、ECS、Lambdaにおけるブルー/グリーンとトラフィックシフト
EC2/Auto Scaling:
- CodeDeployによるブルー/グリーンは、グリーン用に新しいAuto Scalingグループをプロビジョニングし、それを別のターゲットグループに関連付け、その後ALBリスナーを切り替えます。ブルーを自動的に終了するか、迅速なロールバックのために保持するかを選択できます。
- EC2でのin-placeデプロイの場合、ELBと組み合わせてインスタンスを正常に登録解除/再登録し、可用性を保護します。デプロイ設定がバッチサイズとペースを決定します。
ECS:
- CodeDeployは、ALBの背後にある2つのターゲットグループを使用してECSサービスと統合します。新しいタスク定義を持つ代替タスクセット(グリーン)が作成されます。
- テストトラフィックは専用のテストリスナーを介してグリーンターゲットグループに流れ、本番トラフィックは昇格までブルーに残ります。
- カナリアまたはリニアシフトは、CloudWatchアラームを監視しながら、グリーンへのトラフィックを段階的に移行させます。AfterAllowTestTrafficを使用して、本番へのカットオーバー前に検証(例:合成チェックを呼び出すLambda関数)を実行します。
Lambda:
- CodeDeployは、加重ルーティングを使用して関数エイリアスを新しいバージョンに更新します。カナリアおよびリニアパターンは、トラフィックの割合を徐々に移動させます。エイリアスのCloudWatchアラームが自動ロールバックをトリガーします。
- AWS SAMまたはCDKを使用すると、テンプレートでAutoPublishAliasとDeploymentPreferenceを設定して、関数ごとにカナリア/リニアポリシーとアラームをエンコードできます。
CodeDeployを超えた加重ルーティング:
- マルチリージョンまたはマルチスタックのバランシングには、ヘルスチェック付きのRoute 53加重レコードがリージョン間のトラフィック分割(例:セカンダリリージョンへ1%)とフェイルオーバーを提供します。これは、CodeDeployのサービスごとのトラフィックシフトを補完するものであり、置き換えるものではありません。
マルチアカウントおよびマルチリージョンへのデリバリー
エンタープライズのパイプラインは通常、中央集権的な「ツールアカウント」に配置され、複数のリージョンにまたがる開発/テスト/本番アカウントにデプロイします。
- クロスアカウント:
- CodePipeline のアクションで、パイプラインロールのプリンシパルを信頼するターゲットアカウントの RoleArn を指定します。アクションごと(CloudFormation, CodeDeploy, ECS, Lambda)に最小権限の許可を使用します。
- CodeBuild がターゲットアカウントのリソースにアクセスする必要がある場合、ビルドにロールを引き受けさせる (STS) か、アカウントごとのアクションロールを使用し、広範な AdministratorAccess は使用しません。
- CodeDeploy を EC2 に使用する場合、ターゲットアカウントがアプリケーション/デプロイグループとサービスロールを管理します。パイプラインは CreateDeployment を呼び出すためのロールを引き受けます。
- クロスリージョン:
- パイプライン設定にリージョンごとのアーティファクトストア(リージョン別の KMS キーを持つ S3 バケット)を追加します。バケットポリシーを更新し、パイプラインロールとアクションごとのロールが読み書きできるように許可します。
- 必要に応じてリージョン固有のアーティファクトをビルドします(例: リージョンローカルの S3 バケットをターゲットとして
aws cloudformation packageを使用して Lambda コードをパッケージングする)。 - リモートリージョンでの CloudFormation デプロイアクションは、そのリージョンのアーティファクトストアを参照する必要があり、最小権限のためにターゲットアカウントのスタック実行ロールを指定できます。
セキュリティ、アーティファクト、ガバナンス:
- アーティファクトバケットはプライベートに保ち、
authenticated-readのようなパブリック ACL は避けます。パイプラインとアクションロールにスコープを限定したバケットポリシーと KMS 暗号化に依存します。 - buildspec を標準化し、アーティファクトを予測可能な方法でプッシュします(例: EC2/CodeDeploy 用のアプリケーションバンドル、ECS 用の
taskdef.jsonとappspec、Lambda 用のパッケージ化されたテンプレート)。 - EC2 の AMI 事前ベーキングでイミュータビリティ(不変性)を推進し、CodeDeploy エージェントとベースランタイムの一貫性を保ちます。これにより、ドリフトとデプロイ時間が削減されます。
- EventBridge ルールを使用して、パイプラインイベントを通知、チャット Ops、チケット発行にミラーリングし、手動承認ゲートをオーケストレーションします。
実践的な問題シナリオ
Spotify は、数百のマイクロサービスにわたってより安全なリリースを必要としています。これらのマイクロサービスは、混合コンピューティング基盤(ECS on Fargate, EC2 ベースのサービス, Lambda)で構成されています。彼らは、本番トラフィックを流す前の自動テストを伴うカナリアおよびブルー/グリーンデプロイ、アーティファクトガバナンス、そして本番環境を別のアカウントに保持したままでのマルチリージョンへのプロモーションを要求しています。
- リポジトリとパッケージの確立
- プライベートリポジトリには CodeCommit を使用し、EventBridge 駆動の PR/テスト自動化を導入します。CodeArtifact は、アップストリームと KMS 暗号化を用いて npm, Maven, PyPI の依存関係をホストし、サプライチェーン管理を標準化します。 理由: 中央集権的な IAM/KMS 統合が可能で、重要なリポジトリに外部 Webhook が不要です。CodeArtifact はキャッシュされた、キュレート済みのパッケージを提供します。
- ビルドとテスト
- サービスごとに CodeBuild プロジェクトを作成し、VPC 統合、ローカルキャッシュ(Docker レイヤーとソース)、および Secrets Manager/Parameter Store から取得した環境変数を使用します。イメージをビルドして ECR にプッシュし、セカンダリアーティファクト(
taskdef.json/appspec.yamlまたはパッケージ化された CloudFormation テンプレート)を生成します。 理由: エフェメラルで分離されたビルド、強力なシークレット管理、キャッシュによるサイクル高速化、そして複数の出力がコンテナとサーバーレス両方のパッケージングをサポートします。
- パイプラインのオーケストレーション
- ツールアカウントに中央集権的な CodePipeline を作成し、ステージを設けます: Source, Build, Unit Tests, Deploy-to-Staging, Automated Tests, Manual Approval, Deploy-to-Prod。トリガーは CodeCommit の更新に対する EventBridge から発行され、夜間スケジュールされた EventBridge ルールが統合テストを開始します。 理由: ゲートを備えた、規範的で監査可能なフローであり、イベント駆動およびスケジュール駆動の両方の実行が可能です。
- ブルー/グリーンおよびカナリアデプロイ
- ECS サービスは、2つのターゲットグループとカナリアトラフィックシフトを伴う CodeDeploy のブルー/グリーンを使用します。検証は
AfterAllowTestTrafficで、コントラクトテストと合成チェックを実行する Lambda を介して行われます。EC2 サービスは、キャパシティが許す場合はOneAtATimeを使用した CodeDeploy インプレースデプロイ、またはブルー/グリーン ASG スワップを使用します。Lambda 関数は、Canary10Percent15Minutesと、API Gateway からの Errors と 5xx に対する CloudWatch アラームを使用して CodeDeploy でデプロイします。 理由: ランタイムごとのファーストクラスのトラフィック制御と、アラーム違反時の自動ロールバックにより、顧客への影響を最小限に抑えます。
- クロスアカウントおよびクロスリージョンへのプロモーション
- パイプラインは、開発/テスト/本番アカウントで環境ごとのロールを引き受けます。us-east-1 と eu-west-1 のために、リージョン別のアーティファクトストアとリージョン別の KMS キーを設定します。CodeBuild はリージョン固有のパッケージ化されたテンプレートを生成し、アーティファクトをリージョンローカルのバケットにアップロードします。各アカウント/リージョンの CloudFormation アクションはスタック実行ロールを使用し、CodeDeploy アクションは環境固有のアプリケーション/デプロイグループをターゲットにします。 理由: 本番環境の強力な分離、ロールの引き受けによる最小権限、そして低い運用オーバーヘッドでコンプライアンスに準拠した暗号化が実現できます。
- アーティファクトのガバナンスとセキュリティ
- 制限的なポリシーでプライベート S3 アーティファクトバケットを強制し、すべてのパブリック ACL を削除します。コンテナイメージとテンプレートに署名し、SBOM をビルドアーティファクトとして保存します。IAM 条件キーを使用して、本番環境のアクションをツールアカウントのパイプラインに限定します。 理由: データ漏洩を防止し、来歴(プロビナンス)を向上させ、サプライチェーンのベストプラクティスに準拠します。
- 可観測性と通知
- すべてのデプロイグループに CloudWatch アラームをアタッチします。EventBridge ルールは、CodePipeline の実行および承認イベントを SNS トピックと、Slack に投稿する Lambda に転送します。 理由: より速いフィードバック、自動ロールバック、そして必要な箇所での人間が介在する承認を実現します。
この設計は、異種のランタイムを単一のマネージドツールチェーンの下に統合し、自動検証を伴う安全なロールアウト戦略を提供し、セルフホストの CI/CD インフラストラクチャを排除することでメンテナンスを削減し、明確な職務分掌でグローバルにスケールします。
すべてのドメイン · Infrastructure as Codeと構成管理 →
これらの問題を練習する → · ExamRoll.ioで時間制限付き練習 →
Pass the whole exam — not just this question
You found this answer. Get every verified question and explanation in one place, and save hours of prep. Free to start.
試験に合格する →