📌

【CodePipeline】既存のCodeBuildをCodePipelineに連携

に公開

本記事の伝えたいこと

Git→CodePipeline→CodeBuildを連携する際に躓いたことを記載する。
記事を書いた時点は、CICDの実務経験0
Code系のサービスも今回の自主学習で初めて触る。

  • CodePipelineのIAMポリシー
  • 既にGitーCodeBuild間で連携していた際に必要となるCodeBuildの設定変更(CodeBuildのソースプロバイダーの設定変更)

やりたいこと(ゴール)

GitのmainリポジトリにtfファイルがPUSHした際、自動でCodeBuildの実行(Terraform Apply)する。
元々GitにtfファイルをPUSH後、CodeBuildをTerraformを手動実行していた

変更前の構成

Github→CodeBuild(手動実行)

変更後の構成

Github→CodePipeline(トリガーはmainリポジトリ)→CodeBuild(PipeLineによる自動実行)
※CodeBuildは変更前のリソースを使用(新規に作るのが手間なため)

前提

  • CodeBuildは作成済み ※私用アカウントのためplan→auto-approve→applyを一気に実行するビルドプロジェクトとなる
  • Gitにtfファイル、buildspec.ymlは格納済み

CodePipelineの構築

事前準備

CodePipeline用のIAMロールの作成

以下のポリシーをCodePipeline用ロールにアタッチ
※自分のアカウントで動かすため、権限は緩めで設定

  • AWSCodePipeline_FullAccess(arn:aws:iam::aws:policy/AWSCodePipeline_FullAccess)
  • Git連携用権限(codestar-connections)、CodeBuild連携用権限(codebuild)、S3アーティファクトストアへの書き込み権限 ★躓いたポイント後述に記載★
    {
    "Statement": [
        {
            "Action": [
                "codestar-connections:UseConnection",
                "s3:PutObject",
                "codebuild:StartBuild",
                "codebuild:BatchGetBuilds"
            ],
            "Effect": "Allow",
            "Resource": [
                "*"
            ]
        }
    ],
    "Version": "2012-10-17"
}

GitHub接続用のCodeStarConnectionsの作成

  1. 任意の接続名を入力し、Githubに接続を押下

  2. 新しいアプリをインストールするを押下 ※キャプチャ取得漏れ

  3. 連携先のGitアカウント、リポジトリを選択

  4. GithubのOTPを入力 ※Githubで設定していた場合

CodePipeline構築

  1. 今回は自前のCodeBuildを呼び出したいため、作成オプションは「カスタムパイプラインを構築する」を選択。DeploymentにAWS への Terraform のデプロイがあった時間あるときに検証する。

  2. 任意のPipeLine名入力。サービスロールはCodePipeline用のIAMロールで作成したものを使用。

  3. ソースステージはtfファイルが格納されたGitを選択するため、「接続」は上記で作成したCodeStarConnectionsを選択する。Gitはmainブランチしかないため、「デフォルトブランチ」とする。

  4. 「その他のビルドプロバイダー」はCodeBuildを選択し、プロジェクト名は事前に作成していたCodeBuildを選択。

  5. テスト、デプロイステージは使用しないので省略し、CodePipelineの構築完了

構築完了したけど…?

躓いたポイント1

  • CodePipeline構築後、CodePipeLine→CodeBuildが実行されが中々CodePipeline(ソースの実行)が終わらない…
    →CloudTrailを見た結果、こちらのポリシーが不足したため、ロールに追加。
    →CodePipeLineからCodeBuildを実行するまでは完了!

躓いたポイント2

  • GitHubに新しくtfファイルをPUSHしたが、terraform applyされない…。
    →CodePipelineとCodeBuildそれぞれのGithubのコミットIDが違う
    →CodeBuild側が古い(最後手動でビルドした際の)コミットIDとなっていた
    →CodeBuildがCodePipelineのコミットIDが受け取れていないのが原因と判明

    の赤枠箇所
    ※画面キャプチャ取得漏れのため、CodeBuildのソースプロバイダー修正後の画面

  • 早速コンソール画面でCodeBuildのソースプロバイダーのをGithubからCodePipelineに変更しようとしたが…選択肢にない……。

  • コンソール画面の仕様か不明だが、コンソール画面で変更できないため、ローカル端末から以下CLIコマンドでソースプロバイダーをGitHubからCodePipelineに変更

aws codebuild update-project --region <ビルドプロジェクトがあるリージョン> --name <ビルドプロジェクト名> --source type=**CODEPIPELINE** --artifacts type=**CODEPIPELINE**

CICDの構築完了!

これでGithubのmainにPUSHさえすれば、自動でterraform -applyするCICDもどきの構築完了。
実務未経験ですが、CICDっぽいものが作れました。

Discussion