如何编写监视存储桶的云功能?

时间:2019-09-13 11:29:30

标签: python google-cloud-functions google-cloud-storage google-cloud-pubsub

我已经设置了一个Google Cloud Storage存储桶,以将通知发送到发布/订阅主题:

gsutil notification create -t my-topic -f json gs://test-bucket

我已经创建了对此主题的订阅,以将消息推送到云功能端点:

gcloud pubsub subscriptions create my-sub --topic my-topic

然后使用以下功能部署云功能

gcloud functions deploy promo_received --region europe-west1 --runtime python37 --trigger-topic my-topic

此功能(现在)的目的是检查在测试桶中创建的文件是否与特定文件名匹配,并在此情况下向Slack发送消息。当前功能如下:

def promo_received(data):
    date_str = datetime.today().strftime('%Y%m%d')
    filename = json.loads(data)["name"]
    bucket = json.loads(data)["bucket"]

    if filename == 'PROM_DTLS_{}.txt.gz'.format(date_str):
        msg = ":heavy_check_mark: *{}* has been uploaded to *{}*. Awaiting instructions.".format(filename, bucket)
        post_to_slack(url, msg)

当我通过删除名为PROM_DTLS_20190913.txt.gz的文件进行测试时,我可以看到该函数触发了,但是它崩溃并出现2个错误:

TypeError: promo_received() takes 1 positional argument but 2 were given

TypeError: the JSON object must be str, bytes or bytearray, not LocalProxy

这是我第一次尝试这样做,我不确定从哪里开始进行故障排除。任何帮助将不胜感激!

2 个答案:

答案 0 :(得分:2)

您需要为函数添加context作为参数,这将解决第一个错误:

def promo_received(data, context):
    [...]

此外,您不需要json.loads来检索文件或存储桶的名称:

data['name']
data['bucket']

这应该消除第二个错误。

Google Cloud Storage Triggers文档页面上查看示例

答案 1 :(得分:0)

要编写Python Cloud Function,请查看this example。请注意,Cloud Storage serializes the object into a utf-8 JSON string,然后由Cloud Functions对base64进行编码。因此,您需要首先对有效负载进行base64解码,然后对其进行utf8解码,然后进行JSON解析。

def promo_received(event, context):
  obj = json.loads(base64.b64decode(event['data']).decode('utf-8'))
  filename = obj[“name”]
  bucket = obj[“bucket”]

  # the rest of your code goes here