AWSのCI/CDパイプライン設計|CodePipeline・CodeBuild・CodeDeployでBlue/Greenデプロイを自動化する構成パターン入門

宮崎智広 この記事の監修:宮崎智広(Linux実務・教育歴20年以上・受講者3,100名超)
HOMELinux技術 リナックスマスター.JP(Linuxマスター.JP)AWS(Amazon Linux) > AWSのCI/CDパイプライン設計|CodePipeline・CodeBuild・CodeDeployでBlue/Greenデプロイを自動化する構成パターン入門
「コードを本番サーバーにデプロイするたびにSSHで入って git pull を実行し、アプリを再起動する。その数分間はサービスが止まる」。こうした手作業リリースを続けているシステムは、ヒューマンエラーと属人化のリスクを常に抱えています。

AWSにはこの問題を解消するCI/CDパイプラインのマネージドサービスが揃っています。CodePipeline・CodeBuild・CodeDeployを組み合わせることで、GitへのPushをトリガーにビルド・テスト・デプロイを自動化し、ECSのBlue/Greenデプロイでゼロダウンタイムのリリースを実現できます。

この記事では、3サービスの役割分担と全体アーキテクチャ、buildspec.ymlとappspec.ymlの設計パターン、そしてIAMロールとVPCの最小権限設計までを解説します。Linuxサーバー運用からAWSのインフラ設計に踏み出すエンジニアの入口として読んでください。

この記事のポイント

・CodePipeline・CodeBuild・CodeDeployの3役割を正しく理解して設計する
・buildspec.ymlとappspec.ymlがCI/CDパイプラインの動作を定義するコアファイル
・ECS Blue/Greenデプロイでゼロダウンタイムリリースと即座のロールバックを実現できる
・IAM権限ミスがパイプライン停止の最大原因、最小権限設計で事前に防ぐ


「このままじゃマズい」と感じていませんか?
参考書を開く気力もない、同年代に取り残される不安——
でも安心してください。プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
姓・名・メールの3つだけ/30秒/解除は3秒 / 詳細はこちら

なぜCI/CDパイプラインが必要なのか

手作業デプロイには根本的な問題が3つあります。

属人化: デプロイ担当者が不在の間はリリースができない
手順ミス: 作業手順書のステップを抜かしてしまう
ダウンタイム: サービスを停止してデプロイする間、ユーザーが影響を受ける

CI/CDパイプラインを導入すると、コードのコミットをトリガーにビルド・テスト・デプロイが自動で走るため、これら3つの問題を一度に解消できます。Blue/Greenデプロイを組み合わせれば、本番への影響をゼロにしながら新バージョンに切り替えられます。

AWSのEC2・ECS環境でのLinux運用についてはAWSのLinux環境構築とAmazon Linux入門でまとめています。本記事では、その環境を自動的に更新・管理するCI/CDパイプラインの設計を解説します。

CodePipeline・CodeBuild・CodeDeployの役割と全体アーキテクチャ

AWSのCI/CDパイプラインは、役割が明確に分かれた3つのマネージドサービスで構成されます。

1. Sourceステージ(CodeCommit / GitHub)

コードの変更を検知してパイプラインを起動するトリガーです。AWSのマネージドGitサービスであるCodeCommitのほか、GitHubやBitbucketとのOAuth連携にも対応しています。

実務ではGitHub接続を使い、mainブランチへのマージをトリガーにパイプラインを起動するパターンが多く採用されています。

2. Buildステージ(CodeBuild)

コードのコンパイル・テスト・Dockerイメージのビルドを担当します。buildspec.ymlというYAMLファイルにビルド手順を定義します。

実行環境はAWSが管理するマネージドコンテナで、Amazon Linux 2023ベースのイメージがデフォルトです。Java・Python・Node.jsなど主要なランタイムは最初から利用できます。

3. Deployステージ(CodeDeploy)

ビルドされたアーティファクトをEC2・ECS・Lambdaに展開します。ECSと組み合わせたBlue/Greenデプロイでは、ALBのトラフィックを段階的に切り替えながらゼロダウンタイムでリリースできます。

3サービスの全体フローを整理します。

# AWS CI/CDパイプラインの全体フロー [Git Push] | v [CodePipeline] ←パイプライン全体のオーケストレーション | +--> [Sourceステージ] | GitHub / CodeCommit からコードを取得してS3に保存 | +--> [Buildステージ(CodeBuild)] | buildspec.yml に従いDocker build → ECRへイメージプッシュ | +--> [Deployステージ(CodeDeploy)] appspec.yml に従いECS Blue/GreenデプロイでALBトラフィック切り替え

CodeBuildのbuildspec.ymlを設計する

1. buildspec.ymlの基本構成

buildspec.ymlはリポジトリのルートに配置するYAMLファイルです。以下はECS向けのDocker系アプリを想定した基本構成です。

# buildspec.yml(ECS Blue/Green向け基本構成) version: 0.2 phases: pre_build: commands: - echo ECRにログイン中 - aws ecr get-login-password --region ap-northeast-1 | docker login --username AWS --password-stdin $ECR_REPOSITORY_URI - IMAGE_TAG=$(echo $CODEBUILD_RESOLVED_SOURCE_VERSION | cut -c 1-7) build: commands: - echo Dockerイメージをビルド中 - docker build -t $ECR_REPOSITORY_URI:$IMAGE_TAG . - docker tag $ECR_REPOSITORY_URI:$IMAGE_TAG $ECR_REPOSITORY_URI:latest post_build: commands: - echo ECRにプッシュ中 - docker push $ECR_REPOSITORY_URI:$IMAGE_TAG - docker push $ECR_REPOSITORY_URI:latest - printf '[{"name":"app","imageUri":"%s"}]' $ECR_REPOSITORY_URI:$IMAGE_TAG > imagedefinitions.json artifacts: files: - imagedefinitions.json

`phases` は pre_build → build → post_build の順に実行されます。post_buildで出力する `imagedefinitions.json` は後続のCodeDeployに渡すアーティファクトで、ECSタスク定義の更新に使われます。

2. 環境変数とシークレットの安全な渡し方

ECRのリポジトリURIなどの設定値はCodeBuildのプロジェクト設定で環境変数として渡します。パスワードやAPIキーはAWS Systems Manager Parameter Storeに格納し、buildspec.yml側でパラメータ参照する構成が推奨です。

# buildspec.yml でSSMパラメータを参照する例 env: variables: ECR_REPOSITORY_URI: 123456789012.dkr.ecr.ap-northeast-1.amazonaws.com/myapp parameter-store: DB_PASSWORD: /myapp/prod/db_password API_KEY: /myapp/prod/api_key # NG: buildspec.yml にシークレットを直書きしない # NG: Gitリポジトリにパスワードやトークンを混入させない

`parameter-store:` ブロックに記載されたパラメータは、CodeBuildの実行時に自動的に環境変数として展開されます。シークレットをbuildspec.ymlに直書きするのは禁止です。Gitリポジトリにパスワードやトークンが混入する事故を防いでください。

CodeDeployでBlue/Greenデプロイを設計する

1. ECS Blue/Greenデプロイの仕組み

Blue/Greenデプロイは、現行バージョン(Blue環境)と新バージョン(Green環境)を並行して起動し、ALBのトラフィックを段階的に切り替える方式です。

# ECS Blue/Greenデプロイのトラフィック切り替えフロー [デプロイ前] ALB --100%--> Blue環境(現行バージョン) [デプロイ中] ALB --10%---> Green環境(新バージョン) --90%---> Blue環境(現行バージョン) [デプロイ完了] ALB --100%--> Green環境(新バージョン) Blue環境は指定した待機時間後に終了 [問題発生時] CodeDeployコンソールから「ロールバック」を選択 → ALBのトラフィックが即座にBlue環境に戻る

問題が発生した場合はCodeDeployのコンソールから「デプロイを停止してロールバック」を選択するだけで、ALBのトラフィックが即座にBlue環境に戻ります。本番リリース前に演習環境でロールバック手順を確認しておくことを強く勧めます。

2. appspec.ymlの設計

CodeDeployの動作はappspec.ymlで定義します。ECSのBlue/Green向け基本構成は以下の通りです。

# appspec.yml(ECS Blue/Green用) version: 0.0 Resources: - TargetService: Type: AWS::ECS::Service Properties: TaskDefinition: LoadBalancerInfo: ContainerName: "app" ContainerPort: 80 Hooks: - BeforeAllowTraffic: "LambdaFunctionForPreTrafficHook" - AfterAllowTraffic: "LambdaFunctionForPostTrafficHook"

`Hooks` セクションにLambda関数を指定することで、トラフィック切り替えの前後に自動テスト(スモークテスト)を実行できます。Green環境が正常に応答することを確認してからALBのトラフィックを切り替える構成が本番では理想的です。

3. デプロイメント設定とトラフィック移行速度

CodeDeployのデプロイメント設定で、トラフィック移行の速度を制御できます。
設定名 移行パターン 推奨環境
CodeDeployDefault.ECSAllAtOnce 一括切り替え 開発・検証環境
CodeDeployDefault.ECSLinear10PercentEvery1Minutes 10%ずつ1分ごとに移行 段階的リリース(本番推奨)
CodeDeployDefault.ECSCanary10Percent5Minutes 最初10%に当て、残りは一括 カナリアリリース
本番では `ECSLinear10PercentEvery1Minutes` か `ECSCanary10Percent5Minutes` を使うことで、新バージョンの問題をトラフィック移行の途中で検知してロールバックできます。

IAMロールとVPCの最小権限設計

CI/CDパイプラインが動かない原因の大半はIAM権限の設定ミスです。必要なIAMロールは4種類あります。

CodePipelineサービスロール: S3へのアーティファクト読み書き・CodeBuildとCodeDeployへのアクション呼び出し権限
CodeBuildサービスロール: ECRへのイメージプッシュ・SSMパラメータ読み取り・CloudWatch Logsへの書き込み権限
CodeDeployサービスロール: ECSサービスの更新・ALBのターゲットグループ操作権限
ECSタスク実行ロール: ECRイメージのプル・SSMパラメータ参照権限

「権限がわからないからAdministratorAccessを付ける」は絶対に避けてください。最小権限から始めてエラーを1つずつ潰していく方が、後から権限を絞り込む作業より確実に楽です。

VPCの設計で押さえておくべき点は、CodeBuildのビルド環境をプライベートサブネット内で動かす場合、インターネット接続なしにECR・S3・Systems Managerへアクセスするためのルートを確保する必要があるという点です。

# プライベートサブネット内のCodeBuildに必要なVPCエンドポイント一覧 インターフェース型エンドポイント(ENI作成): com.amazonaws.ap-northeast-1.ecr.api # ECR API com.amazonaws.ap-northeast-1.ecr.dkr # Dockerイメージプル・プッシュ com.amazonaws.ap-northeast-1.logs # CloudWatch Logs com.amazonaws.ap-northeast-1.ssm # Systems Manager パラメータ参照 ゲートウェイ型エンドポイント(ルートテーブルに追加): com.amazonaws.ap-northeast-1.s3 # アーティファクトのS3格納

トラブルシュート|よくある設定ミスと確認手順

1. CodeBuildがECRにプッシュできない

症状: `denied: Your authorization token has expired. Reauthenticate and try again.`

原因は2つ考えられます。CodeBuildのIAMロールにECR権限が不足している場合と、pre_buildフェーズの `docker login` が失敗している場合です。まずCloudWatch Logsでビルドログを確認します。

# 直近のビルドIDを確認する $ aws codebuild list-builds-for-project --project-name myapp-build --sort-order DESCENDING --query 'ids[:3]' --output text # ビルドの詳細(フェーズの成否)を確認する $ aws codebuild batch-get-builds --ids xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx --query 'builds[0].phases[*].{phase:phaseType,status:phaseStatus}' --output table # 出力例(PRE_BUILDフェーズで失敗している場合) # +--------------+----------------+ # | phase | status | # +--------------+----------------+ # | SUBMITTED | SUCCEEDED | # | INSTALL | SUCCEEDED | # | PRE_BUILD | FAILED | # | BUILD | SKIPPED | # | POST_BUILD | SKIPPED | # +--------------+----------------+

IAMロールのポリシーに `ecr:GetAuthorizationToken`・`ecr:BatchCheckLayerAvailability`・`ecr:PutImage`・`ecr:InitiateLayerUpload`・`ecr:UploadLayerPart`・`ecr:CompleteLayerUpload` が含まれているか確認してください。

2. Blue/Greenデプロイが途中でタイムアウトする

症状: デプロイが途中で失敗し、ALBのヘルスチェックが通らない

ECSタスクが起動してもALBのヘルスチェックに失敗するケースの大半は、セキュリティグループの設定ミスです。ALBからECSタスク(コンテナポート)へのインバウンドが許可されているか確認します。

# ECSサービスの直近イベントを確認する(デプロイの失敗理由が記録されている) $ aws ecs describe-services --cluster myapp-cluster --services myapp-service --query 'services[0].events[:5]' --output table # ALBターゲットグループのヘルスチェック状態を確認する $ aws elbv2 describe-target-health --target-group-arn arn:aws:elasticloadbalancing:ap-northeast-1:123456789012:targetgroup/myapp-tg/abcdef123456 # 出力例(Unhealthyの場合) # { # "Target": { "Id": "10.0.1.23", "Port": 80 }, # "TargetHealth": { # "State": "unhealthy", # "Reason": "Target.FailedHealthChecks" # } # }

ヘルスチェックがUnhealthyになる主な原因は「ALBのSGからECSタスクのSGへのインバウンド許可が抜けている」か「アプリがヘルスチェックパスに正常応答していない」のいずれかです。

本記事のまとめ

AWSのCI/CDパイプライン設計の要点を整理します。
サービス・要素 役割 設計のポイント
CodePipeline パイプライン全体のオーケストレーション GitHubとの接続・ステージ順序の定義
CodeBuild ビルド・テスト・ECRプッシュ buildspec.yml設計・SSMでシークレット管理
CodeDeploy ECS Blue/Greenデプロイ appspec.yml・デプロイメント設定の選択
IAMロール 各サービスの権限付与 最小権限の原則・4種のロールを個別に作成
VPCエンドポイント プライベートサブネットからのAWSサービスアクセス ECR・S3・SSM・CloudWatch Logs向けを作成
CI/CDパイプラインの設計で最も多いミスは、初期構築時に権限をざっくり与えて後から絞れず、本番環境に過剰な権限が残り続けることです。最小権限から始めてエラーを見ながら追加する習慣をつけてください。

AWSでのLinux環境構築の基礎から実務レベルのインフラ設計まで体系的に学びたい方は、AWSのLinux環境構築とAmazon Linux入門も参考にしてください。

CI/CDの設定方法だけでなく、AWSを「実務の型」として身につけませんか?

buildspec.ymlの書き方はドキュメントで調べれば分かります。でも「Blue/Greenデプロイをいつ使うのか」「IAMロールをどの粒度で分けるのか」「VPCエンドポイントが必要な場面はどこか」を、自信を持って設計できますか?
現場で通用する安全なLinuxサーバー構築の「型」を体系的に身につけたい方へ、『Linuxサーバー構築入門マニュアル(図解60P)』を完全無料でプレゼントしています。

「独学の時間がもったいない」「プロから直接、現場の技術を最短で学びたい」という本気の方には、2日で実務レベルのスキルが身につく【初心者向けハンズオンセミナー】も開催しています。

無料メルマガで学習を続ける

Linuxの実践スキルをメールで毎週お届け。
登録は30秒、解除もいつでも可。

登録無料・いつでも解除できます

暗記不要・1時間後にはサーバーが動く

3,100名以上が実践した「型」を無料で公開中

プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
その「型」を図解60Pにまとめた入門マニュアルを、完全無料でプレゼントしています。

姓・名・メールの3つだけ/30秒/解除は3秒 / 詳細はこちら

Linux無料マニュアル(図解60P) 名前とメールで30秒登録
宮崎 智広

この記事を書いた人

宮崎 智広(みやざき ともひろ)

株式会社イーネットマーキュリー代表。現役のLinuxサーバー管理者として20年以上の実務経験を持ち、これまでに累計3,100名以上のエンジニアを指導してきたLinux教育のプロフェッショナル。「現場で本当に使える技術」を体系的に伝えることをモットーに、実践型のLinuxセミナーの開催や無料マニュアルの配布を通じてLinux人材の育成に取り組んでいる。

趣味は、キャンプにカメラ、トラウト釣り。好きな食べ物は、ラーメンにお酒。休肝日が作れない、酒量を減らせないのが悩み。最近、ドラマ「フライトエンジェル」を観て涙腺が崩壊しました。