このページでは、 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_id と region の値を定義する必要があります。他の変数はすべて省略可能です。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 エンドポイントを呼び出すことができます。