【发布时间】: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