【问题标题】:Can't deploy cloud function with vpc serverless connector无法使用 vpc 无服务器连接器部署云功能
【发布时间】:2020-11-29 12:50:16
【问题描述】:

我已将网络配置为通过无服务器 VPC 访问将静态 IP 用于出口流量。

我可以用一个简单的函数进行测试:

exports.echo = functions.https.onRequest(async (req, res) => {
  const options = {
    'method': 'GET',
    'url': 'https://postman-echo.com/ip',
 };
  request(options, function (error, response) {
    if (error) throw new Error(error);
    res.json(JSON.parse(response.body));
  });
})

它可以返回我配置的相同 IP。

但是当我尝试部署我想使用出口设置的实际功能时,我收到undefined 错误:

$ gcloud functions deploy sendTransaction --vpc-connector vault-connector --egress-settings all
Deploying function (may take a while - up to 2 minutes)...failed.                                                                                                                                                
ERROR: (gcloud.functions.deploy) OperationError: code=3, message=Function failed on loading user code. Error message: Error: please examine your function logs to see the error cause: https://cloud.google.com/functions/docs/monitoring/logging#viewing_logs

日志不是很有帮助:

$ gcloud functions logs read sendTransaction
sendTransaction      2020-08-09 20:51:18.909  Provided module can't be loaded.
sendTransaction      2020-08-09 20:51:18.909  Is there a syntax error in your code?
sendTransaction      2020-08-09 20:51:18.909  Detailed stack trace: undefined
sendTransaction      2020-08-09 20:51:18.910  Could not load the function, shutting down.
sendTransaction      2020-08-09 20:51:19.760  Error: function terminated. Recommended action: inspect logs for termination reason. Function cannot be initialized.

没有堆栈跟踪。如日志所示,这可能是语法错误,但通过 firebase cli 正确部署了完全相同的功能:

$ firebase deploy --only functions:sendTransaction

=== Deploying to 'xxxx'...

i  deploying functions
i  functions: ensuring required API cloudfunctions.googleapis.com is enabled...
i  functions: ensuring required API cloudbuild.googleapis.com is enabled...
✔  functions: required API cloudbuild.googleapis.com is enabled
✔  functions: required API cloudfunctions.googleapis.com is enabled
i  functions: preparing functions directory for uploading...
i  functions: packaged functions (805.19 KB) for uploading
✔  functions: functions folder uploaded successfully
i  functions: current functions in project: sendTransaction(us-central1)
i  functions: uploading functions in project: sendTransaction(us-central1)
i  functions: updating Node.js 12 function sendTransaction(us-central1)...
i  scheduler: ensuring required API cloudscheduler.googleapis.com is enabled...
i  pubsub: ensuring required API pubsub.googleapis.com is enabled...
✔  scheduler: required API cloudscheduler.googleapis.com is enabled
✔  pubsub: required API pubsub.googleapis.com is enabled
i  functions: scheduler job firebase-schedule-sendTransaction-us-central1 is up to date, no changes required
✔  functions[sendTransaction(us-central1)]: Successful update operation. 

✔  Deploy complete!

值得一提的是,这是一个 pub/sub 触发函数。

在使用 firebase cli 和 gcloud cli 部署之间是否存在已知的不兼容性,可能会导致此类行为?

编辑:按照建议添加标志 --verbosity debug 的输出:

Traceback (most recent call last):
  File "/usr/lib/google-cloud-sdk/lib/googlecloudsdk/calliope/cli.py", line 983, in Execute
    resources = calliope_command.Run(cli=self, args=args)
  File "/usr/lib/google-cloud-sdk/lib/googlecloudsdk/calliope/backend.py", line 808, in Run
    resources = command_instance.Run(args)
  File "/usr/lib/google-cloud-sdk/lib/surface/functions/deploy.py", line 352, in Run
    return _Run(args, track=self.ReleaseTrack())
  File "/usr/lib/google-cloud-sdk/lib/surface/functions/deploy.py", line 304, in _Run
    api_util.WaitForFunctionUpdateOperation(
  File "/usr/lib/google-cloud-sdk/lib/googlecloudsdk/api_lib/functions/util.py", line 318, in CatchHTTPErrorRaiseHTTPExceptionFn
    return func(*args, **kwargs)
  File "/usr/lib/google-cloud-sdk/lib/googlecloudsdk/api_lib/functions/util.py", line 367, in WaitForFunctionUpdateOperation
    operations.Wait(op, client.MESSAGES_MODULE, client, _DEPLOY_WAIT_NOTICE,
  File "/usr/lib/google-cloud-sdk/lib/googlecloudsdk/api_lib/functions/operations.py", line 150, in Wait
    _WaitForOperation(client, request, notice, try_set_invoker,
  File "/usr/lib/google-cloud-sdk/lib/googlecloudsdk/api_lib/functions/operations.py", line 113, in _WaitForOperation
    retryer.RetryOnResult(_GetOperationStatus,
  File "/usr/lib/google-cloud-sdk/lib/googlecloudsdk/core/util/retry.py", line 219, in RetryOnResult
    result = func(*args, **kwargs)
  File "/usr/lib/google-cloud-sdk/lib/googlecloudsdk/api_lib/functions/operations.py", line 73, in _GetOperationStatus
    raise exceptions.FunctionsError(OperationErrorToString(op.error))

【问题讨论】:

  • 日志确实没有帮助,尝试在部署命令上使用--verbosity debug 标志来检查是否有更多详细信息。让我知道结果。
  • 对,@ralemos,我更新了问题以包含输出。
  • 另外,我将尝试重新安装我的云 sdk groups.google.com/g/google-appengine/c/r7mADCM4LNg
  • 此错误可能意味着以下两种情况之一,即您的项目未启用计费,您可以检查如何启用它here,或者缺少文件或没有正确的文件名称,请仔细检查文件名,如果您有 .gcloudignore,请检查其内容以确保您的部署没有忽略任何相关文件。
  • Ok... 计费已启用(同一项目中还有其他功能),.gloudignore 看起来不错(只是忽略 git 文件和 node_modules),它似乎不是参考或语法问题,因为相同的功能通过firebase cli成功部署......而且一个更简单的功能也可以使用vpc进行部署。不知道还能是什么。

标签: firebase google-cloud-functions gcloud vpc


【解决方案1】:

问题与环境变量有关。 Firebase 和 gcloud 部署不共享 env var,您需要在使用 gcloud 部署时传递您的 env var。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-10-28
    • 2017-02-13
    • 2018-12-29
    • 1970-01-01
    • 2020-10-15
    • 2021-11-17
    相关资源
    最近更新 更多