🤖

GitHub Actions で Cloud Run へデプロイする

2022/05/22に公開

GitHub Actions で Cloud Run へデプロイする

概要

GitHub Actions で Cloud Run に自動デプロイする設定を行ってみました。

備忘録として参考にしたサイトと、手順を残しておきます。

https://github.com/harusame0616/cloud-run-github-actions

node.js + express で {message: 'hello world'} を返すだけのAPIサーバーをコンテナ化し、
mainにマージされるのを契機に GitHub Actions で Dockerイメージのビルドとデプロイ、Cloud Run へのデプロイを行います。

認証にJSONサービスアカウントキーを使用するのは非推奨となっているので、Workload Identityを使って認証を行っています。


GCP設定

ほぼ以下のサイトの手順通りで、Cloud Run用の設定を追加しています。

https://www.asobou.co.jp/blog/web/workload-identity

APIを有効にする

  • IAM Service Account Credentials API
  • Cloud Run Admin API
> gcloud services enable \
		iamcredentials.googleapis.com \
		run.googleapis.com

サービスアカウントを作成する

> gcloud iam service-accounts create ${SERVICE_ACCOUNT}

Workload Identity Pool を作成する

gcloud iam workload-identity-pools create "${POOL_NAME}" \
  --location="global" 

Workload Identity Provider を作成する

gcloud iam workload-identity-pools providers create-oidc "${PROVIDER_NAME}" \
  --location="global" \
  --workload-identity-pool="${POOL_NAME}" \
  --attribute-mapping="google.subject=assertion.sub,attribute.repository=assertion.repository,attribute.actor=assertion.actor,attribute.aud=assertion.aud" \
  --issuer-uri="https://token.actions.githubusercontent.com"

サービス アカウントの権限借用の設定

POOL_ID=$(gcloud iam workload-identity-pools describe "${POOL_NAME}" \
    --location="global" \
    --format="value(name)")
gcloud iam service-accounts add-iam-policy-binding "${SERVICE_ACCOUNT}@${PROJECT_ID}.iam.gserviceaccount.com" \
  --role="roles/iam.workloadIdentityUser" \
  --member="principalSet://iam.googleapis.com/${POOL_ID}/attribute.repository/${GITHUB_REPO}" 

サービスアカウントのロール設定

  • Cloud Run 管理者
  • Storage 管理者
  • サービス アカウント ユーザー
gcloud projects add-iam-policy-binding ${PROJECT_ID} \
--member="serviceAccount:${SERVICE_ACCOUNT}@${PROJECT_ID}.iam.gserviceaccount.com" \
--role="roles/run.admin"

gcloud projects add-iam-policy-binding ${PROJECT_ID} \
--member="serviceAccount:${SERVICE_ACCOUNT}@${PROJECT_ID}.iam.gserviceaccount.com" \
--role="roles/storage.admin"

gcloud projects add-iam-policy-binding ${PROJECT_ID} \
--member="serviceAccount:${SERVICE_ACCOUNT}@${PROJECT_ID}.iam.gserviceaccount.com" \
--role="roles/iam.serviceAccountUser"

GitHubの設定

GitHub-ActionsのYMLは以下をベースに作成しました。

https://github.com/google-github-actions/setup-gcloud/tree/main/example-workflows/cloud-run

on:
  push:
    branches:
      - main

name: Build and Deploy to Cloud Run
env:
  PROJECT_ID: ${{ secrets.GCP_PROJECT_ID }}
  SERVICE_NAME: hello-world

jobs:
  deploy:
    runs-on: ubuntu-latest

    permissions:
      contents: 'read'
      id-token: 'write'

    steps:
      - name: Checkout
        uses: actions/checkout@v3

      - id: 'auth'
        name: 'Authenticate to Google Cloud'
        uses: 'google-github-actions/auth@v0.4.0'
        with:
          workload_identity_provider: ${{ secrets.WORKLOAD_IDENTITY_PROVIDER }}
          service_account: github-actions@${{ secrets.GCP_PROJECT_ID }}.iam.gserviceaccount.com

      - name: Set up Cloud SDK
        uses: google-github-actions/setup-gcloud@v0

      - name: Authorize Docker push
        run: gcloud auth configure-docker

      - name: Build Docker image
        run: docker build -t asia.gcr.io/$PROJECT_ID/$SERVICE_NAME:${{ github.sha }} .

      - name: Push Docker Image
        run: docker push asia.gcr.io/$PROJECT_ID/$SERVICE_NAME:${{ github.sha }}

      - name: Deploy to Cloud Run
        run: |-
          gcloud run deploy $SERVICE_NAME \
            --project=$PROJECT_ID \
            --image=asia.gcr.io/$PROJECT_ID/$SERVICE_NAME:${{ github.sha }} \
            --region=$REGION \
            --service-account=github-actions@$PROJECT_ID.iam.gserviceaccount.com \
            --allow-unauthenticated

GitHub Actionsのシークレット設定

  • GCP_PROJECT_ID

    • GCPのプロジェクトID
  • WORKLOAD_IDENTITY_PROVIDER

    echo $(gcloud iam workload-identity-pools providers describe ${PROVIDER_NAME} --location=global --workload-identity-pool=${POOL_NAME} --format="value(name)")
    

他参考

GitHubで編集を提案

Discussion