本简易教程演示了如何使用 Cloud Storage 触发器编写、部署和触发 Cloud Run functions 事件驱动函数来响应 Cloud Storage 事件。
如果您要查找使用 Cloud Storage 的代码示例,请访问 Google Cloud 示例浏览器。
目标
- 编写和部署 Cloud Run functions 事件驱动函数。
- 通过将文件上传到 Cloud Storage 来触发函数。
费用
在本文档中,您将使用 Google Cloud 的以下收费组件:
- Cloud Run functions
- Cloud Build
- Pub/Sub
- Cloud Storage
- Artifact Registry
- Eventarc
- Cloud Logging
For details, see Cloud Run functions pricing.
准备工作
- 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 Cloud Functions, Cloud Build, Artifact Registry, Eventarc, Logging, and Pub/Sub APIs.
- Install the Google Cloud CLI.
-
To initialize the gcloud CLI, run the following command:
gcloud init
-
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 Cloud Functions, Cloud Build, Artifact Registry, Eventarc, Logging, and Pub/Sub APIs.
- Install the Google Cloud CLI.
-
To initialize the gcloud CLI, run the following command:
gcloud init
-
准备开发环境:
Node.js
Python
Go
Java
C#
Ruby
PHP
如果您已经安装 gcloud CLI,请运行以下命令进行更新:
gcloud components update
前提条件
创建一个区域级存储桶,其中
YOUR_BUCKET_NAME
是全局唯一的存储桶名称,REGION
是您计划在其中部署函数的区域:gcloud storage buckets create gs://YOUR_BUCKET_NAME --location=REGION
要使用 Cloud Storage 函数,请将
pubsub.publisher
角色授予 Cloud Storage 服务账号:PROJECT_ID=$(gcloud config get-value project) PROJECT_NUMBER=$(gcloud projects list --filter="project_id:$PROJECT_ID" --format='value(project_number)') 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
准备应用
将示例应用代码库克隆到本地机器:
Node.js
git clone https://github.com/GoogleCloudPlatform/nodejs-docs-samples.git
或者,您也可以下载该示例的 zip 文件并将其解压缩。
Python
git clone https://github.com/GoogleCloudPlatform/python-docs-samples.git
或者,您也可以下载该示例的 zip 文件并将其解压缩。
Go
git clone https://github.com/GoogleCloudPlatform/golang-samples.git
或者,您也可以下载该示例的 zip 文件并将其解压缩。
Java
git clone https://github.com/GoogleCloudPlatform/java-docs-samples.git
或者,您也可以下载该示例的 zip 文件并将其解压缩。
C#
git clone https://github.com/GoogleCloudPlatform/dotnet-docs-samples.git
或者,您也可以下载该示例的 zip 文件并将其解压缩。
Ruby
git clone https://github.com/GoogleCloudPlatform/ruby-docs-samples.git
或者,您也可以下载该示例的 zip 文件并将其解压缩。
PHP
git clone https://github.com/GoogleCloudPlatform/php-docs-samples.git
或者,您也可以下载该示例的 zip 文件并将其解压缩。
切换到包含 Cloud Run functions 示例代码的目录:
Node.js
cd nodejs-docs-samples/functions/v2/helloGCS/
Python
cd python-docs-samples/functions/v2/storage/
Go
cd golang-samples/functions/functionsv2/hellostorage/
Java
cd java-docs-samples/functions/v2/hello-gcs/
C#
cd dotnet-docs-samples/functions/helloworld/HelloGcs/
Ruby
cd ruby-docs-samples/functions/helloworld/storage/
PHP
cd php-docs-samples/functions/helloworld_storage/
部署和触发函数
Cloud Storage 函数基于 Cloud Storage 发出的 Pub/Sub 通知,并且支持类似事件类型:
以下部分介绍如何为每种类型的事件部署和触发函数。
完成对象创建
当 Cloud Storage 对象的“写入”成功完成后,“完成对象创建”事件会被触发。具体而言,这意味着创建新对象或覆盖现有对象会触发此事件。此触发器会忽略归档操作和元数据更新操作。
完成对象创建:部署函数
查看处理 Cloud Storage 事件的示例函数:
Node.js
Python
Go
Java
C#
Ruby
PHP
如需部署该函数,请在示例代码所在的目录中运行以下命令:
Node.js
gcloud functions deploy nodejs-finalize-function \ --gen2 \ --runtime=nodejs20 \ --region=REGION
\ --source=. \ --entry-point=helloGCS \
--trigger-event-filters="type=google.cloud.storage.object.v1.finalized" \
--trigger-event-filters="bucket=YOUR_BUCKET_NAME"
使用 --runtime
标志可以指定支持的 Node.js 版本的运行时 ID 来运行您的函数。
Python
gcloud functions deploy python-finalize-function \ --gen2 \ --runtime=python312 \ --region=REGION
\ --source=. \ --entry-point=hello_gcs \
--trigger-event-filters="type=google.cloud.storage.object.v1.finalized" \
--trigger-event-filters="bucket=YOUR_BUCKET_NAME"
使用 --runtime
标志可以指定支持的 Python 版本的运行时 ID 来运行您的函数。
Go
gcloud functions deploy go-finalize-function \ --gen2 \ --runtime=go121 \ --region=REGION
\ --source=. \ --entry-point=HelloStorage \
--trigger-event-filters="type=google.cloud.storage.object.v1.finalized" \
--trigger-event-filters="bucket=YOUR_BUCKET_NAME"
Java
gcloud functions deploy java-finalize-function \ --gen2 \ --runtime=java17 \ --region=REGION
\ --source=. \ --entry-point=functions.HelloGcs \ --memory=512MB \
--trigger-event-filters="type=google.cloud.storage.object.v1.finalized" \
--trigger-event-filters="bucket=YOUR_BUCKET_NAME"
使用 --runtime
标志可以指定支持的 Java 版本的运行时 ID 来运行您的函数。
C#
gcloud functions deploy csharp-finalize-function \ --gen2 \ --runtime=dotnet6 \ --region=REGION
\ --source=. \ --entry-point=HelloGcs.Function \
--trigger-event-filters="type=google.cloud.storage.object.v1.finalized" \
--trigger-event-filters="bucket=YOUR_BUCKET_NAME"
使用 --runtime
标志可以指定支持的 .NET 版本的运行时 ID 来运行您的函数。
Ruby
gcloud functions deploy ruby-finalize-function \ --gen2 \ --runtime=ruby32 \ --region=REGION
\ --source=. \ --entry-point=hello_gcs \
--trigger-event-filters="type=google.cloud.storage.object.v1.finalized" \
--trigger-event-filters="bucket=YOUR_BUCKET_NAME"
使用 --runtime
标志可以指定支持的 Ruby 版本的运行时 ID 来运行您的函数。
PHP
gcloud functions deploy php-finalize-function \ --gen2 \ --runtime=php82 \ --region=REGION
\ --source=. \ --entry-point=helloGCS \
--trigger-event-filters="type=google.cloud.storage.object.v1.finalized" \
--trigger-event-filters="bucket=YOUR_BUCKET_NAME"
使用 --runtime
标志可以指定支持的 PHP 版本的运行时 ID 来运行您的函数。
替换以下内容:
- REGION:要在其中部署函数的 Google Cloud 区域的名称(例如
us-west1
)。 - YOUR_BUCKET_NAME:触发函数的 Cloud Storage 存储桶的名称。部署 Cloud Run functions 时,请仅指定不含前导
gs://
的存储桶名称;例如--trigger-event-filters="bucket=my-bucket"
。
对象完成:触发函数
通过将文件上传到存储桶来测试函数:
echo "Hello World" > test-finalize.txt gcloud storage cp test-finalize.txt gs://YOUR_BUCKET_NAME/test-finalize.txt
您应该会在日志中看到已接收到的 CloudEvent:
gcloud functions logs read YOUR_FUNCTION_NAME --region REGION --gen2 --limit=10
对象删除
对于未启用版本控制的存储桶,对象删除事件最实用。这些事件会在对象的旧版本被删除时触发。另外,当对象被覆盖时,这些事件也会触发。对象删除触发器也可以用于启用了版本控制的存储桶。当对象的某个版本被永久删除时,会触发此类触发器。
对象删除:部署函数
使用与“完成创建”示例相同的示例代码,以对象删除作为触发器事件来部署函数。在示例代码所在的目录中运行以下命令:
Node.js
gcloud functions deploy nodejs-delete-function \ --gen2 \ --runtime=nodejs20 \ --region=REGION
\ --source=. \ --entry-point=helloGCS \
--trigger-event-filters="type=google.cloud.storage.object.v1.deleted" \
--trigger-event-filters="bucket=YOUR_BUCKET_NAME"
使用 --runtime
标志可以指定支持的 Node.js 版本的运行时 ID 来运行您的函数。
Python
gcloud functions deploy python-delete-function \ --gen2 \ --runtime=python312 \ --region=REGION
\ --source=. \ --entry-point=hello_gcs \
--trigger-event-filters="type=google.cloud.storage.object.v1.deleted" \
--trigger-event-filters="bucket=YOUR_BUCKET_NAME"
使用 --runtime
标志可以指定支持的 Python 版本的运行时 ID 来运行您的函数。
Go
gcloud functions deploy go-delete-function \ --gen2 \ --runtime=go121 \ --region=REGION
\ --source=. \ --entry-point=HelloStorage \
--trigger-event-filters="type=google.cloud.storage.object.v1.deleted" \
--trigger-event-filters="bucket=YOUR_BUCKET_NAME"
Java
gcloud functions deploy java-delete-function \ --gen2 \ --runtime=java17 \ --region=REGION
\ --source=. \ --entry-point=functions.HelloGcs \ --memory=512MB \
--trigger-event-filters="type=google.cloud.storage.object.v1.deleted" \
--trigger-event-filters="bucket=YOUR_BUCKET_NAME"
使用 --runtime
标志可以指定支持的 Java 版本的运行时 ID 来运行您的函数。
C#
gcloud functions deploy csharp-delete-function \ --gen2 \ --runtime=dotnet6 \ --region=REGION
\ --source=. \ --entry-point=HelloGcs.Function \
--trigger-event-filters="type=google.cloud.storage.object.v1.deleted" \
--trigger-event-filters="bucket=YOUR_BUCKET_NAME"
使用 --runtime
标志可以指定支持的 .NET 版本的运行时 ID 来运行您的函数。
Ruby
gcloud functions deploy ruby-delete-function \ --gen2 \ --runtime=ruby32 \ --region=REGION
\ --source=. \ --entry-point=hello_gcs \
--trigger-event-filters="type=google.cloud.storage.object.v1.deleted" \
--trigger-event-filters="bucket=YOUR_BUCKET_NAME"
使用 --runtime
标志可以指定支持的 Ruby 版本的运行时 ID 来运行您的函数。
PHP
gcloud functions deploy php-delete-function \ --gen2 \ --runtime=php82 \ --region=REGION
\ --source=. \ --entry-point=helloGCS \
--trigger-event-filters="type=google.cloud.storage.object.v1.deleted" \
--trigger-event-filters="bucket=YOUR_BUCKET_NAME"
使用 --runtime
标志可以指定支持的 PHP 版本的运行时 ID 来运行您的函数。
替换以下内容:
- REGION:要在其中部署函数的 Google Cloud 区域的名称(例如
us-west1
)。 - YOUR_BUCKET_NAME:触发函数的 Cloud Storage 存储桶的名称。部署 Cloud Run functions 时,请仅指定不含前导
gs://
的存储桶名称;例如--trigger-event-filters="bucket=my-bucket"
。
对象删除:触发函数
如需触发函数,请执行以下操作:
在示例代码所在的目录中创建一个空
test-delete.txt
文件。确保您的存储桶未启用版本控制:
gcloud storage buckets update gs://YOUR_BUCKET_NAME --no-versioning
将该文件上传到 Cloud Storage:
gcloud storage cp test-delete.txt gs://YOUR_BUCKET_NAME
其中,
YOUR_BUCKET_NAME
是您要向其中上传测试文件的 Cloud Storage 存储桶的名称。此时,函数应该尚未执行。删除该文件以触发函数:
gcloud storage rm gs://YOUR_BUCKET_NAME/test-delete.txt
您应该会在日志中看到已接收到的 CloudEvent:
gcloud functions logs read YOUR_FUNCTION_NAME --region REGION --gen2 --limit=10
请注意,函数可能需要一些时间才能执行完毕。
对象归档
对象归档事件只能用于启用了版本控制的存储桶。这些事件会在对象的早期版本被归档时触发。具体而言,这意味着当对象被覆盖或删除时,归档事件会被触发。
对象归档:部署函数
使用与“完成创建”示例相同的示例代码,以对象归档作为触发器事件来部署函数。在示例代码所在的目录中运行以下命令:
Node.js
gcloud functions deploy nodejs-archive-function \ --gen2 \ --runtime=nodejs20 \ --region=REGION
\ --source=. \ --entry-point=helloGCS \
--trigger-event-filters="type=google.cloud.storage.object.v1.archived" \
--trigger-event-filters="bucket=YOUR_BUCKET_NAME"
使用 --runtime
标志可以指定支持的 Node.js 版本的运行时 ID 来运行您的函数。
Python
gcloud functions deploy python-archive-function \ --gen2 \ --runtime=python312 \ --region=REGION
\ --source=. \ --entry-point=hello_gcs \
--trigger-event-filters="type=google.cloud.storage.object.v1.archived" \
--trigger-event-filters="bucket=YOUR_BUCKET_NAME"
使用 --runtime
标志可以指定支持的 Python 版本的运行时 ID 来运行您的函数。
Go
gcloud functions deploy go-archive-function \ --gen2 \ --runtime=go121 \ --region=REGION
\ --source=. \ --entry-point=HelloStorage \
--trigger-event-filters="type=google.cloud.storage.object.v1.archived" \
--trigger-event-filters="bucket=YOUR_BUCKET_NAME"
Java
gcloud functions deploy java-archive-function \ --gen2 \ --runtime=java17 \ --region=REGION
\ --source=. \ --entry-point=functions.HelloGcs \ --memory=512MB \
--trigger-event-filters="type=google.cloud.storage.object.v1.archived" \
--trigger-event-filters="bucket=YOUR_BUCKET_NAME"
使用 --runtime
标志可以指定支持的 Java 版本的运行时 ID 来运行您的函数。
C#
gcloud functions deploy csharp-archive-function \ --gen2 \ --runtime=dotnet6 \ --region=REGION
\ --source=. \ --entry-point=HelloGcs.Function \
--trigger-event-filters="type=google.cloud.storage.object.v1.archived" \
--trigger-event-filters="bucket=YOUR_BUCKET_NAME"
使用 --runtime
标志可以指定支持的 .NET 版本的运行时 ID 来运行您的函数。
Ruby
gcloud functions deploy ruby-archive-function \ --gen2 \ --runtime=ruby32 \ --region=REGION
\ --source=. \ --entry-point=hello_gcs \
--trigger-event-filters="type=google.cloud.storage.object.v1.archived" \
--trigger-event-filters="bucket=YOUR_BUCKET_NAME"
使用 --runtime
标志可以指定支持的 Ruby 版本的运行时 ID 来运行您的函数。
PHP
gcloud functions deploy php-archive-function \ --gen2 \ --runtime=php82 \ --region=REGION
\ --source=. \ --entry-point=helloGCS \
--trigger-event-filters="type=google.cloud.storage.object.v1.archived" \
--trigger-event-filters="bucket=YOUR_BUCKET_NAME"
使用 --runtime
标志可以指定支持的 PHP 版本的运行时 ID 来运行您的函数。
替换以下内容:
- REGION:要在其中部署函数的 Google Cloud 区域的名称(例如
us-west1
)。 - YOUR_BUCKET_NAME:触发函数的 Cloud Storage 存储桶的名称。部署 Cloud Run functions 时,请仅指定不含前导
gs://
的存储桶名称;例如--trigger-event-filters="bucket=my-bucket"
。
对象归档:触发函数
如需触发函数,请执行以下操作:
在示例代码所在的目录中创建一个空
test-archive.txt
文件。确保您的存储桶已启用版本控制:
gcloud storage buckets update gs://YOUR_BUCKET_NAME --versioning
将该文件上传到 Cloud Storage:
gcloud storage cp test-archive.txt gs://YOUR_BUCKET_NAME
其中,
YOUR_BUCKET_NAME
是您要向其中上传测试文件的 Cloud Storage 存储桶的名称。此时,函数应该尚未执行。归档该文件以触发函数:
gcloud storage rm gs://YOUR_BUCKET_NAME/test-archive.txt
您应该会在日志中看到已接收到的 CloudEvent:
gcloud functions logs read YOUR_FUNCTION_NAME --region REGION --gen2 --limit=10
对象元数据更新
当现有对象的元数据更新时,元数据更新事件会被触发。
对象元数据更新:部署函数
使用与“完成创建”示例相同的示例代码,以元数据更新作为触发器事件来部署函数。在示例代码所在的目录中运行以下命令:
Node.js
gcloud functions deploy nodejs-metadata-function \ --gen2 \ --runtime=nodejs20 \ --region=REGION
\ --source=. \ --entry-point=helloGCS \
--trigger-event-filters="type=google.cloud.storage.object.v1.metadataUpdated" \
--trigger-event-filters="bucket=YOUR_BUCKET_NAME"
使用 --runtime
标志可以指定支持的 Node.js 版本的运行时 ID 来运行您的函数。
Python
gcloud functions deploy python-metadata-function \ --gen2 \ --runtime=python312 \ --region=REGION
\ --source=. \ --entry-point=hello_gcs \
--trigger-event-filters="type=google.cloud.storage.object.v1.metadataUpdated" \
--trigger-event-filters="bucket=YOUR_BUCKET_NAME"
使用 --runtime
标志可以指定支持的 Python 版本的运行时 ID 来运行您的函数。
Go
gcloud functions deploy go-metadata-function \ --gen2 \ --runtime=go121 \ --region=REGION
\ --source=. \ --entry-point=HelloStorage \
--trigger-event-filters="type=google.cloud.storage.object.v1.metadataUpdated" \
--trigger-event-filters="bucket=YOUR_BUCKET_NAME"
Java
gcloud functions deploy java-metadata-function \ --gen2 \ --runtime=java17 \ --region=REGION
\ --source=. \ --entry-point=functions.HelloGcs \ --memory=512MB \
--trigger-event-filters="type=google.cloud.storage.object.v1.metadataUpdated" \
--trigger-event-filters="bucket=YOUR_BUCKET_NAME"
使用 --runtime
标志可以指定支持的 Java 版本的运行时 ID 来运行您的函数。
C#
gcloud functions deploy csharp-metadata-function \ --gen2 \ --runtime=dotnet6 \ --region=REGION
\ --source=. \ --entry-point=HelloGcs.Function \
--trigger-event-filters="type=google.cloud.storage.object.v1.metadataUpdated" \
--trigger-event-filters="bucket=YOUR_BUCKET_NAME"
使用 --runtime
标志可以指定支持的 .NET 版本的运行时 ID 来运行您的函数。
Ruby
gcloud functions deploy ruby-metadata-function \ --gen2 \ --runtime=ruby32 \ --region=REGION
\ --source=. \ --entry-point=hello_gcs \
--trigger-event-filters="type=google.cloud.storage.object.v1.metadataUpdated" \
--trigger-event-filters="bucket=YOUR_BUCKET_NAME"
使用 --runtime
标志可以指定支持的 Ruby 版本的运行时 ID 来运行您的函数。
PHP
gcloud functions deploy php-metadata-function \ --gen2 \ --runtime=php82 \ --region=REGION
\ --source=. \ --entry-point=helloGCS \
--trigger-event-filters="type=google.cloud.storage.object.v1.metadataUpdated" \
--trigger-event-filters="bucket=YOUR_BUCKET_NAME"
使用 --runtime
标志可以指定支持的 PHP 版本的运行时 ID 来运行您的函数。
替换以下内容:
- REGION:要在其中部署函数的 Google Cloud 区域的名称(例如
us-west1
)。 - YOUR_BUCKET_NAME:触发函数的 Cloud Storage 存储桶的名称。部署 Cloud Run functions 时,请仅指定不含前导
gs://
的存储桶名称;例如--trigger-event-filters="bucket=my-bucket"
。
对象元数据更新:触发函数
如需触发函数,请执行以下操作:
在示例代码所在的目录中创建一个空
test-metadata.txt
文件。确保您的存储桶未启用版本控制:
gcloud storage buckets update gs://YOUR_BUCKET_NAME --no-versioning
将该文件上传到 Cloud Storage:
gcloud storage cp test-metadata.txt gs://YOUR_BUCKET_NAME
其中,
YOUR_BUCKET_NAME
是您要向其中上传测试文件的 Cloud Storage 存储桶的名称。此时,函数应该尚未执行。更新该文件的元数据:
gcloud storage objects update gs://YOUR_BUCKET_NAME/test-metadata.txt --content-type=text/plain
您应该会在日志中看到已接收到的 CloudEvent:
gcloud functions logs read YOUR_FUNCTION_NAME --region REGION --gen2 --limit=10
清理
为避免因本教程中使用的资源导致您的 Google Cloud 账号产生费用,请删除包含这些资源的项目,或者保留项目但删除各个资源。
删除项目
为了避免产生费用,最简单的方法是删除您为本教程创建的项目。
要删除项目,请执行以下操作:
- 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 functions 不会移除存储在 Cloud Storage 中的任何资源。
如需删除您在本教程中创建的 Cloud Run functions,请运行以下命令:
gcloud functions delete YOUR_FUNCTION_NAME --gen2 --region REGION
您也可以通过 Google Cloud 控制台删除 Cloud Run functions。