wheatandcatの開発ブログ

React Nativeで開発しているペペロミア & memoirの技術系記事を投稿してます

GAE→Cloud Runに移行

概要

memoirのサーバーではGAEを使用していたが、以下を考慮してCloud Runに移行したので記事にしました。

  • GAE/GOだと現状 1.16までしかサポートしていないので1.18以降の機能が使用できない
  • memoirのサービスのアクセス傾向だとApp EngineのよりCloud Runのような課金タイプの方が運用コストが下がりそう

PR

github.com

Cloud Runとは

cloud.google.com

コンテナを直接実行できるマネージド コンピューティング プラットフォームで、スケーリングも自動で行ってくれる。

実装

デプロイするまで

Cloud Runでは以下の2つの方法でコンテナイメージの作成が可能。

  • Dockerfile を使用する
  • Buildpacks を使用する

今回は単純にGoを動かすだけなので、Buildpacksを使用して実装。

buildpacks.io

Buildpacksは、ソースコードから読み取りベストプラクティスに則ってDockerfileを書かずにイメージを生成してくれるツールで、現状だと以下のプラットフォームで対応している。

  • Go
  • Node.js
  • Python
  • Java
  • .NET Core

以下のコマンドを実行してイメージを作成

$ gcloud builds submit --pack image=IMAGE_URL

上記で、GCPのArtifact Registryにイメージが作成されるので、以下のコマンドでCloud Runにデプロイ。

$ gcloud run deploy $SERVICE_NAME \
          --project=$PROJECT_ID \
          --image=$IMAGE_URL \
          --region=$REGION

上記のみでデプロイは出来た。

環境変数の設定

cloud.google.com

環境変数の設定は、コンソールから設定可能。

また、環境変数で機密情報を設定する場合はSecret Managerの値をマウントして使用することを推奨している。 実装方法は以下を参照。

cloud.google.com

継続的デプロイの方法

継続的なデプロイは、GitHub Actionsを使用して実装。 最終的に以下のコードで自動化できた。

.github/workflows/deploy_review.yml

name: Deploy Review

on:
  push:
    branches:
      - main
env:
  SERVICE_ACCOUNT_JSON: ${{ secrets.REVIEW_SERVICE_ACCOUNT_JSON }}
  GCP_SERVICE_ACCOUNT_JSON: ${{ secrets.REVIEW_GCP_SERVICE_ACCOUNT_JSON }}
  PROJECT_ID:  ${{ secrets.REVIEW_GCP_PROJECT_ID }}
  SERVICE_NAME:  ${{ secrets.REVIEW_SERVICE_NAME }}
  REGION:  ${{ secrets.REGION }}
jobs:
  deploy:
    runs-on: ubuntu-latest
    permissions:
      contents: read
      id-token: write
    steps:
    - uses: 'actions/checkout@v3'

    - name: Create serviceAccount.json file
      run: echo $SERVICE_ACCOUNT_JSON | base64 --decode -i > ./serviceAccount.json
    - name: Create gcpServiceAccount.json file
      run: echo $GCP_SERVICE_ACCOUNT_JSON | base64 --decode -i > ./gcpServiceAccount.json

    - id: 'auth'
      name: 'Authenticate to Google Cloud'
      uses: 'google-github-actions/auth@v0.4.0'
      with:
        workload_identity_provider: ${{ secrets.REVIEW_WORKLOAD_IDENTITY_PROVIDER }}
        service_account: github-actions@${{ secrets.REVIEW_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 Submit
      run: |-
        gcloud builds submit --pack image=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

以下を参考に実装しました。

zenn.dev

これで一通り実装完了。 来週ストアに公開して、どのくらい運用コストが変わるか検証予定。