谷歌pubsub进入HTTP触发云功能?

问题描述 投票:3回答:3

是否可以触发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.

这似乎表明这只允许我拥有的主题,这是一个奇怪的限制。

google-cloud-functions google-cloud-pubsub
3个回答
0
投票

您遇到的错误似乎是您在发出的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

你是否在命令中间添加换行符?


0
投票

目前,Cloud Functions不允许创建一个函数来接收不同项目中主题的消息。因此,指定包含“projects / pubsub-public-data”的完整路径不起作用。用于为主题部署云功能的gcloud命令仅需要主题名称(而不是完整的资源路径)。由于完整资源路径包含“/”字符,因此它不是有效的规范并导致您看到的错误。


0
投票

可以从pub / sub主题发布到云功能。我正在寻找一种方法从项目A中的主题发布到项目B中的函数。这对于常规主题触发器是不可能的,但是可以使用http-trigger。要遵循的步骤:

  • 在Project B中创建一个基本的http触发函数。
  • 在项目A中创建主题。
  • 在项目A中的该主题上创建订阅。作为推送端点,从项目B中的函数中选择URL: https://YOUR_REGION-YOUR_PROJECT_ID.cloudfunctions.net/FUNCTION_NAME/?token=[randomstring] 选择要在其下发送实际消息的服务帐户。作为受众,您可以选择自己的域名(例如example.com)。 enter image description here
  • 现在您可能因为错误而无法保存订阅,这是因为Google未验证端点。因此,您需要在以下位置将功能URL列入白名单:API&Services>凭据>域验证。
  • 接下来,我们需要在您的云函数中添加以下(python示例)行中的内容,以允许Google验证该函数: 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-379823198https://cloud.google.com/functions/docs/calling/http

© www.soinside.com 2019 - 2024. All rights reserved.