我已将网络配置为通过无服务器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))
答案 0 :(得分:2)
问题与环境变量有关。 Firebase和gcloud部署不共享环境变量,在使用gcloud进行部署时,您需要传递环境变量。