Cloud Storage からの直接イベントでワークフローをトリガーする(gcloud CLI)
このクイックスタートでは、Cloud Storage からイベントを受け取る Eventarc トリガーを使用してワークフローを実行する方法について説明します。
トリガーは、Cloud Storage バケット内のオブジェクト作成イベントをリッスンしてワークフローを実行し、そのイベントをランタイム引数として宛先ワークフローに渡します。
このクイックスタートでは、以下の操作を行います。
イベントソースとして Cloud Storage バケットを作成します。
Workflows により、ストレージ バケットの名前とアップロードされたファイルの名前を抽出して返すワークフローを作成してデプロイします。
Cloud Storage バケットを Workflows イベント レシーバに接続する 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 ロールは必要ありません。ロールが付与されているプロジェクトを選択できます。
-
プロジェクトを作成する: プロジェクトを作成するには、プロジェクト作成者ロール
(
roles/resourcemanager.projectCreator)が必要です。これにはresourcemanager.projects.create権限が含まれています。ロールを付与する方法をご覧ください。
-
プロジェクトを作成します。 Google Cloud
gcloud projects create PROJECT_ID
PROJECT_IDは、作成する Google Cloud プロジェクトの名前に置き換えます。 -
作成した Google Cloud プロジェクトを選択します。
gcloud config set project PROJECT_ID
PROJECT_IDは、 Google Cloud プロジェクトの名前に置き換えます。
-
Google Cloud CLI をインストールします。
-
外部 ID プロバイダ(IdP)を使用している場合は、まず連携 ID を使用して gcloud CLI にログインする必要があります。
-
gcloud CLI を初期化するには、次のコマンドを実行します:
gcloud init -
プロジェクトを Google Cloud 作成または選択します。
プロジェクトを選択または作成するために必要なロール
- プロジェクトを選択する: プロジェクトの選択に特定の IAM ロールは必要ありません。ロールが付与されているプロジェクトを選択できます。
-
プロジェクトを作成する: プロジェクトを作成するには、プロジェクト作成者ロール
(
roles/resourcemanager.projectCreator)が必要です。これにはresourcemanager.projects.create権限が含まれています。ロールを付与する方法をご覧ください。
-
プロジェクトを作成します。 Google Cloud
gcloud projects create PROJECT_ID
PROJECT_IDは、作成する Google Cloud プロジェクトの名前に置き換えます。 -
作成した Google Cloud プロジェクトを選択します。
gcloud config set project PROJECT_ID
PROJECT_IDは、 Google Cloud プロジェクトの名前に置き換えます。
Compute Engine、Eventarc、Pub/Sub、Workflows API を有効にします。
gcloud services enable \ compute.googleapis.com \ eventarc.googleapis.com \ pubsub.googleapis.com \ workflows.googleapis.com \ workflowexecutions.googleapis.com
gcloudコンポーネントを更新します。gcloud components update
- アカウントを使用してログインします。
gcloud auth login
環境変数を設定する
このクイックスタートで使用する環境変数を設定します。
export PROJECT_ID=PROJECT_ID
export WORKFLOW_LOCATION=us-central1
export TRIGGER_LOCATION=us-central1
gcloud config set project ${PROJECT_ID}
gcloud config set workflows/location ${WORKFLOW_LOCATION}
gcloud config set eventarc/location ${TRIGGER_LOCATION}
プロジェクト ID は、 [ようこそ] ページで確認できます。 Google Cloud
サービス アカウントを設定する
このクイックスタートで使用するサービス アカウントに必要な権限を付与します。
-
プロジェクト作成者には、 基本オーナーロール (
roles/owner)が付与されます。デフォルトでは、この Identity and Access Management(IAM)ロールには、ほとんどの Google Cloud リソースへのフルアクセスに必要な権限が含まれており、この手順は省略できます。プロジェクト作成者でない場合は、プロジェクトで適切なプリンシパルに必要な権限を付与する必要があります。プリンシパルは Google アカウント(エンドユーザーの場合)やサービス アカウント(アプリケーションとコンピューティング ワークロードの場合)になることもあります。詳細については、イベントの宛先のロールと権限のページをご覧ください。
必要な権限
このクイックスタートを完了するために必要な権限を取得するには、プロジェクトに対する次の IAM ロールを付与するよう管理者に依頼してください。
-
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) -
ワークフロー管理者 (
roles/workflows.admin)
ロールの付与については、プロジェクト、フォルダ、組織へのアクセス権の管理をご覧ください。
-
Eventarc 管理者 (
Compute Engine のデフォルトのサービス アカウントをメモしておいてください。テスト目的で、Eventarc トリガーにこのサービス アカウントを関連付け、トリガーの ID として使用します。このサービス アカウントは、Compute Engine を使用する Google Cloud サービスを有効にするか使用すると自動的に作成されます。メールアドレスの形式は次のとおりです。
PROJECT_NUMBER-compute@developer.gserviceaccount.com
PROJECT_NUMBERは、使用する Google Cloudプロジェクト番号に置き換えます。プロジェクト番号は、 Google Cloud コンソールの [ようこそ] ページで確認できます。また、次のコマンドでも確認できます。gcloud projects describe PROJECT_ID --format='value(projectNumber)'
本番環境では、新しいサービス アカウントを作成して、必要最小限の権限を含む、最小権限の原則に従った 1 つ以上の IAM ロールを付与することを強くおすすめします。
- プロジェクトの
Eventarc
イベント レシーバーのロール(
roles/eventarc.eventReceiver)を Compute Engine のデフォルト サービス アカウントに付与して、 Eventarc トリガーがイベント プロバイダからイベントを受信できるようにします。gcloud projects add-iam-policy-binding PROJECT_ID \ --member=serviceAccount:PROJECT_NUMBER-compute@developer.gserviceaccount.com \ --role=roles/eventarc.eventReceiver
- プロジェクトのワークフロー起動元ロール(
roles/workflows.invoker)を Compute Engine のデフォルト サービス アカウントに付与し、ワークフローをトリガーする権限を付与します。gcloud projects add-iam-policy-binding PROJECT_ID \ --member=serviceAccount:PROJECT_NUMBER-compute@developer.gserviceaccount.com \ --role=roles/workflows.invoker
- ワークフローが Cloud Logging にログを送信できるように、プロジェクトの Logging ログ書き込みロール(
roles/logging.logWriter)を Compute Engine のデフォルト サービス アカウントに付与します。gcloud projects add-iam-policy-binding PROJECT_ID \ --member=serviceAccount:PROJECT_NUMBER-compute@developer.gserviceaccount.com \ --role=roles/logging.logWriter
- Cloud Storage からの直接イベントのトリガーを作成する前に、Cloud Storage サービス エージェントに Pub/Sub パブリッシャーのロール(
roles/pubsub.publisher)を付与します。SERVICE_ACCOUNT="$(gcloud storage service-agent --project=PROJECT_ID)" gcloud projects add-iam-policy-binding PROJECT_ID \ --member="serviceAccount:${SERVICE_ACCOUNT}" \ --role='roles/pubsub.publisher'
- 2021 年 4 月 8 日以前に、認証済みの Pub/Sub push リクエストをサポートするために Cloud Pub/Sub サービス エージェントを有効にした場合は、サービス アカウント トークン作成者のロール(
roles/iam.serviceAccountTokenCreator)をサービス エージェントに付与します。それ以外の場合、このロールはデフォルトで付与されます。gcloud projects add-iam-policy-binding PROJECT_ID \ --member=serviceAccount:service-PROJECT_NUMBER@gcp-sa-pubsub.iam.gserviceaccount.com \ --role=roles/iam.serviceAccountTokenCreator
Cloud Storage バケットを作成する
イベントソースとして使用する Cloud Storage バケットを作成します。
gcloud storage buckets create gs://${PROJECT_ID}-bucket --location=us-central1
ワークフローを作成してデプロイする
Cloud Storage バケットで作成されたオブジェクトが HTTP リクエストでワークフローをトリガーするときに実行されるワークフローを作成してデプロイします。
ホーム ディレクトリで、
myEventWorkflow.yamlまたはmyEventWorkflow.jsonという名前の新しいファイルを作成します。次の内容をコピーして新しいファイルに貼り付け、保存します。
YAML
main: params: [event] steps: - log_event: call: sys.log args: text: ${event} severity: INFO - extract_bucket_object: assign: - bucket: ${event.data.bucket} - object: ${event.data.name} - return_bucket_object: return: bucket: ${bucket} object: ${object}
JSON
{ "main": { "params": [ "event" ], "steps": [ { "log_event": { "call": "sys.log", "args": { "text": "${event}", "severity": "INFO" } } }, { "extract_bucket_object": { "assign": [ { "bucket": "${event.data.bucket}" }, { "object": "${event.data.name}" } ] } }, { "return_bucket_object": { "return": { "bucket": "${bucket}", "object": "${object}" } } } ] } }
ワークフローをデプロイします。
export MY_WORKFLOW=myEventWorkflow gcloud workflows deploy ${MY_WORKFLOW} --source=myEventWorkflow.yamlJSON バージョンのサンプル ワークフローをコピーした場合は、
.yamlを.jsonに置き換えます。
Eventarc トリガーを作成する
Eventarc トリガーは、Cloud Storage バケットから Workflows の宛先にイベントを送信します。
Cloud Storage イベントをフィルタするトリガーを作成します。
gcloud eventarc triggers create storage-events-trigger \ --destination-workflow=${MY_WORKFLOW} \ --event-filters="type=google.cloud.storage.object.v1.finalized" \ --event-filters="bucket=${PROJECT_ID}-bucket" \ --service-account="PROJECT_NUMBER-compute@developer.gserviceaccount.com"これにより、
storage-events-triggerというトリガーが作成されます。Google Cloud プロジェクトで初めて Eventarc トリガーを作成する場合は、Eventarc サービス エージェントのプロビジョニングに遅延が発生する可能性があります。この問題は通常、トリガーを再度作成することで解決できます。詳細については、 権限拒否エラーをご覧ください。
storage-events-triggerが正常に作成されたことを確認するには、次のコマンドを実行します。gcloud eventarc triggers describe storage-events-trigger --location=${TRIGGER_LOCATION}作成時刻とトリガーのロケーションを含む出力は次のようになります。
createTime: '2021-10-14T15:15:43.872360951Z' [...] name: projects/PROJECT_ID/locations/us-central1/triggers/storage-events-trigger
イベントを生成して表示する
イベントを生成するには、Cloud Storage にテキスト ファイルをアップロードします。
echo "Hello World" > random.txt gcloud storage cp random.txt gs://${PROJECT_ID}-bucket/random.txtアップロードにより、ランタイム引数としてワークフローに渡されるイベントが生成されます。これにより、ストレージ バケットとアップロードされたファイルの名前が返されます。
ワークフローの実行がトリガーされたことを確認するには、直近の 5 つの実行を一覧表示します。
gcloud workflows executions list ${MY_WORKFLOW} --limit=5出力は次のようになります。ワークフローを実行するたびに
SUCCEEDEDと等しい NAME と STATE が表示されます。NAME: projects/606789101455/locations/us-central1/workflows/myFirstWorkflow/executions/8c02b8f1-8836-4a6d-99d9-fc321eb9668f STATE: SUCCEEDED START_TIME: 2021-10-13T03:38:03.019148617Z END_TIME: 2021-10-13T03:38:03.249705805Z NAME: projects/606789101455/locations/us-central1/workflows/myFirstWorkflow/executions/a6319d9d-36a6-4117-904e-3d1118bdc90a STATE: SUCCEEDED START_TIME: 2021-10-13T17:28:51.492864252Z END_TIME: 2021-10-13T17:28:52.227212414Z上記の例の
NAMEフィールドで、a6319d9d-36a6-4117-904e-3d1118bdc90aはワークフロー実行の ID です。次のステップで使用するため、実行 ID をコピーします。実行ステータスを表示するには、次のコマンドを実行します。
gcloud workflows executions describe WORKFLOW_EXECUTION_ID --workflow=${MY_WORKFLOW}WORKFLOW_EXECUTION_IDは、ファイルがバケットにアップロードされた時刻に対応するワークフロー実行の ID に置き換えます。出力は次のようになります。
argument: [...] name: projects/218898424763/locations/us-central1/workflows/myEventWorkflow/executions/86d2567b-0f1e-49b3-8b10-cdac5d0f6239 result: '{"bucket":"PROJECT_ID-bucket","object":"random.txt"}' startTime: '2021-10-13T03:38:03.019148617Z' state: SUCCEEDEDCloud Storage バケットが更新されている時刻
"timeCreated": "2021-10-13T03:38"と、ワークフロー実行のstartTimeが互いに対応していることを確認します。
これで、Eventarc を使用した Workflows イベント レシーバーをトリガーする Cloud Storage イベントが正常に生成されました。
クリーンアップ
このページで使用したリソースについて、アカウントに課金されないようにするには、リソースを含むプロジェクトを削除します。 Google Cloud Google Cloud
作成したワークフローを削除します。
gcloud workflows delete ${MY_WORKFLOW}続行を確認するメッセージが表示されたら、「
y」と入力します。ストレージ バケットを削除します。
gcloud storage rm gs://${PROJECT_ID}-bucket/ --recursiveこのチュートリアルで作成したワークフローを削除します。
gcloud eventarc triggers delete storage-events-triggerまた、プロジェクトを削除して、料金が発生しないようにすることもできます。 Google Cloud プロジェクトを削除すると、そのプロジェクト内で使用されているすべてのリソースに対する課金が停止します。 Google Cloud
プロジェクトを削除します。 Google Cloud
gcloud projects delete PROJECT_ID