このチュートリアルでは、未認証の Cloud Run サービスへ Cloud Audit Logs を使用して Cloud Storage から Eventarc を使用してイベントを転送するときに発生するランタイム エラーのトラブルシューティング方法について説明します。
目標
このチュートリアルでは、次のタスクを行う方法を説明します。
- コンテナ イメージを保存する Artifact Registry 標準リポジトリを作成する。
- イベントソースとなる Cloud Storage バケットを作成する。
- コンテナ イメージをビルドしてアップロードし、Cloud Run にデプロイする。
- Eventarc トリガーを作成する。
- ファイルを Cloud Storage バケットにアップロードする。
- ランタイム エラーのトラブルシューティングと修正を行う。
費用
このドキュメントでは、課金対象である次の Google Cloudコンポーネントを使用します。
料金計算ツールを使うと、予想使用量に基づいて費用の見積もりを生成できます。
始める前に
組織で定義されているセキュリティの制約により、次の手順を完了できない場合があります。トラブルシューティング情報については、制約のある Google Cloud 環境でアプリケーションを開発するをご覧ください。
- Google Cloud アカウントにログインします。 Google Cloudを初めて使用する場合は、 アカウントを作成して、実際のシナリオでの Google プロダクトのパフォーマンスを評価してください。新規のお客様には、ワークロードの実行、テスト、デプロイができる無料クレジット $300 分を差し上げます。
-
Google Cloud CLI をインストールします。
-
外部 ID プロバイダ(IdP)を使用している場合は、まず連携 ID を使用して gcloud CLI にログインする必要があります。
-
gcloud CLI を初期化するには、次のコマンドを実行します。
gcloud init -
Google Cloud プロジェクトを作成または選択します。
プロジェクトの選択または作成に必要なロール
- プロジェクトを選択する: プロジェクトの選択に特定の IAM ロールは必要ありません。ロールが付与されているプロジェクトであれば、どのプロジェクトでも選択できます。
-
プロジェクトを作成する: プロジェクトを作成するには、
resourcemanager.projects.create権限を含むプロジェクト作成者ロール(roles/resourcemanager.projectCreator)が必要です。ロールを付与する方法を確認する。
-
Google Cloud プロジェクトを作成します。
gcloud projects create PROJECT_ID
PROJECT_IDは、作成する Google Cloud プロジェクトの名前に置き換えます。 -
作成した Google Cloud プロジェクトを選択します。
gcloud config set project PROJECT_ID
PROJECT_IDは、 Google Cloud プロジェクトの名前に置き換えます。
Artifact Registry、Cloud Build、Cloud Logging、Cloud Run、Cloud Storage、Eventarc、Pub/Sub API を有効にします。
API を有効にするために必要なロール
API を有効にするには、
serviceusage.services.enable権限を含む Service Usage 管理者 IAM ロール(roles/serviceusage.serviceUsageAdmin)が必要です。ロールを付与する方法を確認する。gcloud services enable artifactregistry.googleapis.com
cloudbuild.googleapis.com eventarc.googleapis.com logging.googleapis.com pubsub.googleapis.com run.googleapis.com storage.googleapis.com -
Google Cloud CLI をインストールします。
-
外部 ID プロバイダ(IdP)を使用している場合は、まず連携 ID を使用して gcloud CLI にログインする必要があります。
-
gcloud CLI を初期化するには、次のコマンドを実行します。
gcloud init -
Google Cloud プロジェクトを作成または選択します。
プロジェクトの選択または作成に必要なロール
- プロジェクトを選択する: プロジェクトの選択に特定の IAM ロールは必要ありません。ロールが付与されているプロジェクトであれば、どのプロジェクトでも選択できます。
-
プロジェクトを作成する: プロジェクトを作成するには、
resourcemanager.projects.create権限を含むプロジェクト作成者ロール(roles/resourcemanager.projectCreator)が必要です。ロールを付与する方法を確認する。
-
Google Cloud プロジェクトを作成します。
gcloud projects create PROJECT_ID
PROJECT_IDは、作成する Google Cloud プロジェクトの名前に置き換えます。 -
作成した Google Cloud プロジェクトを選択します。
gcloud config set project PROJECT_ID
PROJECT_IDは、 Google Cloud プロジェクトの名前に置き換えます。
Artifact Registry、Cloud Build、Cloud Logging、Cloud Run、Cloud Storage、Eventarc、Pub/Sub API を有効にします。
API を有効にするために必要なロール
API を有効にするには、
serviceusage.services.enable権限を含む Service Usage 管理者 IAM ロール(roles/serviceusage.serviceUsageAdmin)が必要です。ロールを付与する方法を確認する。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}
Artifact Registry 標準リポジトリを作成する
コンテナ イメージを保存する Artifact Registry 標準リポジトリを作成します。
gcloud artifacts repositories create REPOSITORY \ --repository-format=docker \ --location=$REGION
REPOSITORY は、リポジトリの一意の名前に置き換えます。
Cloud Storage バケットを作成する
Cloud Run サービスのイベントソースとして、2 つのリージョンに Cloud Storage バケットを作成します。
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
イベントソースの作成後、イベント レシーバ サービスを Cloud Run にデプロイします。
イベント レシーバーをデプロイする
イベントを受信してロギングする Cloud Run サービスをデプロイします。
GitHub リポジトリのクローンを作成して、コードサンプルを取得します。
Go
git clone https://github.com/GoogleCloudPlatform/golang-samples.git cd golang-samples/eventarc/audit_storageJava
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-storageNode.js
git clone https://github.com/GoogleCloudPlatform/nodejs-docs-samples.git cd nodejs-docs-samples/eventarc/audit-storagePython
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 Run サービスをデプロイした後は、監査ログを使用して Cloud Storage からのイベントをリッスンするトリガーを設定します。
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
イベントを生成して表示する
サービスが正常にデプロイされ、Cloud Storage からイベントを受信できることを確認します。
ファイルを作成して、
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: ..."
最初はログエントリが返されません。これは、セットアップに問題があり、調査する必要があることを意味します。
問題を調査する
サービスがイベントを受信しない原因を調査するプロセスを行います。
初期化時間
トリガーはすぐに作成されますが、トリガーが伝播されてイベントがフィルタされるまでに最大で 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 の監査ログが有効になっていることを確認します。
Google Cloud コンソールで、[監査ログ] ページに移動します。
- [Google 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 トリガーを作成します。
既存のトリガーのロケーションを確認します。
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 分ほどかかることがあります。
トリガーが正しくデプロイされたことを確認するには、イベントを生成し表示します。
発生する可能性がある他の問題
Eventarc の使用時に、他の問題が発生することがあります。
イベントサイズ
送信するイベントは、イベントサイズの上限を超えないようにする必要があります。
以前にイベントを配信したトリガーが停止している
ソースがイベントを生成していることを確認します。Cloud Audit Logs で、モニタリング対象サービスがログを出力していることを確認します。ログが記録されていてもイベントが配信されない場合は、サポートにお問い合わせください。
同じトリガー名の Pub/Sub トピックが存在することを確認します。 Eventarc は、Pub/Sub をトランスポート層として使用します。既存の Pub/Sub トピックを使用するか、トピックを自動的に作成して管理します。
- トリガーを一覧取得するには、
gcloud eventarc triggers listをご覧ください。 Pub/Sub トピックを一覧取得するには、次のコマンドを実行します。
gcloud pubsub topics listPub/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 コードが期待どおりに機能していません。この場合、サポートにお問い合わせいただく必要があります。
詳細については、指標しきい値のアラート ポリシーを作成するをご覧ください。
クリーンアップ
このチュートリアル用に新規プロジェクトを作成した場合は、そのプロジェクトを削除します。既存のプロジェクトを使用していて、このチュートリアルで行った変更を追加せずに残す場合は、チュートリアル用に作成したリソースを削除します。
プロジェクトを削除する
課金されないようにする最も簡単な方法は、チュートリアル用に作成したプロジェクトを削除することです。
プロジェクトを削除するには:
- Google Cloud コンソールで [リソースの管理] ページに移動します。
- プロジェクト リストで、削除するプロジェクトを選択し、[削除] をクリックします。
- ダイアログでプロジェクト ID を入力し、[シャットダウン] をクリックしてプロジェクトを削除します。
チュートリアル リソースの削除
このチュートリアルでデプロイした 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 トリガーを削除します。