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権限ミスがパイプライン停止の最大原因、最小権限設計で事前に防ぐ
でも安心してください。プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
なぜ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
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リポジトリにパスワードやトークンを混入させない
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環境に戻る
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"
3. デプロイメント設定とトラフィック移行速度
CodeDeployのデプロイメント設定で、トラフィック移行の速度を制御できます。| 設定名 | 移行パターン | 推奨環境 |
|---|---|---|
| CodeDeployDefault.ECSAllAtOnce | 一括切り替え | 開発・検証環境 |
| CodeDeployDefault.ECSLinear10PercentEvery1Minutes | 10%ずつ1分ごとに移行 | 段階的リリース(本番推奨) |
| CodeDeployDefault.ECSCanary10Percent5Minutes | 最初10%に当て、残りは一括 | カナリアリリース |
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 | # +--------------+----------------+
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" # } # }
本記事のまとめ
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向けを作成 |
AWSでのLinux環境構築の基礎から実務レベルのインフラ設計まで体系的に学びたい方は、AWSのLinux環境構築とAmazon Linux入門も参考にしてください。
CI/CDの設定方法だけでなく、AWSを「実務の型」として身につけませんか?
buildspec.ymlの書き方はドキュメントで調べれば分かります。でも「Blue/Greenデプロイをいつ使うのか」「IAMロールをどの粒度で分けるのか」「VPCエンドポイントが必要な場面はどこか」を、自信を持って設計できますか?
現場で通用する安全なLinuxサーバー構築の「型」を体系的に身につけたい方へ、『Linuxサーバー構築入門マニュアル(図解60P)』を完全無料でプレゼントしています。
「独学の時間がもったいない」「プロから直接、現場の技術を最短で学びたい」という本気の方には、2日で実務レベルのスキルが身につく【初心者向けハンズオンセミナー】も開催しています。
3,100名以上が実践した「型」を無料で公開中
プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
その「型」を図解60Pにまとめた入門マニュアルを、完全無料でプレゼントしています。
姓・名・メールの3つだけ/30秒/解除は3秒 / 詳細はこちら
- 前のページへ:AWS Direct Connectでオンプレミスとの専用線接続を設計する方法|VPNとの違い・仮想インターフェース・冗長構成パターン
- この記事の属するカテゴリ:AWS(Amazon Linux)へ戻る

無料メルマガで学習を続ける
Linuxの実践スキルをメールで毎週お届け。
登録は30秒、解除もいつでも可。
登録無料・いつでも解除できます