デプロイ

このページでは、 Metrics Configuration Generator(MCG)をデプロイする方法について説明します。

ソースコードにアクセスする

MCG のソースコードは GitHub の aaos-sdv-telemetry-mcg でホストされています。 MCG は、開発とテストのためにローカルで実行することも、チームアクセス用にクラウド環境にデプロイすることもできます。

ローカルで実行する

ローカルでの開発とテストのためにソース ディレクトリから MCG を実行するには、Bazel を使用します。Bazel をインストールする必要があります。ローカルで実行する場合は、MCG_LOCALCACHE=true を設定してインメモリ キャッシュを有効にする必要があります。これにより、車両 信号カタログの保存がサポートされます。サービスをローカルでビルドして実行するには、ソース ディレクトリから次のコマンドを使用します。

# Build and run on default port 8005
MCG_LOCALCACHE=true bazel run //:mcg

# Or, to change the port, use:
MCG_LOCALCACHE=true bazel run //:mcg -- --listen :9000

Google Cloud にデプロイする

MCG コードベースには、MCG を Google Cloud Run サービスとして Google Cloud にデプロイするための Terraform ファイルと Google Cloud Build ファイルが含まれています。以降のセクションでは、変数ファイルの作成、インフラストラクチャのデプロイ、アプリケーションのビルドとデプロイ、アクセス権の付与とデプロイの確認など、デプロイ プロセスについて説明します。

Cloud Run はサーバーレス プラットフォームであるため、サーバーを 24 時間 365 日稼働させるのではなく、リクエストの処理時にのみコンテナを実行することでリソースを節約します。 つまり、リクエスト間でコンテナ インスタンスがシャットダウンすると、インメモリ データが失われます。そのため、サービス呼び出し間でカタログデータの永続ストレージを提供するには Redis が必要です。このアプローチは、チームまたは本番環境での使用に適したスケーラブルなデプロイを提供します。

前提条件

Google Cloud へのデプロイを開始する前に、次の前提条件を満たしていることを確認してください。

  • 課金が有効になっており、リソースと IAM ロールをプロビジョニングするのに十分な権限を持つ Google Cloud プロジェクト
  • Terraform(v1.0.0 以降) がインストールされている
  • Google Cloud CLI (gcloud) がインストールされ、認証されている

ファイル構造

Google Cloud へのデプロイでは、infrastructure/ サブディレクトリから Terraform コマンドを実行し、リポジトリのルートから Cloud Build コマンドを実行します。操作する主なファイルとディレクトリは次のとおりです。

repository-root/
├── cloudbuild.yaml
└── infrastructure/
    └── terraform.tfvars  <-- you create this file

Terraform 変数ファイルを作成する

infrastructure/ ディレクトリに terraform.tfvars という名前のファイルを作成して、変数 の値を variables.tf で定義し、デプロイをカスタマイズします。このファイルで project_idregion の値を定義する必要があります。他の変数はすべて省略可能です。terraform.tfvars に次の内容を追加します。

project_id        = "<var label="Google Cloud project ID">your-gcp-project-id</var>"
region            = "<var label="Google Cloud region">your-gcp-region</var>" # For example, us-central1 or europe-west1

使用可能なすべての変数とそのデフォルト値については、variables.tf をご覧ください。デフォルト値は、terraform.tfvars で設定することでオーバーライドできます。

インフラストラクチャをデプロイする

terraform.tfvars を作成したら、Terraform 構成を初期化して適用できます。このステップでは、Artifact Registry、Redis、Cloud Run など、必要なすべての Google Cloud リソースがプロビジョニングされます。完了すると、Terraform はプレースホルダ コンテナ イメージを実行する Google Cloud Run サービスを作成します。 この手順には数分かかることがあります。

# Run from the infrastructure/ directory
terraform init
terraform apply

terraform apply のプロンプトが表示されたら、プランを確認して「yes」と入力して確定します。

MCG アプリケーションをビルドしてデプロイする

インフラストラクチャがプロビジョニングされたら、次のステップとして MCG ソースコードをビルドして Google Cloud Run にデプロイします。これを行うには、ソースコードを Google Cloud Build に送信します。Google Cloud Build は Docker イメージをビルドして Artifact Registry に push し、新しいイメージを使用するように Google Cloud Run サービスを更新します。

Google Cloud Build は、COMMIT_SHA 置換変数を使用して、ビルドされたイメージにタグを付けます。バージョン番号(v1.0.0 など)またはリポジトリの commit SHA を使用できます。タグ付けは、Artifact Registry でバージョンを区別し、デプロイを管理し、必要に応じて以前のバージョンにロールバックするのに役立ちます。

次の gcloud コマンドを実行して、ビルドとデプロイをトリガーします。

# Run from the repository root
#
# The command tags the image with the Git commit SHA.
# To tag with a version number, replace '$(git rev-parse --short HEAD)' with the version number.
gcloud builds submit . \
  --config=cloudbuild.yaml \
  --substitutions=COMMIT_SHA=$(git rev-parse --short HEAD)

このコマンドは、アプリケーション コードの初期デプロイを実行します。MCG ソースコードの更新をデプロイするには、このコマンドをもう一度実行します。

アクセス権を付与してデプロイを確認する

ユーザーまたはサービス アカウントが MCG API を呼び出せるようにするには、 Cloud Run 起動元roles/run.invoker)IAM ロールを付与する必要があります。

gcloud run services add-iam-policy-binding mcg-service \
  --member=<var label="member type, e.g. user or serviceAccount">MEMBER_TYPE</var>:<var label="email address of member">EMAIL_ADDRESS</var> \
  --role=roles/run.invoker \
  --region=<var label="Google Cloud region">your-gcp-region</var>

次のコマンドを実行すると、サービス URL を取得できます。URL はデプロイ間で安定しています。

SERVICE_URL=$(gcloud run services describe mcg-service \
  --region <var label="Google Cloud region">your-gcp-region</var> \
  --format='value(status.url)')

権限を付与したら、/health エンドポイントを呼び出して、サービスが実行されていてアクセス可能であることを確認します。Google Cloud Run サービスでは認証が必要なため、エンドポイントを呼び出すときに、リクエスト ヘッダーに gcloud からの認証トークンを含める必要があります。

curl -H "Authorization: Bearer $(gcloud auth print-identity-token)" \
  $SERVICE_URL/health

サービスが実行されている場合、このコマンドは OK を返します。これで、API の呼び出しで説明されているように、任意の API エンドポイントを呼び出すことができます。