我已经设置了一个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
这是我第一次尝试这样做,我不确定从哪里开始进行故障排除。任何帮助将不胜感激!
答案 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