无法使用VPC无服务器连接器部署云功能

时间:2020-08-09 21:07:19

标签: firebase google-cloud-functions gcloud vpc

我已将网络配置为通过无服务器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!

值得一提的是这是一个发布/订阅触发功能。

使用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))

1 个答案:

答案 0 :(得分:2)

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

相关问题