このチュートリアルでは、未認証の Cloud Run サービスへ Cloud Audit Logs を使用して Cloud Storage から Eventarc を使用してイベントを転送するときに発生するランタイム エラーのトラブルシューティング方法について説明します。
目標
このチュートリアルでは、次のタスクを行う方法を説明します。
- コンテナ イメージを保存する Artifact Registry 標準リポジトリを作成する。
- イベントソースとなる Cloud Storage バケットを作成する。
- コンテナ イメージをビルドしてアップロードし、Cloud Run にデプロイする。
- Eventarc トリガーを作成する。
- ファイルを Cloud Storage バケットにアップロードする。
- ランタイム エラーのトラブルシューティングと修正を行う。
費用
このドキュメントでは、課金対象である次の Google Cloudコンポーネントを使用します。
料金計算ツールを使うと、予想使用量に基づいて費用の見積もりを生成できます。
始める前に
組織で定義されているセキュリティの制約により、次の手順を完了できない場合があります。トラブルシューティング情報については、制約のある Google Cloud 環境でアプリケーションを開発するをご覧ください。
- Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
-
Install the Google Cloud CLI.
-
外部 ID プロバイダ(IdP)を使用している場合は、まず連携 ID を使用して gcloud CLI にログインする必要があります。
-
gcloud CLI を初期化するには、次のコマンドを実行します。
gcloud init
-
Create or select a Google Cloud project.
Roles required to select or create a project
- Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
-
Create a project: To create a project, you need the Project Creator
(
roles/resourcemanager.projectCreator
), which contains theresourcemanager.projects.create
permission. Learn how to grant roles.
-
Create a Google Cloud project:
gcloud projects create PROJECT_ID
Replace
PROJECT_ID
with a name for the Google Cloud project you are creating. -
Select the Google Cloud project that you created:
gcloud config set project PROJECT_ID
Replace
PROJECT_ID
with your Google Cloud project name.
-
Verify that billing is enabled for your Google Cloud project.
-
Enable the Artifact Registry, Cloud Build, Cloud Logging, Cloud Run, Cloud Storage, Eventarc, and Pub/Sub APIs:
Roles required to enable APIs
To enable APIs, you need the Service Usage Admin IAM role (
roles/serviceusage.serviceUsageAdmin
), which contains theserviceusage.services.enable
permission. Learn how to grant roles.gcloud services enable artifactregistry.googleapis.com
cloudbuild.googleapis.com eventarc.googleapis.com logging.googleapis.com pubsub.googleapis.com run.googleapis.com storage.googleapis.com -
Install the Google Cloud CLI.
-
外部 ID プロバイダ(IdP)を使用している場合は、まず連携 ID を使用して gcloud CLI にログインする必要があります。
-
gcloud CLI を初期化するには、次のコマンドを実行します。
gcloud init
-
Create or select a Google Cloud project.
Roles required to select or create a project
- Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
-
Create a project: To create a project, you need the Project Creator
(
roles/resourcemanager.projectCreator
), which contains theresourcemanager.projects.create
permission. Learn how to grant roles.
-
Create a Google Cloud project:
gcloud projects create PROJECT_ID
Replace
PROJECT_ID
with a name for the Google Cloud project you are creating. -
Select the Google Cloud project that you created:
gcloud config set project PROJECT_ID
Replace
PROJECT_ID
with your Google Cloud project name.
-
Verify that billing is enabled for your Google Cloud project.
-
Enable the Artifact Registry, Cloud Build, Cloud Logging, Cloud Run, Cloud Storage, Eventarc, and Pub/Sub APIs:
Roles required to enable APIs
To enable APIs, you need the Service Usage Admin IAM role (
roles/serviceusage.serviceUsageAdmin
), which contains theserviceusage.services.enable
permission. Learn how to grant roles.gcloud services enable artifactregistry.googleapis.com
cloudbuild.googleapis.com eventarc.googleapis.com logging.googleapis.com pubsub.googleapis.com run.googleapis.com storage.googleapis.com -
プロジェクト作成者には、基本オーナーロール(
roles/owner
)が付与されます。デフォルトでは、この Identity and Access Management(IAM)ロールには、ほとんどの Google Cloudリソースへのフルアクセスに必要な権限が含まれており、この手順は省略できます。プロジェクト作成者でない場合は、プロジェクトで適切なプリンシパルに必要な権限を付与する必要があります。プリンシパルは Google アカウント(エンドユーザーの場合)やサービス アカウント(アプリケーションとコンピューティング ワークロードの場合)になることもあります。詳細については、イベントの宛先のロールと権限のページをご覧ください。
デフォルトでは、Cloud Build の権限には、Artifact Registry アーティファクトをアップロードおよびダウンロードするための権限が含まれています。
必要な権限
このチュートリアルを完了するために必要な権限を取得するには、プロジェクトに対する次の IAM ロールを付与するよう管理者に依頼してください。
-
Cloud Build 編集者(
roles/cloudbuild.builds.editor
) -
Cloud Run 管理者(
roles/run.admin
) -
Eventarc 管理者(
roles/eventarc.admin
) -
ログ表示アクセス者(
roles/logging.viewAccessor
) -
プロジェクト IAM 管理者(
roles/resourcemanager.projectIamAdmin
) -
サービス アカウント管理者(
roles/iam.serviceAccountAdmin
) -
サービス アカウント ユーザー(
roles/iam.serviceAccountUser
) -
Service Usage 管理者(
roles/serviceusage.serviceUsageAdmin
) -
ストレージ管理者(
roles/storage.admin
)
ロールの付与については、プロジェクト、フォルダ、組織へのアクセス権の管理をご覧ください。
-
Cloud Build 編集者(
- Cloud Storage 向けには、
ADMIN_READ
、DATA_WRITE
、DATA_READ
のデータアクセス タイプの監査ロギングを有効にします。- Google Cloud プロジェクト、フォルダ、または組織に関連付けられた Identity and Access Management(IAM)ポリシーを読み取り、一時ファイルに保存します。
gcloud projects get-iam-policy PROJECT_ID > /tmp/policy.yaml
- テキスト エディタで
/tmp/policy.yaml
を開き、auditConfigs
セクションで監査ログの構成のみを追加または変更します。auditConfigs: - auditLogConfigs: - logType: ADMIN_READ - logType: DATA_WRITE - logType: DATA_READ service: storage.googleapis.com bindings: - members: [...] etag: BwW_bHKTV5U= version: 1
- 新しい IAM ポリシーを作成します。
gcloud projects set-iam-policy PROJECT_ID /tmp/policy.yaml
上記のコマンドで別の変更との競合が報告された場合は、IAM ポリシーの読み取りからやり直してください。詳細については、API でデータアクセス監査ログを構成するをご覧ください。
- Google Cloud プロジェクト、フォルダ、または組織に関連付けられた Identity and Access Management(IAM)ポリシーを読み取り、一時ファイルに保存します。
- Compute Engine サービス アカウントに
eventarc.eventReceiver
ロールを付与します。export PROJECT_NUMBER="$(gcloud projects describe $(gcloud config get-value project) --format='value(projectNumber)')" gcloud projects add-iam-policy-binding $(gcloud config get-value project) \ --member=serviceAccount:${PROJECT_NUMBER}-compute@developer.gserviceaccount.com \ --role='roles/eventarc.eventReceiver'
- 2021 年 4 月 8 日以前に Pub/Sub サービス アカウントを有効にした場合は、Pub/Sub サービス アカウントに
iam.serviceAccountTokenCreator
ロールを付与します。gcloud projects add-iam-policy-binding $(gcloud config get-value project) \ --member="serviceAccount:service-${PROJECT_NUMBER}@gcp-sa-pubsub.iam.gserviceaccount.com"\ --role='roles/iam.serviceAccountTokenCreator'
- このチュートリアルで使用するデフォルトを設定します。
export REGION=us-central1 gcloud config set run/region ${REGION} gcloud config set run/platform managed gcloud config set eventarc/location ${REGION}
us-east1
にバケットを作成します。export BUCKET1="troubleshoot-bucket1-PROJECT_ID" gcloud storage buckets create gs://${BUCKET1} --location=us-east1
us-west1
にバケットを作成します。export BUCKET2="troubleshoot-bucket2-PROJECT_ID" gcloud storage buckets create gs://${BUCKET2} --location=us-west1
GitHub リポジトリのクローンを作成して、コードサンプルを取得します。
Go
git clone https://github.com/GoogleCloudPlatform/golang-samples.git cd golang-samples/eventarc/audit_storage
Java
git clone https://github.com/GoogleCloudPlatform/java-docs-samples.git cd java-docs-samples/eventarc/audit-storage
.NET
git clone https://github.com/GoogleCloudPlatform/dotnet-docs-samples.git cd dotnet-docs-samples/eventarc/audit-storage
Node.js
git clone https://github.com/GoogleCloudPlatform/nodejs-docs-samples.git cd nodejs-docs-samples/eventarc/audit-storage
Python
git clone https://github.com/GoogleCloudPlatform/python-docs-samples.git cd python-docs-samples/eventarc/audit-storage
このチュートリアルのコードが、次の内容を含んでいることを確認します。
HTTP
POST
リクエスト内で受信イベントを CloudEvent として受け取るイベント ハンドラ:Go
Java
.NET
Node.js
Python
イベント ハンドラを使用するサーバー:
Go
Java
.NET
Node.js
Python
サービスの運用環境を定義する Dockerfile。Dockerfile の内容は言語によって異なります。
Go
Java
.NET
Node.js
Python
Cloud Build でコンテナ イメージをビルドし、イメージを Artifact Registry にアップロードします。
export PROJECT_ID=$(gcloud config get-value project) export SERVICE_NAME=troubleshoot-service gcloud builds submit --tag $REGION-docker.pkg.dev/${PROJECT_ID}/REPOSITORY/${SERVICE_NAME}:v1
コンテナ イメージを Cloud Run にデプロイします。
gcloud run deploy ${SERVICE_NAME} \ --image $REGION-docker.pkg.dev/${PROJECT_ID}/REPOSITORY/${SERVICE_NAME}:v1 \ --allow-unauthenticated
デプロイに成功すると、コマンドラインにサービスの URL が表示されます。
Cloud Audit Logs を使用して転送された Cloud Storage イベントをリッスンする Eventarc トリガーを作成します。
gcloud eventarc triggers create troubleshoot-trigger \ --destination-run-service=troubleshoot-service \ --event-filters="type=google.cloud.audit.log.v1.written" \ --event-filters="serviceName=storage.googleapis.com" \ --event-filters="methodName=storage.objects.create" \ --service-account=${PROJECT_NUMBER}-compute@developer.gserviceaccount.com
これにより、
troubleshoot-trigger
というトリガーが作成されます。troubleshoot-trigger
が作成されたことを確認するには、次のコマンドを実行します。gcloud eventarc triggers list
出力例を以下に示します。
NAME: troubleshoot-trigger TYPE: google.cloud.audit.log.v1.written DESTINATION: Cloud Run service: troubleshoot-service ACTIVE: By 20:03:37 LOCATION: us-central1
ファイルを作成して、
BUCKET1
ストレージ バケットにアップロードします。echo "Hello World" > random.txt gcloud storage cp random.txt gs://${BUCKET1}/random.txt
ログをモニタリングして、サービスがイベントを受信するかどうかを確認します。ログエントリを表示するには、次の手順を行います。
ログエントリをフィルタして、JSON 形式で出力を返します。
gcloud logging read "resource.labels.service_name=troubleshoot-service \ AND textPayload:random.txt" \ --format=json
次のようなログエントリを探します。
"textPayload": "Detected change in Cloud Storage bucket: ..."
Google Cloud コンソールで、[監査ログ] ページに移動します。
- [Google Cloud Storage] チェックボックスをオンにします。
- [管理読み取り]、[データ読み取り]、[データ書き込み] のログタイプが選択されていることを確認します。
既存のトリガーのロケーションを確認します。
gcloud eventarc triggers describe troubleshoot-trigger
ロケーションとリージョンを
us-east1
に設定します。gcloud config set eventarc/location us-east1 gcloud config set run/region us-east1
コンテナ イメージをビルドして Cloud Run にデプロイし、再度イベント レシーバをデプロイします。
us-east1
に新しいトリガーを作成します。gcloud eventarc triggers create troubleshoot-trigger-new \ --destination-run-service=troubleshoot-service \ --event-filters="type=google.cloud.audit.log.v1.written" \ --event-filters="serviceName=storage.googleapis.com" \ --event-filters="methodName=storage.objects.create" \ --service-account=${PROJECT_NUMBER}-compute@developer.gserviceaccount.com
トリガーが作成されたことを確認します。
gcloud eventarc triggers list
トリガーが初期化され、イベントの転送が開始するまでに 2 分ほどかかることがあります。
トリガーが正しくデプロイされたことを確認するには、イベントを生成し表示します。
ソースがイベントを生成していることを確認します。Cloud Audit Logs で、モニタリング対象サービスがログを出力していることを確認します。ログが記録されていてもイベントが配信されない場合は、サポートにお問い合わせください。
同じトリガー名の Pub/Sub トピックが存在することを確認します。 Eventarc は、Pub/Sub をトランスポート層として使用します。既存の Pub/Sub トピックを使用するか、トピックを自動的に作成して管理します。
- トリガーを一覧取得するには、
gcloud eventarc triggers list
をご覧ください。 Pub/Sub トピックを一覧取得するには、次のコマンドを実行します。
gcloud pubsub topics list
Pub/Sub トピック名に、作成されたトリガーの名前が含まれていることを確認します。例:
name: projects/PROJECT_ID/topics/eventarc-us-east1-troubleshoot-trigger-new-123
Pub/Sub トピックがない場合は、特定のプロバイダ、イベントタイプ、Cloud Run の宛先のトリガーを再度作成します。
- トリガーを一覧取得するには、
サービスにトリガーが構成されていることを確認します。
Google Cloud コンソールで、[サービス] ページに移動します。
サービスの名前をクリックして、[サービスの詳細] ページを開きます。
[トリガー] タブをクリックします。
サービスに関連付けられた Eventarc トリガーが表示されます。
Pub/Sub 指標タイプを使用して、Pub/Sub トピックとサブスクリプションの健全性を確認します。
subscription/dead_letter_message_count
指標を使用して、転送済みの配信不能メッセージをモニタリングできます。この指標は、Pub/Sub がサブスクリプションから転送する配信不能メッセージの数を示します。トピックにメッセージが公開されていない場合は、Cloud Audit Logs で、モニタリング対象サービスがログを出力していることを確認します。ログが記録されていてもイベントが配信されない場合は、サポートにお問い合わせください。
subscription/push_request_count
指標を使用してプッシュ サブスクリプションをモニタリングし、指標をresponse_code
とsubcription_id
でグループ化できます。push エラーが報告された場合は、Cloud Run サービスログを確認します。受信エンドポイントが OK 以外のステータス コードを返した場合、Cloud Run コードが期待どおりに機能していません。この場合、サポートにお問い合わせいただく必要があります。
詳細については、指標しきい値のアラート ポリシーを作成するをご覧ください。
- In the Google Cloud console, go to the Manage resources page.
- In the project list, select the project that you want to delete, and then click Delete.
- In the dialog, type the project ID, and then click Shut down to delete the project.
このチュートリアルでデプロイした Cloud Run サービスを削除します。
gcloud run services delete SERVICE_NAME
SERVICE_NAME
は、選択したサービス名です。Cloud Run サービスは Google Cloud コンソールで削除することもできます。
チュートリアルの設定時に追加した gcloud CLI のデフォルト構成を削除します。
例:
gcloud config unset run/region
または
gcloud config unset project
このチュートリアルで作成した他の Google Cloud リソースを削除します。
- Eventarc トリガーを削除します。
gcloud eventarc triggers delete TRIGGER_NAME
TRIGGER_NAME
は、実際のトリガー名に置き換えます。
- コンテナ イメージを削除します。
- Eventarc トリガーを削除します。
Artifact Registry 標準リポジトリを作成する
コンテナ イメージを保存する Artifact Registry 標準リポジトリを作成します。
gcloud artifacts repositories create REPOSITORY \ --repository-format=docker \ --location=$REGION
REPOSITORY
は、リポジトリの一意の名前に置き換えます。
Cloud Storage バケットを作成する
Cloud Run サービスのイベントソースとして、2 つのリージョンに Cloud Storage バケットを作成します。
イベントソースの作成後、イベント レシーバ サービスを Cloud Run にデプロイします。
イベント レシーバーをデプロイする
イベントを受信してロギングする Cloud Run サービスをデプロイします。
トリガーを作成する
Cloud Run サービスをデプロイした後は、監査ログを使用して Cloud Storage からのイベントをリッスンするトリガーを設定します。
イベントを生成して表示する
サービスが正常にデプロイされ、Cloud Storage からイベントを受信できることを確認します。
最初はログエントリが返されません。これは、セットアップに問題があり、調査する必要があることを意味します。
問題を調査する
サービスがイベントを受信しない原因を調査するプロセスを行います。
初期化時間
トリガーはすぐに作成されますが、トリガーが伝播されてイベントがフィルタされるまでに最大で 2 分かかることがあります。次のコマンドを実行して、トリガーが有効であることを確認します。
gcloud eventarc triggers list
出力は、トリガーのステータスを示します。次の例では、troubleshoot-trigger
が 14:16:56 までに有効になります。
NAME TYPE DESTINATION_RUN_SERVICE ACTIVE
troubleshoot-trigger google.cloud.audit.log.v1.written troubleshoot-service By 14:16:56
トリガーが有効になったら、ファイルをストレージ バケットに再度アップロードします。イベントは Cloud Run サービスログに書き込まれます。サービスがイベントを受信しない場合は、イベントサイズに関連している可能性があります。
監査ログ
このチュートリアルでは、Cloud Audit Logs を使用して Cloud Storage イベントが転送され、Cloud Run に送信されます。Cloud Storage の監査ログが有効になっていることを確認します。
Cloud Audit Logs を有効にしたら、ファイルをストレージ バケットに再度アップロードして、ログを確認します。サービスがまだイベントを受信していない場合は、トリガーのロケーションに関連している可能性があります。
トリガーのロケーション
ロケーションが異なる複数のリソースが存在している可能性があります。Cloud Run ターゲットと同じリージョン内のソースからのイベントをフィルタする必要があります。詳細については、Eventarc でサポートされているロケーションと Eventarc のロケーションについてをご覧ください。
このチュートリアルでは、Cloud Run サービスを us-central1
にデプロイしました。eventarc/location
を us-central1
に設定したため、同じロケーションにトリガーも作成しました。
しかし、2 つの Cloud Storage バケットは、us-east1
と us-west1
のロケーションに作成しました。これらのロケーションからイベントを受信するには、各ロケーションで Eventarc トリガーを作成する必要があります。
us-east1
に Eventarc トリガーを作成します。
発生する可能性がある他の問題
Eventarc の使用時に、他の問題が発生することがあります。
イベントサイズ
送信するイベントは、イベントサイズの上限を超えないようにする必要があります。
以前にイベントを配信したトリガーが停止している
クリーンアップ
このチュートリアル用に新規プロジェクトを作成した場合は、そのプロジェクトを削除します。既存のプロジェクトを使用していて、このチュートリアルで行った変更を追加せずに残す場合は、チュートリアル用に作成したリソースを削除します。
プロジェクトを削除する
課金されないようにする最も簡単な方法は、チュートリアル用に作成したプロジェクトを削除することです。
プロジェクトを削除するには: