概要
memoirのサーバーではGAEを使用していたが、以下を考慮してCloud Runに移行したので記事にしました。
- GAE/GOだと現状 1.16までしかサポートしていないので1.18以降の機能が使用できない
- memoirのサービスのアクセス傾向だとApp EngineのよりCloud Runのような課金タイプの方が運用コストが下がりそう
PR
Cloud Runとは
コンテナを直接実行できるマネージド コンピューティング プラットフォームで、スケーリングも自動で行ってくれる。
実装
デプロイするまで
Cloud Runでは以下の2つの方法でコンテナイメージの作成が可能。
- Dockerfile を使用する
- Buildpacks を使用する
今回は単純にGoを動かすだけなので、Buildpacksを使用して実装。
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
上記のみでデプロイは出来た。
環境変数の設定
環境変数の設定は、コンソールから設定可能。
また、環境変数で機密情報を設定する場合はSecret Managerの値をマウントして使用することを推奨している。 実装方法は以下を参照。
継続的デプロイの方法
継続的なデプロイは、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
以下を参考に実装しました。
これで一通り実装完了。 来週ストアに公開して、どのくらい運用コストが変わるか検証予定。