My Note

自己理解のためのブログ

GitHub Actions からCodeBuildを呼び出してdocker build する

概要

以前にGitHub Actionsでビルドする内容について書きました。そこで今回はビルドの処理をGitHub ActionsからCodeBuildを呼び出して CodeBuildでビルド処理を実行します。

yhidetoshi.hatenablog.com

この記事の DockerビルドとECRへのイメージ登録の処理を "GitHub Actions" ではなく、 "CodeBuild" で実行するように変更します。

ビルドするために必要なスペックや料金、既存システムへの接続など要件によって使い分ける事になると思います。 本記事でCodeBuildで処理する内容は上記の記事にも記載していますが、 "Docker build" と "ECRへのイメージ登録" を実行します。

github-actions

利用するgithub-actionsライブラリ

├── .github
│   └── workflows
│       ├── codebuild.yaml
├── .gitignore
├── Dockerfile
├── README.md
└── buildspec.yaml
  • .github/workflows/codebuild.yaml
    • CodeBuildを実行する。( buildspec.yamlを指定して実行 )
    • AWS_ACCOUNT: githubの secretsに登録
    • IAM_ROLE_ARN: githubの secretsに登録。CodeBuildを実行するIAMロールのARNをセットする
    • CODEBUILD_PROJECT: 作成したCodeBuildのプロジェクト名をセットする
    • env-vars-for-codebuild: buildspec.yaml環境変数を渡す
name: Run CodeBuild
on:
  push:
    branches:
      - main
    paths:
      - ./**
      - .github/workflows/codebuild.yaml

env:
  REPO_NAME: product-a
  AWS_REGION: ap-northeast-1
  AWS_ACCOUNT: ${{ secrets.AWS_ACCOUNT }}
  IAM_ROLE_ARN: ${{ secrets.IAM_ROLE_CODEBUILD_ARN }}
  CODEBUILD_PROJECT: "INPUT_CODEBUILD_PROJECT"

permissions:
  id-token: write
  contents: read

jobs:
  build:
    runs-on: ubuntu-latest

    steps:
      - uses: actions/checkout@v2

      - name: Configure AWS Credentials
        uses: aws-actions/configure-aws-credentials@v1
        with:
          aws-region: ${{ env.AWS_REGION }}
          role-to-assume: ${{ env.IAM_ROLE_ARN}}
    
      - name: Run CodeBuild
        uses: aws-actions/aws-codebuild-run-build@v1
        with:
          project-name: ${{ env.CODEBUILD_PROJECT }} 
          buildspec-override: ./buildspec.yaml # path/to/buildspec.yaml
          env-vars-for-codebuild: |
            REPO_NAME,
            AWS_REGION

このCodeBuildを実行するのに必要なIAM権限は以下の通り。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "startCodebuild",
            "Effect": "Allow",
            "Action": [
                "codebuild:StartBuild",
                "codebuild:BatchGetBuilds",
                "logs:GetLogEvents"
            ],
            "Resource": "*"
        }
    ]
}
  • ./buildspec.yaml
    • docker buildして imageをECRへ登録する
    • $AWS_REGION: github-actionsのworkflowから参照
    • $REPO_NAME: github-actionsのworkflowから参照
version: 0.2

phases:
  install:
    runtime-versions:
      docker: 19
  pre_build:
    commands:
      - echo Logging in to Amazon ECR
      - aws --version
      - $(aws ecr get-login --region $AWS_REGION --no-include-email)
      - REPOSITORY_URI=`aws sts get-caller-identity --query 'Account' --output text`.dkr.ecr.$AWS_REGION.amazonaws.com/$REPO_NAME
      - COMMIT_HASH=$(echo $CODEBUILD_RESOLVED_SOURCE_VERSION | cut -c 1-7)
      - IMAGE_TAG=${COMMIT_HASH:=latest}
  build:
    commands:
      - docker build -t $REPOSITORY_URI:latest .
      - docker tag $REPOSITORY_URI:latest $REPOSITORY_URI:$IMAGE_TAG
  post_build:
    commands:
      - docker push $REPOSITORY_URI:latest
      - docker push $REPOSITORY_URI:$IMAGE_TAG
  • CodeBuildで必要になるIAM権限 (CodeBuildのBasePolicyは省略)
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "ecrPush",
            "Effect": "Allow",
            "Action": [
                "ecr:GetAuthorizationToken",
                "ecr:PutImage",
                "ecr:InitiateLayerUpload",
                "ecr:UploadLayerPart",
                "ecr:CompleteLayerUpload",
                "ecr:BatchCheckLayerAvailability"
            ],
            "Resource": "*"
        }
    ]
}
  • github-actionsの実行ログ(抜粋)

f:id:yhidetoshi:20220128153211p:plain

→ CodeBuildで実行されていますね!