AWS Certified Developer - Associate (DVA-C02) #9 Domain 3-1 デプロイ — CI/CD

読了 5分

#8 暗号化とシークレット でセキュリティを終えました。次は 24% を占めるデプロイドメインです。DVA は「コードをどうビルドし、どこにデプロイし、無停止で更新するか」を問います。最初の記事は AWS 開発者ツール (Code シリーズ) の役割分担 です。名前が似ていて混同しやすいですが、それぞれの役割は明確です。

Code シリーズの役割分担 #

ツール役割一行
CodeCommitソースリポジトリマネージド Git (GitHub の代替)
CodeBuildビルド・テストソースをコンパイル・テストしてアーティファクトを生成
CodeDeployデプロイアーティファクトを EC2/Lambda/ECS にデプロイ
CodePipelineオーケストレーション上記の段階をつなぐパイプライン
CodeArtifactパッケージリポジトリnpm・pip・Maven 依存関係の保存・共有

核心の区別: CodePipeline は流れを調整し、CodeBuild はビルドし、CodeDeploy はデプロイします。「ビルドは誰が?」は CodeBuild、「デプロイは誰が?」は CodeDeploy、「全体をつなぐのは?」は CodePipeline です。

CodeBuild と buildspec.yml #

CodeBuild はビルド環境 (コンテナ) でソースを取得してコマンドを実行し、アーティファクトを作ります。ビルド定義はソースルートの buildspec.yml に置きます。

version: 0.2
phases:
  install:
    commands:
      - echo 依存関係のインストール
  pre_build:
    commands:
      - echo ログイン・準備
  build:
    commands:
      - echo ビルド・テスト実行
  post_build:
    commands:
      - echo パッケージング
artifacts:
  files:
    - '**/*'
  • フェーズは installpre_buildbuildpost_build の順です。
  • 環境変数で設定を注入し、機密値は Parameter Store・Secrets Manager から参照します (ビルドログへの平文露出は禁止)。
  • ビルド依存関係をキャッシュしてビルド時間を短縮できます。

試験の落とし穴: buildspec.yml はデフォルトで ソースルート に配置します。フェーズ名と順序を問う問題が出ます。

CodeDeploy と appspec #

CodeDeploy はアーティファクトを対象にデプロイし、デプロイ過程を ライフサイクルフック (lifecycle hook) で制御します。デプロイ定義は appspec.yml (EC2/オンプレミス) または appspec.yaml (ECS/Lambda) です。

デプロイ対象appspec の核心代表的なフック
EC2/オンプレミスファイルコピー位置 + フックスクリプトBeforeInstall, AfterInstall, ApplicationStart, ValidateService
Lambda新バージョンへのトラフィック切り替えBeforeAllowTraffic, AfterAllowTraffic
ECS新タスクセットへの切り替えBeforeInstall, AfterAllowTestTraffic など

ライフサイクルフックで検証スクリプトを実行してデプロイの成否を判定し、失敗すれば ロールバック します。デプロイ方式 (in-place vs blue/green、カナリア/線形) は #11 で扱います。

CodePipeline #

複数の段階を連結するオーケストレーターです。典型的なパイプラインは次のとおりです。

Source(CodeCommit/GitHub) → Build(CodeBuild) → (Test) → Deploy(CodeDeploy/CFN/ECS)
  • ステージ は 1 つ以上の アクション で構成され、ステージ間で アーティファクト が S3 を通じて受け渡されます。
  • ステージ間に 手動承認 (Manual Approval) アクションを入れて、人が確認してから進めるようにできます。
  • ソース変更を検知すると (EventBridge/Webhook) パイプラインが自動実行されます。

「本番デプロイの前に人が承認するようにせよ」の答えは CodePipeline の手動承認アクション です。

CodeArtifact #

npm・pip・Maven・NuGet のようなパッケージのマネージドリポジトリです。外部の公開リポジトリ (npmjs など) をプロキシ・キャッシュし、組織内部のパッケージを安全に共有します。「社内の依存パッケージを安全にホスティング・共有」の答えです。

コンテナデプロイ — ECR と ECS/Fargate #

DVA はコンテナの基礎も問います。

  • ECR (Elastic Container Registry) — Docker イメージリポジトリ。CodeBuild がイメージをビルドして ECR にプッシュします。
  • ECS/Fargate — コンテナ実行。Fargate はサーバー管理のないサーバーレスコンテナです。
  • デプロイは新しいタスク定義を登録してサービスを更新する方式で、CodeDeploy で blue/green 切り替えも可能です。

試験の出題パターン #

  • 「ソースをコンパイル・テストしてアーティファクトを作る段階は?」 → CodeBuild
  • 「アーティファクトを EC2/Lambda/ECS にデプロイする段階は?」 → CodeDeploy
  • 「全体の流れを自動でつなぐツールは?」 → CodePipeline
  • 「本番デプロイ前に人が確認。」 → CodePipeline の手動承認アクション
  • 「ビルド段階の定義ファイルは?」 → buildspec.yml (ソースルート)
  • 「デプロイフックの定義ファイルは?」 → appspec
  • 「社内 npm パッケージをホスティング・共有。」 → CodeArtifact
  • 「ビルドで秘密値を安全に使う。」 → Parameter Store/Secrets Manager の参照 (ログ露出禁止)。

よく出会う落とし穴 #

1) CodeBuild と CodeDeploy の役割の混同 #

ビルドは CodeBuild、デプロイは CodeDeploy です。CodePipeline は両者をつなぐ上位の流れです。

2) buildspec と appspec の混同 #

buildspec.yml は CodeBuild のビルド定義、appspec は CodeDeploy のデプロイ定義です。

3) 秘密を buildspec に平文で #

ビルド環境変数の機密値はシークレットストアから参照します。

まとめ #

この記事の要点:

  • CodeCommit (ソース)・CodeBuild (ビルド)・CodeDeploy (デプロイ)・CodePipeline (オーケストレーション)・CodeArtifact (パッケージ)
  • buildspec.yml (ビルド、ソースルート、install→pre_build→build→post_build)
  • appspec (デプロイ、ライフサイクルフック)
  • CodePipeline はステージ・アクション・アーティファクト、手動承認 でゲート
  • コンテナは ECR + ECS/Fargate

次へ — Domain 3-2 IaC とサーバーレスデプロイ #

デプロイを自動化するには、インフラをコードで定義する必要があります。#10 IaC とサーバーレスデプロイ では、CloudFormation のテンプレートとスタック、サーバーレスデプロイを単純化する SAM、そして Elastic Beanstalk のデプロイポリシーを整理します。

X