
CodePipelineの全体像
CodePipelineの基本構成
CodePipelineは、CI/CDプロセスを自動化するフルマネージドサービスです。複数のステージで構成され、各ステージには複数のアクションを設定できます。
主要なAWSサービス連携
- CodeCommit: Gitリポジトリ
- CodeBuild: ビルドとテスト
- CodeDeploy: デプロイ自動化
- S3: アーティファクト保存
- CloudFormation: インフラ管理
パイプラインの基本フロー
| ステージ | 内容 |
|---|---|
| Source ステージ | CodeCommit/GitHub/S3からソースコード取得 パイプラインの自動トリガー |
| Build ステージ | CodeBuildでビルド実行 単体テスト実行 静的コード解析 アーティファクト生成(S3保存) |
| Test ステージ | 統合テスト実行 セキュリティスキャン |
| Deploy ステージ - 開発環境 | CodeDeployで開発環境へデプロイ スモークテスト実行 |
| Deploy ステージ - ステージング環境 | ステージング環境へデプロイ E2Eテスト実行 |
| Deploy ステージ - 本番環境 | 手動承認(Manual Approval) CodeDeployで本番環境へデプロイ デプロイ後の監視 |
環境の分離
開発環境(Development)
- 開発者の動作確認用
- 頻繁にデプロイ
ステージング環境(Staging)
- 本番環境と同等の構成
- 本番デプロイ前の最終検証
本番環境(Production)
- エンドユーザー向け
- 承認プロセス後にデプロイ
ソースコード管理(CodeCommit)
CodeCommitの特徴
- AWSネイティブのGitリポジトリ
- IAMによる細かいアクセス制御
- 暗号化とバックアップ自動化
- プルリクエストとコードレビュー機能
ビルドとテスト(CodeBuild)
buildspec.ymlの基本構造
version: 0.2
phases:
install:
runtime-versions:
nodejs: 18
commands:
- npm install
pre_build:
commands:
- npm run lint # 静的解析
- npm test # 単体テスト
build:
commands:
- npm run build
post_build:
commands:
- aws s3 cp dist/ s3://my-bucket/ --recursive
artifacts:
files:
- '**/*'
base-directory: dist
cache:
paths:
- 'node_modules/**/*' # 依存関係をキャッシュして高速化
CodeBuildの主要機能
- マネージド型ビルド環境(Linux、Windows)
- 並列ビルドでスループット向上
- キャッシュによる高速化
- CloudWatch Logsでログ管理
テストの実行タイミング
- 単体テスト: CodeBuildのpre_buildフェーズ
- 統合テスト: 専用のTestステージ
- E2Eテスト: ステージング環境デプロイ後
セキュリティ
Secrets Manager統合
env:
secrets-manager:
DB_PASSWORD: prod/myapp:password
API_KEY: prod/myapp:apikey
セキュリティスキャン
- 依存パッケージの脆弱性検査(npm audit)
- コンテナイメージスキャン(ECR Image Scanning)
- CodeGuru Reviewerによる自動コードレビュー
デプロイ(CodeDeploy)
ローリングデプロイメント
既存インスタンスを段階的に新バージョンへ置き換える方式。リソース効率は良いが、デプロイ中に新旧バージョンが混在し、完了まで時間がかかる。ロールバックには再度ローリング更新が必要
DeploymentGroup:
Type: AWS::CodeDeploy::DeploymentGroup
Properties:
ApplicationName: my-app
# デプロイスタイルの指定(ここでローリングを選択)
DeploymentStyle:
DeploymentType: IN_PLACE # IN_PLACE(ローリング) or BLUE_GREEN
DeploymentOption: WITH_TRAFFIC_CONTROL # トラフィック制御あり(ELB使用時)
# または
# DeploymentOption: WITHOUT_TRAFFIC_CONTROL # トラフィック制御なし
# デプロイ設定(更新台数・速度の制御)
DeploymentConfigName: CodeDeployDefault.OneAtATime
# 選択肢:
# - CodeDeployDefault.OneAtATime # 1台ずつ順次更新
# - CodeDeployDefault.HalfAtATime # 半数ずつ更新
# - CodeDeployDefault.AllAtOnce # 全台同時更新
# - カスタム設定名 # 独自のデプロイ設定
# ロードバランサー設定(トラフィック制御する場合)
LoadBalancerInfo:
TargetGroupInfoList:
- Name: my-target-group
# Auto Scalingグループの指定
AutoScalingGroups:
- my-auto-scaling-group
# ロールバック設定(オプション)
AutoRollbackConfiguration:
Enabled: true
Events:
- DEPLOYMENT_FAILURE # デプロイ失敗時
- DEPLOYMENT_STOP_ON_ALARM # CloudWatchアラーム発生時
ブルーグリーンデプロイメント
本番環境(Blue)と同じ構成の新環境(Green)を用意し、トラフィックを瞬時に切り替える方式。ダウンタイムゼロで即座のロールバックが可能だが、2倍のリソースが必要。ECS、Lambda、EC2/Auto Scalingで利用可能
- メリット: 即座にロールバック可能、ダウンタイムゼロ
- デメリット: 2倍のリソースが必要
- 適用: ECS、Lambda、EC2/Auto Scaling
DeploymentGroup:
Type: AWS::CodeDeploy::DeploymentGroup
Properties:
ApplicationName: my-app
# デプロイスタイルの指定(ここでブルーグリーンを選択)
DeploymentStyle:
DeploymentType: BLUE_GREEN # IN_PLACE(ローリング) or BLUE_GREEN
DeploymentOption: WITH_TRAFFIC_CONTROL # トラフィック制御あり
# ブルーグリーン固有の設定
BlueGreenDeploymentConfiguration:
# トラフィック切り替えのタイミング
DeploymentReadyOption:
ActionOnTimeout: CONTINUE_DEPLOYMENT # 自動で続行
WaitTimeInMinutes: 0 # 待機時間(手動承認の場合は設定)
# 旧環境(Blue)の終了設定
TerminateBlueInstancesOnDeploymentSuccess:
Action: TERMINATE # 終了する
TerminationWaitTimeInMinutes: 5 # 5分後に終了
# Green環境のプロビジョニング
GreenFleetProvisioningOption:
Action: COPY_AUTO_SCALING_GROUP # Auto Scalingグループをコピー
# トラフィック切り替え方法(オプション)
LoadBalancerInfo:
TargetGroupInfoList:
- Name: my-target-group
カナリアデプロイメント
一部のトラフィック(例:10%)を新バージョンに流し、問題なければ段階的に100%へ展開する方式。リスクを最小化し問題の早期発見が可能だが、複雑な監視とトラフィック制御が必要。
DeploymentGroup:
Type: AWS::CodeDeploy::DeploymentGroup
Properties:
ApplicationName: my-app
DeploymentStyle:
DeploymentType: BLUE_GREEN
DeploymentOption: WITH_TRAFFIC_CONTROL
BlueGreenDeploymentConfiguration:
# トラフィックルーティング設定(カナリアの核心部分)
TrafficRoutingConfig:
Type: TimeBasedCanary
TimeBasedCanary:
CanaryPercentage: 10 # 最初に流す割合(10%)
CanaryInterval: 5 # 監視時間(5分)
# または
# Type: TimeBasedLinear
# TimeBasedLinear:
# LinearPercentage: 10 # 増加割合(10%)
# LinearInterval: 1 # 増加間隔(1分)
DeploymentReadyOption:
ActionOnTimeout: CONTINUE_DEPLOYMENT
TerminateBlueInstancesOnDeploymentSuccess:
Action: TERMINATE
TerminationWaitTimeInMinutes: 5
# アラーム設定(推奨)
AlarmConfiguration:
Enabled: true
Alarms:
- Name: !Ref ErrorRateAlarm
# 自動ロールバック(推奨)
AutoRollbackConfiguration:
Enabled: true
Events:
- DEPLOYMENT_STOP_ON_ALARM
アーティファクト管理
S3バケットでの保存
バージョニング有効化
- 過去のアーティファクトを保持
- ロールバック時に使用
暗号化設定
- SSE-S3: S3マネージド暗号化キー
- SSE-KMS: AWS KMSによる暗号化キー管理
- バケットポリシーでアクセス制御
ライフサイクルポリシー
- 古いアーティファクトの自動削除
- ストレージコスト削減
- 例: 30日経過後に削除
S3バケット設定例
ArtifactBucket:
Type: AWS::S3::Bucket
Properties:
VersioningConfiguration:
Status: Enabled
BucketEncryption:
ServerSideEncryptionConfiguration:
- ServerSideEncryptionByDefault:
SSEAlgorithm: AES256
LifecycleConfiguration:
Rules:
- Id: DeleteOldArtifacts
Status: Enabled
ExpirationInDays: 30
ステージ間の受け渡し
OutputArtifacts
- ステージが生成した成果物を次のステージへ渡す
- S3に自動保存される
- 例: SourceOutput, BuildOutput
InputArtifacts
- 前のステージから成果物を受け取る
- ビルドやデプロイに使用
- 複数のアーティファクトを入力可能
ステージ間のアーティファクト受け渡し例
Stages:
- Name: Source
Actions:
- Name: SourceAction
OutputArtifacts:
- Name: SourceOutput # ソースコードを出力
- Name: Build
Actions:
- Name: BuildAction
InputArtifacts:
- Name: SourceOutput # ソースコードを入力
OutputArtifacts:
- Name: BuildOutput # ビルド成果物を出力
- Name: Deploy
Actions:
- Name: DeployAction
InputArtifacts:
- Name: BuildOutput # ビルド成果物を入力
推奨される命名パターン
- SourceOutput: ソースコード取得ステージの出力
- BuildOutput: ビルドステージの出力
- TestResults: テスト結果
- InfrastructureTemplate: CloudFormationテンプレート
Infrastructure as Code(CloudFormation)
CloudFormationとの統合
パイプラインでインフラも管理します。
# パイプラインのDeployステージ
- Name: DeployInfrastructure
Actions:
- Name: CreateUpdateStack
ActionTypeId:
Category: Deploy
Owner: AWS
Provider: CloudFormation
Version: 1
Configuration:
ActionMode: CREATE_UPDATE
StackName: my-app-stack
TemplatePath: BuildArtifact::template.yml
Capabilities: CAPABILITY_IAM
Change Setsの活用
変更内容を事前確認してから適用します。
- Name: CreateChangeSet
Configuration:
ActionMode: CHANGE_SET_REPLACE
ChangeSetName: my-changeset
- Name: ExecuteChangeSet
Configuration:
ActionMode: CHANGE_SET_EXECUTE
手動承認
Manual Approvalアクション
本番デプロイ前に承認を要求します。
- Name: ApprovalStage
Actions:
- Name: ManualApproval
ActionTypeId:
Category: Approval
Owner: AWS
Provider: Manual
Version: 1
Configuration:
CustomData: "本番環境へのデプロイを承認してください"
NotificationArn: !Ref ApprovalSNSTopic
監視とロールバック
CloudWatch統合
- パイプライン実行状態のメトリクス
- ステージ失敗時のアラーム
- EventBridgeでカスタムアクション
自動ロールバック設定
# CodeDeploy設定
AutoRollbackConfiguration:
Enabled: true
Events:
- DEPLOYMENT_FAILURE
- DEPLOYMENT_STOP_ON_ALARM
Alarms:
- AlarmName: HighErrorRate
パイプライン構成例(総合)
基本的なCloudFormationテンプレート
Resources:
# アーティファクト保存用S3
ArtifactBucket:
Type: AWS::S3::Bucket
Properties:
VersioningConfiguration:
Status: Enabled
# CodePipeline
Pipeline:
Type: AWS::CodePipeline::Pipeline
Properties:
RoleArn: !GetAtt PipelineRole.Arn
ArtifactStore:
Type: S3
Location: !Ref ArtifactBucket
Stages:
# Sourceステージ
- Name: Source
Actions:
- Name: SourceAction
ActionTypeId:
Category: Source
Owner: AWS
Provider: CodeCommit
Version: 1
Configuration:
RepositoryName: my-repo
BranchName: main
OutputArtifacts:
- Name: SourceOutput
# Buildステージ
- Name: Build
Actions:
- Name: BuildAction
ActionTypeId:
Category: Build
Owner: AWS
Provider: CodeBuild
Version: 1
Configuration:
ProjectName: !Ref BuildProject
InputArtifacts:
- Name: SourceOutput
OutputArtifacts:
- Name: BuildOutput
# Deploy(開発環境)
- Name: DeployToDev
Actions:
- Name: DeployAction
ActionTypeId:
Category: Deploy
Owner: AWS
Provider: CodeDeploy
Version: 1
Configuration:
ApplicationName: my-app
DeploymentGroupName: dev-group
InputArtifacts:
- Name: BuildOutput
# 承認
- Name: ApproveProduction
Actions:
- Name: ManualApproval
ActionTypeId:
Category: Approval
Owner: AWS
Provider: Manual
Version: 1
# Deploy(本番環境)
- Name: DeployToProduction
Actions:
- Name: DeployAction
ActionTypeId:
Category: Deploy
Owner: AWS
Provider: CodeDeploy
Version: 1
Configuration:
ApplicationName: my-app
DeploymentGroupName: prod-group
InputArtifacts:
- Name: BuildOutput