GitHub Actionsを使用してCI/CDを実現する

前提

  • 既にAWS上にビルドプロジェクト作成済み
  • buildspec.yml作成済み
  • slimフレームワークのPHPアプリケーション
  • CodeBuildではPHPUnitによるテストとPHP_CodeSnifferによる静的解析を行う

以下、今回のbuildspec.yml

version: '0.2'
phases:
  install:
    runtime-versions:
      php: '8.2'
    commands:
    - composer install
  build:
    commands:
    - composer run phpunit
    - composer run phpcs
artifacts:
  type: zip
  files:
    - '**/*'

AWS側でやること

OpenID Connect IDプロバイダの作成

IAMから「IDプロバイダ」の「OpenID Connect」を選択し、プロバイダのURLには https://token.actions.githubusercontent.comを入力する。対象者の入力欄には、公式のアクションである aws-actions/configure-aws-credentialsを使用するためsts.amazonaws.comを入力。

GitHub OIDC IDプロバイダロールの設定

IAMでロールを作成する。信頼されたエンティティでは「ウェブアイデンティティ」を選択し、プロバイダーとaudienceにはそれぞれ以下を選択する。

  • プロバイダ - token.actions.githubusercontent.com
  • Audience - sts.amazonaws.com

ポリシーは以下のようになった

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "Federated": "arn:aws:iam::[aws-account-id]:oidc-provider/token.actions.githubusercontent.com"
            },
            "Action": "sts:AssumeRoleWithWebIdentity",
            "Condition": {
                "StringEquals": {
                    "token.actions.githubusercontent.com:sub": "repo:takumi-pro/slim-deployment:ref:refs/heads/main",
                    "token.actions.githubusercontent.com:aud": "sts.amazonaws.com"
                }
            }
        }
    ]
}

GitHub Actions側でやること

permissionsの設定

GitHub OIDCのトークンにアクセスできるように権限を操作する。workflowのjobでpermissionsを指定してid-token: writecontents: readを追加する。

actionsの設定

aws-actions/configure-aws-credentialsをworkflowのactionに追加する。

最終的なworkflowは以下となる。

name: build
on:
  pull_request:
  push:

jobs:
  codebuild:
    runs-on: ubuntu-latest
    permissions:
      id-token: write
      contents: read
    steps:
      - name: Checkout code
        uses: actions/checkout@v2
      - name: Set up AWS credentials
        uses: aws-actions/configure-aws-credentials@v2
        with:
          role-to-assume: arn:aws:iam::656337613100:role/slim-github-oidcid
          role-session-name: slim-session
          aws-region: ap-northeast-1

参考