このチュートリアルでは、Cloud Audit Logs を使用して Cloud Storage からイベントを受信する、認証済みの Cloud Run サービスをデプロイする方法について説明します。このチュートリアルを使用して、本番環境ワークロードをデプロイします。Eventarc トリガーは、Cloud Audit Logs エントリに基づいてイベントをフィルタします。詳細については、Cloud Audit Logs のイベント フィルタを決定するをご覧ください。
このチュートリアルは、Google Cloud コンソール、Google Cloud CLI のいずれを使用しても行うことができます。
目標
このチュートリアルの内容は次のとおりです。
イベントソースとなる Cloud Storage バケットを作成する。
イベント レシーバ サービスを Cloud Run にデプロイする。
Eventarc トリガーを作成する。
Cloud Storage バケットにファイルをアップロードしてイベントを生成し、Cloud Run のログで確認する。
費用
このドキュメントでは、Google Cloud の次の課金対象のコンポーネントを使用します。
料金計算ツールを使うと、予想使用量に基づいて費用の見積もりを生成できます。
始める前に
組織で定義されているセキュリティの制約により、次の手順を完了できない場合があります。トラブルシューティング情報については、制約のある Google Cloud 環境でアプリケーションを開発するをご覧ください。
プロジェクト作成者には、オーナーロール(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
)
ロールの付与の詳細については、アクセスの管理をご覧ください。
Google Cloud コンソールまたは gcloud CLI を使用して次の操作を行います。
コンソール
- 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.
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
Make sure that billing is enabled for your Google Cloud project.
-
Enable the Artifact Registry、Cloud Build、Logging、Pub/Sub、Cloud Run、Cloud Storage、Eventarc APIs.
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
Make sure that billing is enabled for your Google Cloud project.
-
Enable the Artifact Registry、Cloud Build、Logging、Pub/Sub、Cloud Run、Cloud Storage、Eventarc APIs.
- 監査ログに記録されるデータアクセスを構成するには、Google Cloud Storage の管理読み取り、データ読み取り、データ書き込みのログタイプを有効にします。
-
Google Cloud コンソールで、[サービス アカウント] ページに移動します。
- [サービス アカウントを作成] をクリックします。
-
Google Cloud コンソールに表示するサービス アカウント名を入力します。
この名前に基づいてサービス アカウント ID が生成され、Google Cloud コンソールに表示されます。必要に応じて ID を編集します。後で ID を変更することはできません。
- 省略可: サービス アカウントの説明を入力します。
-
アクセス制御を今すぐ設定しない場合は、[完了] をクリックしてサービス アカウントの作成を終了します。
アクセス制御を今すぐ設定するには、[作成して続行] をクリックして次の手順に進みます。
- プロジェクトの Cloud Run 起動元と Eventarc イベント受信者のロールを選択し、Eventarc トリガーに関連付けられたサービス アカウントに付与します。
この操作を行うと、テスト目的のために、プロジェクト内の Cloud Run のすべてのサービスとジョブに関する Cloud Run 起動元のロールが付与されます。Cloud Run の特定のサービスに関するこのロールを付与することもできます。詳細については、Cloud Run サービスの権限を付与するをご覧ください。
Cloud Run 起動元のロールを付与せずに認証済みの Cloud Run サービスのトリガーを作成すると、トリガーは正常に作成され、アクティブになります。ただし、トリガーは期待どおりに機能せず、次のようなメッセージがログに記録されます。
The request was not authenticated. Either allow unauthenticated invocations or set the proper Authorization header.
- ロールを追加したら、[続行]、[完了] をクリックしてサービス アカウントの作成を終了します。
gcloud
- 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.
-
To initialize the gcloud CLI, run the following command:
gcloud init
-
Create or select a Google Cloud project.
-
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.
-
-
Make sure that billing is enabled for your Google Cloud project.
-
Enable the Artifact Registry、Cloud Build、Logging、Pub/Sub、Cloud Run、Cloud Storage、Eventarc APIs:
gcloud services enable artifactregistry.googleapis.com
cloudbuild.googleapis.com、logging.googleapis.com、pubsub.googleapis.com、run.googleapis.com、storage.googleapis.com、eventarc.googleapis.com - Install the Google Cloud CLI.
-
To initialize the gcloud CLI, run the following command:
gcloud init
-
Create or select a Google Cloud project.
-
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.
-
-
Make sure that billing is enabled for your Google Cloud project.
-
Enable the Artifact Registry、Cloud Build、Logging、Pub/Sub、Cloud Run、Cloud Storage、Eventarc APIs:
gcloud services enable artifactregistry.googleapis.com
cloudbuild.googleapis.com、logging.googleapis.com、pubsub.googleapis.com、run.googleapis.com、storage.googleapis.com、eventarc.googleapis.com gcloud
コンポーネントを更新します。gcloud components update
- アカウントを使用してログインします。
gcloud auth login
- このチュートリアルで使用する構成変数を設定します。
export REGION=us-central1 gcloud config set run/region ${REGION} gcloud config set run/platform managed gcloud config set eventarc/location ${REGION} export SERVICE_NAME=helloworld-events
- 監査ログに記録されるデータアクセスを構成するには、
storage.googleapis.com
サービスのADMIN_READ
、DATA_READ
、DATA_WRITE
のログタイプを有効にします。- プロジェクトの IAM ポリシーを読み取り、ファイルに保存します。
gcloud projects get-iam-policy PROJECT_ID > /tmp/policy.yaml
/tmp/policy.yaml
内のポリシーを編集し、データアクセス監査ログの構成のみを追加または変更します。auditConfigs: - auditLogConfigs: - logType: ADMIN_READ - logType: DATA_WRITE - logType: DATA_READ service: storage.googleapis.com
- 新しい IAM ポリシーを作成します。
上記のコマンドで別の変更との競合が報告された場合は、プロジェクトの IAM ポリシーの読み取りからやり直してください。gcloud projects set-iam-policy PROJECT_ID /tmp/policy.yaml
- プロジェクトの IAM ポリシーを読み取り、ファイルに保存します。
- プロジェクトのサービス アカウントを作成します。
サービス アカウントを作成した後、サービス アカウントを使用できるようになるまで最大で 7 分かかることがあります。サービス アカウントを作成した直後に使用しようとしてエラーが表示された場合は、60 秒以上待ってからもう一度お試しください。gcloud iam service-accounts create sample-service-account \ --description="A sample service account" \ --display-name="Sample service account"
sample-service-account
が作成されたことを確認するには、次のコマンドを実行します。 出力例を以下に示します。gcloud iam service-accounts list
DISPLAY NAME EMAIL DISABLED Default compute service account PROJECT_NUMBER-compute@developer.gserviceaccount.com False Sample service account sample-service-account@PROJECT_ID.iam.gserviceaccount.com False
- Eventarc トリガーに関連付けられたサービス アカウントに、プロジェクトの Cloud Run 起動元(
run.invoker
)と Eventarc イベント受信者(roles/eventarc.eventReceiver
)のロールを付与します。gcloud projects add-iam-policy-binding PROJECT_ID \ --member="serviceAccount:sample-service-account@PROJECT_ID.iam.gserviceaccount.com" \ --role="roles/run.invoker"
gcloud projects add-iam-policy-binding PROJECT_ID \ --member="serviceAccount:sample-service-account@PROJECT_ID.iam.gserviceaccount.com" \ --role="roles/eventarc.eventReceiver"
PROJECT_ID
は、実際の Google Cloud プロジェクト ID に置き換えます。この操作を行うと、テスト目的のために、プロジェクト内の Cloud Run のすべてのサービスとジョブに関する Cloud Run 起動元のロールが付与されます。Cloud Run の特定のサービスに関するこのロールを付与することもできます。詳細については、Cloud Run サービスの権限を付与するをご覧ください。
Cloud Run 起動元のロールを付与せずに認証済みの Cloud Run サービスのトリガーを作成すると、トリガーは正常に作成され、アクティブになります。ただし、トリガーは期待どおりに機能せず、次のようなメッセージがログに記録されます。
The request was not authenticated. Either allow unauthenticated invocations or set the proper Authorization header.
Artifact Registry 標準リポジトリを作成する
コンテナ イメージを保存する Artifact Registry 標準リポジトリを作成します。コンソール
- Google Cloud コンソールで、[リポジトリ] ページに移動します。
- [ リポジトリを作成] をクリックします。
- リポジトリを構成します。
- 一意の [名前] を入力します。
- [形式] は [Docker] を選択します。
- [モード] は [標準] を選択します。
- [ロケーション タイプ] は [リージョン] を選択します。
- [リージョン] リストで、[us-central1(アイオワ)] を選択します。
- その他のデフォルト値はそのままにして、[作成] をクリックします。
gcloud
gcloud artifacts repositories create REPOSITORY \ --repository-format=docker \ --location=$REGION
REPOSITORY
は、Artifact Registry リポジトリの一意の名前に置き換えます。
Cloud Storage バケットを作成する
このチュートリアルでは、イベントソースとして Cloud Storage を使用します。ストレージ バケットを作成するには:
コンソール
- Google Cloud コンソールの [バケット] ページに移動します。
- [ バケットを作成] をクリックします。
- バケット情報を入力し、[続行] をクリックして各ステップを完了します。
- 一意の名前を入力します。例:
eventarcbucket
- [ロケーション タイプ] で [Region] を選択します。
- [ロケーション] で [us-central1(アイオワ)] を選択します。
- [デフォルトのストレージ クラス] として [Standard] を選択します。
- [アクセス制御] で [均一] を選択します。
- 一意の名前を入力します。例:
- [作成] をクリックします。
gcloud
gsutil mb -l $REGION gs://events-tutorial-PROJECT_ID/
イベントソースの作成後、Cloud Run にイベント レシーバ サービスをデプロイできます。
イベント レシーバー サービスを Cloud Run にデプロイする
イベントを受信してロギングする Cloud Run サービスをデプロイします。サンプル イベント レシーバ サービスをデプロイするには:
コンソール
- GitHub アカウントにサンプル リポジトリのクローンを作成します。
- GitHub で、GoogleCloudPlatform/golang-samples に移動します。
- [Fork] をクリックします。
- プロンプトが表示されたら、リポジトリをフォークするロケーションを選択します。
- GitHub で GoogleCloudPlatform/java-docs-samples に移動します。
- [Fork] をクリックします。
- プロンプトが表示されたら、リポジトリをフォークするロケーションを選択します。
- GitHub で GoogleCloudPlatform/dotnet-docs-samples に移動します。
- [Fork] をクリックします。
- プロンプトが表示されたら、リポジトリをフォークするロケーションを選択します。
- GitHub で GoogleCloudPlatform/nodejs-docs-samples に移動します。
- [Fork] をクリックします。
- プロンプトが表示されたら、リポジトリをフォークするロケーションを選択します。
- GitHub で GoogleCloudPlatform/python-docs-samples に移動します。
- [Fork] をクリックします。
- プロンプトが表示されたら、リポジトリをフォークするロケーションを選択します。
- Google Cloud コンソールの [サービス] ページに移動します。
- [ サービスの作成] をクリックして、[サービスの作成] フォームを表示します。
- [リポジトリから継続的にデプロイする] を選択します。
GitHub リポジトリに対する変更は、Artifact Registry のコンテナ イメージに自動的に反映され、Cloud Run にデプロイされます。
- [Cloud Build の設定] をクリックし、[Cloud Build の設定] フォームを開きます。
- 指示が表示された場合は、Cloud Build API と Artifact Analysis API を有効にします。
- [リポジトリ プロバイダ] で [GitHub] を選択します。 まだ認証されていない場合は、[認証] をクリックし、指示に沿って Cloud Build GitHub アプリを使用してリポジトリに接続します。
- プロンプトが表示されたら、[Google Cloud Build のインストール] をクリックします。
- [リポジトリ] で、フォークした GitHub リポジトリを選択します。
- [次へ] をクリックします。
- [ブランチ] フィールドに「
^main$
」と入力します。 - [ビルドタイプ] で [Dockerfile] を選択し、Dockerfile のソースの場所を指定します。
eventarc/audit-storage/Dockerfile
or
eventarc/audit_storage/Dockerfile
(Go)
- [保存] をクリックします。
- [サービスの作成] フォームに、サービス名を入力します。例:
helloworld-events
- サービスを配置する [リージョン] として [us-central1(アイオワ)] を選択します。
- Cloud Run サービスで許可する上り(内向き)トラフィックに基づいて、[Ingress] オプションのいずれかを選択します。
- [認証が必要] を選択します。
- [作成] をクリックします。
Go
Java
.NET
Node.js
Python
gcloud
- 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
- コンテナをビルドして、Cloud Build にアップロードします。
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
未認証の呼び出しの許可を求めるメッセージには、「
n
」と入力します。デプロイに成功すると、コマンドラインにサービスの URL が表示されます。
これで helloworld-events
というイベント レシーバ サービスが Cloud Run にデプロイされたので、トリガーを設定できます。
Eventarc トリガーを作成する
Eventarc トリガーは、Cloud Storage バケットから helloworld-events
Cloud Run サービスにイベントを送信します。
コンソール
- Google Cloud コンソールの [トリガー] ページに移動します。
- [ トリガーを作成] をクリックします。
- トリガー名を入力します。
これはトリガーの ID で、先頭は英字にする必要があります。63 文字以下の小文字、数字、ハイフンで構成します。
- トリガーのタイプを選択します。
- 自社: Google Cloud プロバイダから(直接または Cloud Audit Logs エントリを介して)送信されたイベント、または Pub/Sub メッセージを使用してプロバイダから送信されたイベントをフィルタリングします。
- サードパーティ: サードパーティ プロバイダから送信されるイベントを除外します。
- [イベント プロバイダ] リストで、イベントのソースとして [Cloud Storage] を選択します。
- [イベントタイプ] リストで [storage.objects.create] を選択します。
- [リージョン] リストで、イベントを受信するリージョンとして [us-central1] を選択します。
- 作成したサービス アカウントを選択します。例:
SERVICE_ACCOUNT_ID@PROJECT_ID
.iam.gserviceaccount.com - [イベントの宛先] リストで、[Cloud Run] を選択します。
- [Cloud Run サービスを選択] リストで、[helloworld-events] を選択します。
- [作成] をクリックします。 Cloud Run コンソール ページを使用して Eventarc トリガーを作成することもできます。
gcloud
- Cloud Storage イベントをフィルタし、作成したサービス アカウントを使用するトリガーを作成します。
gcloud eventarc triggers create events-tutorial-trigger \ --destination-run-service=$SERVICE_NAME \ --destination-run-region=$REGION \ --event-filters="type=google.cloud.audit.log.v1.written" \ --event-filters="serviceName=storage.googleapis.com" \ --event-filters="methodName=storage.objects.create" \ --service-account=sample-service-account@PROJECT_ID.iam.gserviceaccount.com
PROJECT_ID
は、Google Cloud プロジェクト ID に置き換えます。ここで
type
: トリガーのフィルタ条件が満たされたときに監査ログが作成されるよう指定します。serviceName
: 監査ログを書き込むサービス(Cloud Storage)。methodName
: 監査対象のオペレーション(storage.objects.create
)。
events-tutorial-trigger
というトリガーが作成されます。 events-tutorial-trigger
が正常に作成されたことを確認するには、次のコマンドを実行します。gcloud eventarc triggers list --location=$REGION
トリガー
events-tutorial-trigger
が helloworld-events
のターゲットとともに表示されます。イベントを生成して表示する
- イベントを生成するには:
コンソール
- 「Hello World」というテキストを含むテキスト ファイルを
random.txt
という名前で保存します。 - Google Cloud コンソールの [バケット] ページに移動します。
- 作成したストレージ バケットを選択します。
- [オブジェクト] タブで、[ファイルをアップロード] をクリックして
random.txt
ファイルをアップロードします。
gcloud
Cloud Storage にファイルをアップロードします。
echo "Hello World" > random.txt gsutil cp random.txt gs://events-tutorial-PROJECT_ID/random.txt
- 「Hello World」というテキストを含むテキスト ファイルを
- ログエントリを表示するには:
- Google Cloud コンソールで、[サービス] ページに移動します。
- サービスの一覧から、作成したサービスの名前をクリックして、[サービスの詳細] ページに移動します。
- このサービスのすべてのリビジョンのリクエストログとコンテナログを取得するには、[ログ] タブをクリックします。ログの重大度でフィルタリングできます。
- 次のようなログエントリを探します。
ここで、Detected change in Cloud Storage bucket: storage.googleapis.com/projects/_/buckets/BUCKET_NAME/objects/random.txt
BUCKET_NAME
は、Cloud Storage バケットの名前です。 -
gcloud logging read "resource.labels.service_name=helloworld-events AND textPayload:random.txt" --format=json
- 次のようなログエントリを探します。
ここで、Detected change in Cloud Storage bucket: storage.googleapis.com/projects/_/buckets/BUCKET_NAME/objects/random.txt
BUCKET_NAME
は、Cloud Storage バケットの名前です。
コンソール
gcloud
イベント レシーバ サービスを Cloud Run にデプロイし、Eventarc トリガーを作成して、Cloud Storage からイベントを生成し、それを Cloud Run ログで確認できました。
クリーンアップ
サービスが使用されていない場合、Cloud Run の料金は発生しませんが、Artifact Registry にコンテナ イメージを保存すると料金が発生します。また、Cloud Storage バケットにファイルを保存した場合や、Eventarc リソースを使用した場合にも料金が発生します。次のことが可能です。
また、Google Cloud プロジェクトを削除して、料金が発生しないようにすることもできます。Google Cloud プロジェクトを削除すると、そのプロジェクト内で使用されているすべてのリソースに対する課金が停止します。
Delete a Google Cloud project:
gcloud projects delete PROJECT_ID