Google cloud platform 谷歌云功能“;“触发桶”;没有按预期工作

Google cloud platform 谷歌云功能“;“触发桶”;没有按预期工作,google-cloud-platform,google-cloud-functions,google-cloud-storage,Google Cloud Platform,Google Cloud Functions,Google Cloud Storage,我制作了一个简单的云函数,它应该将文件操作的细节记录在一个云存储桶中 我使用以下命令部署了它:gcloud函数deploy bucket\u logger--runtime=python37--memory=256--region=us-east1--entry point=bucket\u logger\u函数--trigger bucket=[bucket\u NAME] def bucket_logger_function(data, context): id = context.

我制作了一个简单的云函数,它应该将文件操作的细节记录在一个云存储桶中

我使用以下命令部署了它:
gcloud函数deploy bucket\u logger--runtime=python37--memory=256--region=us-east1--entry point=bucket\u logger\u函数--trigger bucket=[bucket\u NAME]

def bucket_logger_function(data, context):
    id = context.event_id
    type = context.event_type

    print('Event ID: ' + id)
    print('Event Type: ' + type)

    if type == 'google.storage.object.finalize':
            print('File created: ' + data['name'])
    elif type == 'google.storage.objects.delete':
            print('File deleted: ' + data['name'])
    elif type == 'google.storage.objects.metadataUpdate':
            print('Metadata updated: ' + data['name'])
    else:
            print('File archived: ' + data['name'])
我希望每当我上传、删除、存档和更新bucket中任何对象的元数据时,该函数都会触发,但它仅在上传文件时才会触发


我会错过什么?没有提到这方面的任何具体内容,它声称上述操作将起作用。

请仔细查看文档:

使用标志--trigger resource MY_resource和--trigger event MY_event是为后台函数指定触发器的最显式方法。但是,gcloud为发布/订阅和云存储提供了速记:

是shorhands。因此,它隐式地为您执行选择。为了了解该命令的更多功能,我建议您使用选项
--log http
来查看执行gcloud的http调用。对于这个命令,有很多,在某个时刻,我得到了这个

==== request start ====
uri: https://cloudfunctions.googleapis.com/v1/projects/<MyProject>/locations/us-central1/functions?alt=json
method: POST
== headers start ==
b'Authorization': --- Token Redacted ---
b'accept': b'application/json'
b'accept-encoding': b'gzip, deflate'
b'content-length': b'903'
b'content-type': b'application/json'
b'user-agent': b'google-cloud-sdk gcloud/293.0.0 command/gcloud.functions.deploy invocation-id/480b4938d2e1469bab2e1a236c5ac53a environment/devshell environment-version/None interactive/True from-script/False python/3.7.3 term/screen (Linux 4.1
9.112+)'
== headers end ==
== body start ==
{"eventTrigger": {"eventType": "google.storage.object.finalize", "resource": "projects/_/buckets/<myBucket>"}, ....
==请求启动====
uri:https://cloudfunctions.googleapis.com/v1/projects//locations/us-central1/functions?alt=json
方法:邮寄
==标题开始==
b‘授权’:---令牌已编辑---
b'accept':b'application/json'
b'accept-encoding':b'gzip,deflate'
b'content-length':b'903'
b'content-type':b'application/json'
b'user-agent':b'google-cloud-sdk gcloud/293.0.0 command/gcloud.functions.deploy调用id/480b4938d2e1469bab2e1a236c5ac53a环境/devshell环境版本/None interactive/True from script/False python/3.7.3 term/screen(Linux 4.1
9.112+)'
==标题结束==
==车身启动==
{“eventTrigger”:{“eventType”:“google.storage.object.finalize”,“resource”:“projects/\uu/bucket/”}。。。。
您可以看到
“eventType”:“google.storage.object.finalize”
,因此您看到的行为是正确的。只有当文件最终确定并且事件触发到您的函数时,您才能看到。此选项已为您做出

现在,如何解决您的用例

  • 部署4个云函数,每种事件类型一个(完成、删除、元数据更新和归档)(不是我最喜欢的建议,请参见下文)
  • 创建一个PubSub主题。创建4个,每个事件类型一个。然后将函数插入PubSub主题
    --trigger topic=…
    ,而不是
    --trigger bucket=…

仔细查看文档:

使用标志--trigger resource MY_resource和--trigger event MY_event是为后台函数指定触发器的最明确的方法。但是,gcloud提供了发布/订阅和云存储的简写:

这是shorhands。因此,它隐式地为您执行选择。为了了解该命令的更多功能,我建议您使用选项
--log http
来查看执行gcloud的http调用。对于该命令,有很多内容,现在我得到了这些

==== request start ====
uri: https://cloudfunctions.googleapis.com/v1/projects/<MyProject>/locations/us-central1/functions?alt=json
method: POST
== headers start ==
b'Authorization': --- Token Redacted ---
b'accept': b'application/json'
b'accept-encoding': b'gzip, deflate'
b'content-length': b'903'
b'content-type': b'application/json'
b'user-agent': b'google-cloud-sdk gcloud/293.0.0 command/gcloud.functions.deploy invocation-id/480b4938d2e1469bab2e1a236c5ac53a environment/devshell environment-version/None interactive/True from-script/False python/3.7.3 term/screen (Linux 4.1
9.112+)'
== headers end ==
== body start ==
{"eventTrigger": {"eventType": "google.storage.object.finalize", "resource": "projects/_/buckets/<myBucket>"}, ....
==请求启动====
uri:https://cloudfunctions.googleapis.com/v1/projects//locations/us-central1/functions?alt=json
方法:邮寄
==标题开始==
b‘授权’:---令牌已编辑---
b'accept':b'application/json'
b'accept-encoding':b'gzip,deflate'
b'content-length':b'903'
b'content-type':b'application/json'
b'user-agent':b'google-cloud-sdk gcloud/293.0.0 command/gcloud.functions.deploy调用id/480b4938d2e1469bab2e1a236c5ac53a环境/devshell环境版本/None interactive/True from script/False python/3.7.3 term/screen(Linux 4.1
9.112+)'
==标题结束==
==车身启动==
{“eventTrigger”:{“eventType”:“google.storage.object.finalize”,“resource”:“projects/\uu/bucket/”}。。。。
您可以看到
“eventType”:“google.storage.object.finalize”
,因此您看到的行为是正确的。只有当文件最终确定并且事件触发到您的函数时,您才能看到。此选项已为您做出

现在,如何解决您的用例

  • 部署4个云函数,每种事件类型一个(完成、删除、元数据更新和归档)(不是我最喜欢的建议,请参见下文)
  • 创建一个PubSub主题。创建4个,每个事件类型一个。然后将函数插入PubSub主题
    --trigger topic=…
    ,而不是
    --trigger bucket=…

我尝试了启用发布/订阅通知的方法,修改了您的代码,但缺少了应该包含contentType的属性部分

def bucket_logger_function(event, context):
    import base64
    import json

    # Print Event Type and Event ID
    print('Event ID: ' + context.event_id)
    print('Event Type: ' + context.event_type)

    # Print Attributes  <-- This is the part that fails
    attributes = base64.b64decode(event['attributes']).decode('utf-8')
    print(attributes['eventType'])

    # Print Payload
    payload = json.loads(base64.b64decode(event['data']).decode('utf-8'))
    print(payload['name'])
    print(payload['bucket'])
def bucket_logger_函数(事件、上下文):
导入base64
导入json
#打印事件类型和事件ID
打印('Event ID:'+context.Event\u ID)
打印('事件类型:'+context.Event_类型)

#打印属性我尝试了启用发布/订阅通知的方法,修改了您的代码,但是缺少了应该包含contentType的属性部分

def bucket_logger_function(event, context):
    import base64
    import json

    # Print Event Type and Event ID
    print('Event ID: ' + context.event_id)
    print('Event Type: ' + context.event_type)

    # Print Attributes  <-- This is the part that fails
    attributes = base64.b64decode(event['attributes']).decode('utf-8')
    print(attributes['eventType'])

    # Print Payload
    payload = json.loads(base64.b64decode(event['data']).decode('utf-8'))
    print(payload['name'])
    print(payload['bucket'])
def bucket_logger_函数(事件、上下文):
导入base64
导入json
#打印事件类型和事件ID
打印('Event ID:'+context.Event\u ID)
打印('事件类型:'+context.Event_类型)
#打印属性