このチュートリアルでは、Cloud Audit Logs を使用して Cloud Storage から未認証の Cloud Run サービスにイベントをデプロイするときに発生するランタイム エラーのトラブルシューティング方法について説明します。
目標
- イベントソースとなる Cloud Storage バケットを作成する。
- コンテナ イメージをビルドしてアップロードし、Cloud Run にデプロイする。
- Eventarc トリガーを作成する。
- ファイルを Cloud Storage バケットにアップロードする。
- ランタイム エラーのトラブルシューティングと修正を行う。
費用
このチュートリアルでは、課金対象である次の Google Cloud コンポーネントを使用します。
料金計算ツールを使うと、予想使用量に基づいて費用の見積もりを生成できます。
このチュートリアルを終了した後、作成したリソースを削除すると、それ以上の請求は発生しません。詳細については、クリーンアップをご覧ください。
始める前に
Cloud Audit Logs イベントを受信するための前提条件を満たします。
Cloud Storage バケットを作成する
Cloud Run サービスのイベントソースとして、2 つのリージョンに 2 つのストレージ バケットを作成します。
us-east1
export BUCKET1="troubleshoot-bucket1-PROJECT_ID" gsutil mb -l us-east1 gs://${BUCKET1}
us-west1
export BUCKET2="troubleshoot-bucket2-$PROJECT_ID" gsutil mb -l us-west1 gs://${BUCKET2}
イベントソースの作成後、イベント レシーバ サービスを Cloud Run にデプロイします。
コードサンプルを取得する
リポジトリのクローンを作成します。
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
サービスの動作環境を定義する Dockerfile。Dockerfile の内容は言語によって異なります。
Go
Java
.NET
Node.js
Python
コードを配布する
コードを配布するには:
Cloud Build でコンテナ イメージをビルドし、Container Registry にアップロードします。
Go
gcloud builds submit --tag gcr.io/PROJECT_ID/audit-storage
PROJECT_ID は、実際の Google Cloud プロジェクト ID に置き換えます。
ビルドが成功すると、ID、作成時間、イメージ名を含む成功メッセージが表示されます。イメージが Container Registry に保存されます。このイメージは必要に応じて再利用できます。
Java
- Docker から Container Registry に push するには、gcloud 認証ヘルパーを使用します。
gcloud auth configure-docker
Jib Maven プラグインを使用して、コンテナをビルドして Container Registry に push します。
mvn compile jib:build -Dimage=gcr.io/PROJECT_ID/audit-storage
PROJECT_ID は、実際の Google Cloud プロジェクト ID に置き換えます。
audit-storage
はコンテナ名です。成功すると、成功メッセージが表示されます。イメージが Container Registry に保存されます。このイメージは必要に応じて再利用できます。
.NET
gcloud builds submit --tag gcr.io/PROJECT_ID/audit-storage
PROJECT_ID は、実際の Google Cloud プロジェクト ID に置き換えます。
ビルドが成功すると、ID、作成時間、イメージ名を含む成功メッセージが表示されます。イメージが Container Registry に保存されます。このイメージは必要に応じて再利用できます。
Node.js
gcloud builds submit --tag gcr.io/PROJECT_ID/audit-storage
PROJECT_ID は、実際の Google Cloud プロジェクト ID に置き換えます。
ビルドが成功すると、ID、作成時間、イメージ名を含む成功メッセージが表示されます。イメージが Container Registry に保存されます。このイメージは必要に応じて再利用できます。
Python
gcloud builds submit --tag gcr.io/PROJECT_ID/audit-storage
PROJECT_ID は、実際の Google Cloud プロジェクト ID に置き換えます。
ビルドが成功すると、ID、作成時間、イメージ名を含む成功メッセージが表示されます。イメージが Container Registry に保存されます。このイメージは必要に応じて再利用できます。
- Docker から Container Registry に push するには、gcloud 認証ヘルパーを使用します。
コンテナ イメージを Cloud Run にデプロイします。
gcloud run deploy troubleshoot-service --image gcr.io/PROJECT_ID/audit-storage \ --allow-unauthenticated
PROJECT_ID は、実際のプロジェクト ID に置き換えます。
audit-storage
はコンテナ名、troubleshoot-service
は Cloud Run サービスの名前です。コンテナ イメージは、gcloud の設定時に構成したサービスとリージョンにデプロイされることに注意してください。
Cloud Run にデプロイする場合、未認証の許可を求めるプロンプトで
y
(はい)と応答します。IAM ベースの認証の詳細については、Eventarc のロールと権限をご覧ください。デプロイに成功すると、コマンドラインにサービスの URL が表示されます。
トリガーを作成する
Cloud Run サービスをデプロイしたので、監査ログを使用して Cloud Storage からのイベントをリッスンするトリガーを設定します。
Cloud Storage イベントをリッスンする監査ログトリガーを作成します。
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
troubleshoot-trigger
がtroubleshoot-service
のターゲットとともに表示されます。
イベントを生成して表示する
サービスが正常にデプロイされ、Cloud Storage からイベントを受信できることを確認するには、次の操作を行います。
ファイルを作成して、最初のストレージ バケットにアップロードします。
echo "Hello World" > random.txt gsutil cp random.txt gs://${BUCKET1}/random.txt
ログをモニタリングして、サービスがイベントを受信したかどうかを確認します。サービスログには、サービスがイベントをリッスンしていることと、設定に問題があることが示されます。
Now listening on: http://0.0.0.0:8080
問題を調査する
次に、サービスがイベントを受信しない理由を調査するプロセスに進みます。
監査ログ
このチュートリアルでは、監査ログを使用して Cloud Storage イベントが発行され、Cloud Run に送信されます。監査ログが Cloud Storage に対して有効になっているかどうかを確認します。
[IAM と管理] > [監査ログ] に移動し、[Google Cloud Storage] チェックボックスをオンにします。
Cloud Audit Logs のコンソールに移動- Cloud Audit Logs の管理読み取り、データ読み取り、データ書き込みのログタイプが選択されていることを確認します。
Cloud Audit Logs を有効にしたら、ファイルをもう一度アップロードして、ログを確認します。サービスはまだイベントを受信していません。トリガーのロケーションに問題がある可能性があります。
トリガーのロケーション
ロケーションが異なる複数のリソースが存在している可能性があります。Cloud Run ターゲットと同じリージョン内のソースからのイベントをフィルタする必要があります。詳細については、Eventarc でサポートされているロケーションをご覧ください。
このチュートリアルでは、Cloud Run サービスを us-central1
にデプロイしています。eventarc/location
を us-central1
に設定しているので、同じロケーションにトリガーが作成されています。
トリガーのロケーションを一覧表示するには、次のようにトリガーを記述します。
gcloud eventarc triggers describe troubleshoot-trigger
ここでは、us-east1
と us-west1
に 2 つのバケットを作成しています。これらのロケーションからイベントを受信するには、それらのロケーションでトリガーを作成する必要があります。では、us-east1
にトリガーを作成してみましょう。
us-central1
ロケーションの既存のトリガーを削除します。gcloud eventarc triggers delete troubleshoot-trigger
ロケーションとリージョンを
us-east1
に設定します。gcloud config set eventarc/location us-east1 gcloud config set run/region us-east1
もう一度コードをリリースします。
ロケーション
us-east1
で新しいトリガーを作成します。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
トリガーが作成されたことを確認します。
gcloud eventarc triggers list
トリガーが初期化され、イベントの配信が開始するまでに 2 分ほどかかることがあります。
初期化時間
トリガーが作成されてからイベントの送信を開始するまでに最大で 2 分ほどかかります。次のコマンドを実行して、トリガーが有効になっていることを確認します。
gcloud eventarc triggers list
トリガーのステータスを示す次のような出力が表示されます。
NAME TYPE DESTINATION_RUN_SERVICE DESTINATION_RUN_PATH ACTIVE
troubleshoot-trigger3 google.cloud.audit.log.v1.written troubleshoot-service2 By 14:16:56
troubleshoot-trigger google.cloud.audit.log.v1.written troubleshoot-service Yes
10 分後、各バケットにファイルを再度アップロードします。各ファイルのイベントが Cloud Run サービスログに書き込まれます。サービスがイベントを受信しない場合は、イベントサイズに問題がある可能性があります。
イベントサイズ
送信するイベントはイベントサイズの上限(512 KB)を超えないようにする必要があります。
以前にイベントを配信したトリガーが停止している
ソースがイベントを生成していることを確認します。Cloud Audit Logs で、モニタリング対象サービスがログを出力していることを確認します。ログが記録されていてもイベントが配信されない場合は、サポートにお問い合わせください。
同じトリガー名の Pub/Sub トピックが存在することを確認します。
- トリガーを一覧表示する方法については、gcloud eventarc triggers list をご覧ください。
Pub/Sub トピックを一覧表示するには、次のコマンドを実行します。
gcloud pubsub topics list
Pub/Sub トピック名に、作成されたトリガーの名前が含まれていることを確認します。Pub/Sub トピックがない場合は、トリガーの作成時にトピックを作成します。
Pub/Sub トピックの正常性を確認します。
[トリガー] タブにチェックマーク check_circle があることを確認します。Cloud Console で [Cloud Run] に移動し、作成したサービスを選択して、[トリガー] タブに移動します。
[Pub/Sub] > [トピック] に移動し、Pub/Sub トピックをクリックします。
指標
topic/send_message_operation_count
を含むトピックにメッセージが公開されているかどうかをモニタリングします。トピックにメッセージが公開されていない場合は、Cloud Audit Logs で、モニタリング対象サービスがログを出力していることを確認します。ログが記録されていてもイベントが配信されない場合は、サポートにお問い合わせください。response_code
で、指標subscription/push_request_count
を含むメッセージが Cloud Run に正常に push されているかどうかをモニタリングします。Cloud Console で Cloud Monitoring に移動します。
プロジェクトを新しいワークスペースに追加します。
[ダッシュボード] をクリックし、[Cloud Pub/Sub] ダッシュボードを選択します。
[Cloud Pub/Sub] ダッシュボードで、作成した Pub/Sub トピックをクリックします。
[Incidents] セクションで、[CREATE POLICY] をクリックします。
[通知ポリシーを作成] ページで、[ADD CONDITION] をクリックします。
[METRIC] タブで、次の条件を指定します。
- リソースタイプとして Cloud Pub/Sub subscription。
- 指標として Push requests。
- グループ化として response_code。
- 構成しきい値として 0。
Pub/Sub の使用状況の指標の詳細については、push サブスクリプションのモニタリングをご覧ください。
[ADD] をクリックして、[Create alerting policy] ページに移動します。
[What's the steps to fixing the issue?] で、アラート名(例:
samplealert
)を指定して [Save] をクリックします。アラートを表示するには、[Monitoring] > [ダッシュボード] > [Cloud Pub/Sub] に移動します。Pub/Sub トピックをクリックして、[Subscription] タブをクリックします。
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
は実際のトリガー名に置き換えます。
gcr.io/PROJECT_ID/audit-storage
という名前のコンテナ イメージを Container Registry から削除します。PROJECT_ID は、実際の Google Cloud プロジェクト ID に置き換えます。
- Eventarc トリガーを削除します。
次のステップ
- Eventarc の使用時に発生する可能性のあるその他の問題を解決するには、問題のトラブルシューティングをご覧ください。