☁️

GCP Cloud RunにデプロイしたアプリのCI/CD施策

に公開

1. はじめに

社内用に作成したSlackBotのアプリケーションに、CI/CD施策を行うことになったので、記録として記事に残します。

2. 前提

  • ソースコードがGithubに登録されている。
  • GCPのCloud Runにデプロイ済み。
  • Dockerを使用し、コンテナはappコンテナのみ

3. 目標

  • Github上でmainブランチに対するマージが行われた際に、Google RunにデプロイしたDockerコンテナに対して再ビルドが掛かるようにしたい。

4. 使用するサービス

4.1. Cloud Build

Google Cloud が提供するCI/CDのサービスです。ソースコードのビルド・テスト・デプロイを行うパイプラインをクラウド上で実行することが出来ます。

4.2. Artifact Registry

Goolge Cloud が提供するソフトウェアアーティファクトの保存・管理サービスです。今回はCloud Buildでで作成したDockerコンテナの保存先として使用します。

4.3. Cloud Run

Google Cloud が提供するコンテナ実行のためのサーバーレスサービスです。ここににビルドされたDockerコンテナを配置します。

4.4. Secret Manager

Google Cloud が提供するAPIやパスワードなどの機密情報を保存・管理・取得できるサービスです。Dockerコンテナをビルドする際に設定する環境変数などをここに保存し、ビルド時はここから値を取得して環境変数として使用します。

5. イメージ図

6. 実際の手順

6.1. Google Cloud SDKのインストール

Google Cloud SDK が未インストールの場合は以下のURLからダウンロードしてセットアップを行ってください。

https://cloud.google.com/sdk/docs/install?hl=ja

6.2. Google Cloud SDKの初期設定

Google Cloud SDKのインストール後に以下のコマンドを叩いて初期設定を行います。

gcloud init

コマンドを叩くと対話形式で初期設定を行うので、プロジェクトIDやデフォルトリージョン等の設定を任意で行ってください。

6.2. 使用するサービスの有効化

  • Cloud Build
  • Artifact Registry
  • Cloud Run
  • Secret Manager

上記のサービスを有効化するために以下のコマンドを叩きます。

gcloud services enable \
  cloudbuild.googleapis.com \
  artifactregistry.googleapis.com \
  run.googleapis.com \
  secretmanager.googleapis.com

6.3. Cloud Buildの設定

6.3.1. Githubリポジトリとの連携

Cloud Buildの管理画面を開いてください。

次に「トリガー」を選択し、

「リポジトリを接続」を押下してください。

すると以下のようにリポジトリの設定画面が表示されるので、接続したいGithubのリポジトリを入力してください。

6.3.2. トリガーの作成

Githubリポジトリとの連携が完了したら、次に画面の「トリガーを選択」を押下してください。
以下のような入力フォームが表示されるので、以下を参考に入力してください。


6.4. Artifact RegistryにDockerイメージ用のリポジトリを作成

以下のコマンドを実行し、RegistryにDockerイメージ用のリポジトリを作成します。

gcloud artifacts repositories create app-name \
  --repository-format=docker \
  --location=asia-northeast1 \
  --description="docker repo"

app-namedocker repoの所は任意の値を設定してください。

6.5 Secret Managerに環境変数を登録する

Dockerコンテナビルド時に引数で指定する環境変数がある場合は、Secret Managerから値を取得するようにします。これによりアプリの資材に秘匿情報が混入してしまうのを防ぎます。

以下のコマンドを実行し、SecretMangerに環境変数を登録してください。

echo -n "api-secret-key" | \
  gcloud secrets create api-secret-key-name --data-file=-

api-secret-keyに環境変数の実際の値を、api-secret-key-nameに登録名を任意に設定してください。

環境変数が複数ある場合は、その分だけコマンドを実行してください。

6.6. cloudbuild.yamlの作成

アプリのソースコード直下に以下のようなcloudbuild.yamlを作成してください。cloudbuild.yamlはCloud Buildで使用されるビルド手順の定義ファイルです。YAML形式で記述し、どんな手順でアプリをビルド・テスト・デプロイするかを記載します。今回はテストは省いて記載しております。

steps:
 # # Dockerコンテナのビルド
  - name: 'gcr.io/cloud-builders/docker'
    args: [
      'build', '-t',
      'asia-northeast1-docker.pkg.dev/$PROJECT_ID/{{ app-name}}/my-app', '.'
    ]
  # ビルドしたDockerコンテナをArtifact Registryにプッシュ
  - name: 'gcr.io/cloud-builders/docker'
    args: [
      'push', 'asia-northeast1-docker.pkg.dev/$PROJECT_ID/{{ app-name}}/my-app'
    ]
 # Cloud Runにデプロイ
  - name: 'gcr.io/google.com/cloudsdktool/cloud-sdk'
    entrypoint: 'gcloud'
    args: [
      'run', 'deploy', 'my-app',
      '--image', 'asia-northeast1-docker.pkg.dev/$PROJECT_ID/{{ app-name}}/my-app',
      '--region', 'asia-northeast1',
      '--platform', 'managed',
      '--allow-unauthenticated',
      '--update-secrets', 'API-SECRET-KEY=api-secret-key-name:latest'
    ]

images:
  - 'asia-northeast1-docker.pkg.dev/$PROJECT_ID/{{ app-name}}/my-app'

options:
  logging: CLOUD_LOGGING_ONLY

{{ app-name}}には任意のアプリケーション名を入力してください。

またSecret Managerから環境変数を取得する際は、以下のように登録名:latestの形式で記載することによって取得することができます。

'--update-secrets', 'API-SECRET-KEY=api-secret-key-name:latest'

以上で手順は終了になります。実際にビルドが自動で行われるか確認するために、githubで対象のブランチにマージを行ってみてください。

終わりに

今回はGCPのCloud Runで稼働するアプリケーションのCI/CD施策を行った際の手順を記録として書かせていただきました。わかりづらい点や、設定不足な点も多々あると思います。何か気になった点がある場合は優しく(?)コメントで質問していただければ幸いです。

Discussion