是否可以触发HTTP云功能以响应pubsub消息?
在编辑订阅时,谷歌可以将消息推送到HTTPS端点,但出于滥用原因,必须能够证明您拥有域名才能执行此操作,当然您无法证明您拥有谷歌自己的*.cloudfunctions.net
域名,这是他们部署的地方。
我试图订阅的特定主题是公共主题,projects/pubsub-public-data/topics/taxirides-realtime
。答案可能是使用后台函数而不是HTTP触发,但由于不同原因,它不起作用:
gcloud functions deploy echo --trigger-resource projects/pubsub-public-data/topics/taxirides-realtime --trigger-event google.pubsub.topic.publish
ERROR: gcloud crashed (ArgumentTypeError): Invalid value 'projects/pubsub-public-data/topics/taxirides-realtime': Topic must contain only Latin letters (lower- or upper-case), digits and the characters - + . _ ~ %. It must start with a letter and be from 3 to 255 characters long.
这似乎表明这只允许我拥有的主题,这是一个奇怪的限制。
您遇到的错误似乎是您在发出的gcloud命令中拼写错误。
ERROR: gcloud crashed (ArgumentTypeError): Invalid value 'projects/pubsub-public-data/topics/taxirides-realtime': Topic must contain only Latin letters (lower- or upper-case), digits and the characters - + . _ ~ %. It must start with a letter and be from 3 to 255 characters long
你是否在命令中间添加换行符?
目前,Cloud Functions不允许创建一个函数来接收不同项目中主题的消息。因此,指定包含“projects / pubsub-public-data”的完整路径不起作用。用于为主题部署云功能的gcloud
命令仅需要主题名称(而不是完整的资源路径)。由于完整资源路径包含“/”字符,因此它不是有效的规范并导致您看到的错误。
可以从pub / sub主题发布到云功能。我正在寻找一种方法从项目A中的主题发布到项目B中的函数。这对于常规主题触发器是不可能的,但是可以使用http-trigger。要遵循的步骤:
if request.method == 'GET':
return '''
<html>
<head>
<meta name="google-site-verification" content="{token}" />
</head>
<body>
</body>
</html>
'''.format(token=config.SITE_VERIFICATION_CODE)
if (request.args.get('token', '') != '[randomstring]'):
return 'Invalid request', 400
try:
bearer_token = request.headers.get('Authorization')
token = bearer_token.split(' ')[1]
claim = id_token.verify_oauth2_token(token, requests.Request(), audience='example.com')
if claim['iss'] not in [
'accounts.google.com',
'https://accounts.google.com'
]:
raise ValueError('Wrong issuer.')
except Exception as e:
return 'Invalid token: {}\n'.format(e), 400
envelope = json.loads(request.data.decode('utf-8'))
payload = base64.b64decode(envelope['message']['data'])
资料来源:https://github.com/googleapis/nodejs-pubsub/issues/118#issuecomment-379823198,https://cloud.google.com/functions/docs/calling/http