AWS CodePipelineで実現するブランチ別デプロイ設定

AWS CodePipelineで実現するブランチ別デプロイ設定

Clock Icon2025.02.27

はじめに

唐突ですが、以下のような構成があったとします。

マルチアカウントデプロイ構成

AWSアカウントにまたがって、ビルドフェーズとデプロイフェーズを分離した構成になります。特殊な要件により、共通アカウントでビルドする必要がある場合などを想定しています。

この構成で、GitHub上のPUSH先のブランチ名によってデプロイ先を切り替える、というような仕組みを作ってみます。

前提

ブランチ名とデプロイ先のルールを以下の内容とします。

ブランチ名 デプロイ先
main プロダクションアカウント
deploy/stg ステージングアカウント
deploy/dev 開発アカウント

上記のブランチ名に変更がPUSHされることをトリガーにAWS CodePipelineが起動し、対応するアカウントにデプロイされるようにします。

CodePipelineのトリガーフィルター

各環境ごとにCodePipelineのトリガーフィルターを設定します。例えば、mainブランチの場合は以下のように設定します。

mainのトリガーフィルター

フィルターは複数設定できるので、残りの2つにも同様の設定を行います。最終的に、CodePipelineのトリガーは以下のようになります。

最終的なトリガーフィルターの設定内容

CodePipelineからCodeBuildにブランチ名を渡す

最初に、Sourceステージのアクションにて出力変数の名前空間を確認しておきます。デフォルトでは SourceVariables になっていますので、今回はそのまま使います。

次に、Buildステージにて環境変数を設定します。

GitHubがソースプロバイダの場合は BranchName という変数キーで出力変数にブランチ名が格納されています。その他に CommitIdRepositoryName なども取得できますので、詳しくは以下のドキュメントを参照してください。

https://docs.aws.amazon.com/ja_jp/codepipeline/latest/userguide/reference-variables.html#reference-variables-output-CodeConnections

名前空間の変数には ${名前空間.変数名} でアクセスできますので、Buildステージにおけるアクションの環境変数には以下のように設定します。

名前 タイプ
BRANCH #{SourceVariables.BranchName} プレーンテキスト

アクションの環境変数

これにより、CodeBuildでブランチ名を環境変数として受け取れるようになります。

CodeBuildのbuildspecファイル

では、実際に buildspec.yml を書いていきます。

CodePipelineにより注入された環境変数からブランチ名を取得し、 commands に分岐処理を実装してデプロイ先を切り替えます。

version: 0.2

phases:
  pre_build:
    commands:
      - echo "ブランチ名からデプロイ先を切り替えます"
      - |
        case ${BRANCH} in
          develop/dev)
            export BUCKET_NAME="dev-artifacts-bucket"
            ;;
          develop/stg)
            export BUCKET_NAME="stg-artifacts-bucket"
            ;;
          main)
            export BUCKET_NAME="prd-artifacts-bucket"
            ;;
          *)
            echo "Unknown branch: ${BRANCH}"
            exit 1
            ;;
        esac

  build:
    commands:
      - echo "ビルド処理を実行します"

  post_build:
    commands:
      - echo "成果物をデプロイ先のS3にアップロードします"
      - aws s3 cp artifact.zip "s3://${BUCKET_NAME}/artifacts/"

トリガーフィルターにてワイルドカードを使っている場合、ブランチ名によっては deploy/test のような値が渡されることがあります。そのため、 case 文で分岐処理を行う際には注意が必要です。

おわりに

CodePipelineの利点の1つは、責務を分離しつつもアクション間でシームレスに連携が取れる点にあると思います。今回は、ブランチ名によってデプロイ先を切り替えるという要件に対して、1つのCodePipelineで対応する方法を紹介しました。

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.