CodePipelineの基礎

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