连接超时导致python中lambda函数调用的代码构建项目



我有一个简单的python lambda函数,它调用codebuild项目:

导入json, boto3, time

def handler(event, context):
print(event)
# execute the testsuite (by triggering a codebuild project which executes the soapui TestSuite)
codebuild = boto3.client('codebuild')
print ("hi")
responseStart = codebuild.start_build(projectName="SpSoapUITest")
print (responseStart['build']['id'])
print (responseStart)
# wait 180 seconds to read the result from codeBuild job
time.sleep(180)

# parse the result
response = codebuild.batch_get_builds(
ids=[ str(responseStart['build']['id']) ]
)
if response['builds'][0]['buildStatus'] == 'SUCCEEDED':
status = "Succeeded"
else:
status = "Failed"

# send result to event
try:
codedeploy = boto3.client('codedeploy')
codedeploy.put_lifecycle_event_hook_execution_status(
deploymentId=event["DeploymentId"],
lifecycleEventHookExecutionId=event["LifecycleEventHookExecutionId"],
status=status
)
return True
except codedeploy.exceptions.ClientError as e:
print("Unexpected error: %s" % e)
return False

但在打印hi后超时,说连接超时

[ERROR] ConnectTimeoutError: Connect timeout on endpoint URL: "https://codebuild.eu-central-1.amazonaws.com/"
Traceback (most recent call last):
File "/var/task/spLambda.py", line 8, in handler
responseStart = codebuild.start_build(projectName="mihir-usagemonitor-dev-SpSoapUITest")
File "/var/runtime/botocore/client.py", line 357, in _api_call
return self._make_api_call(operation_name, kwargs)
File "/var/runtime/botocore/client.py", line 662, in _make_api_call
http, parsed_response = self._make_request(
File "/var/runtime/botocore/client.py", line 682, in _make_request
return self._endpoint.make_request(operation_model, request_dict)
File "/var/runtime/botocore/endpoint.py", line 102, in make_request
return self._send_request(request_dict, operation_model)
File "/var/runtime/botocore/endpoint.py", line 136, in _send_request
while self._needs_retry(attempts, operation_model, request_dict,
File "/var/runtime/botocore/endpoint.py", line 253, in _needs_retry
responses = self._event_emitter.emit(
File "/var/runtime/botocore/hooks.py", line 356, in emit
return self._emitter.emit(aliased_event_name, **kwargs)
File "/var/runtime/botocore/hooks.py", line 228, in emit
return self._emit(event_name, kwargs)
File "/var/runtime/botocore/hooks.py", line 211, in _emit
response = handler(**kwargs)
File "/var/runtime/botocore/retryhandler.py", line 183, in __call__
if self._checker(attempts, response, caught_exception):
File "/var/runtime/botocore/retryhandler.py", line 250, in __call__
should_retry = self._should_retry(attempt_number, response,
File "/var/runtime/botocore/retryhandler.py", line 277, in _should_retry
return self._checker(attempt_number, response, caught_exception)
File "/var/runtime/botocore/retryhandler.py", line 316, in __call__
checker_response = checker(attempt_number, response,
File "/var/runtime/botocore/retryhandler.py", line 222, in __call__
return self._check_caught_exception(
File "/var/runtime/botocore/retryhandler.py", line 359, in _check_caught_exception
raise caught_exception
File "/var/runtime/botocore/endpoint.py", line 200, in _do_get_response
http_response = self._send(request)
File "/var/runtime/botocore/endpoint.py", line 269, in _send
return self.http_session.send(request)
File "/var/runtime/botocore/httpsession.py", line 287, in send
raise ConnectTimeoutError(endpoint_url=request.url, error=e)
END RequestId: 8e5bbd96-7373-4f5e-9f8d-adea8dc30211
REPORT RequestId: 8e5bbd96-7373-4f5e-9f8d-adea8dc30211  Duration: 305498.32 ms  Billed Duration: 305499 ms  Memory Size: 128 MB Max Memory Used: 73 MB  Init Duration: 323.83 ms

我为lambda角色附加了以下策略:

  1. AWSCodeBuildDeveloperAccess
  2. AWSCodeDeployFullAccess
  3. AmazonS3ReadOnlyAccess
  4. AWSLambdaVPCAccessExecutionRole

超时的原因是什么?

VPC关联的Lambda函数没有上网,除非VPC允许。从文档:

当您将一个功能连接到您帐户中的VPC时,该功能无法访问internet除非您的VPC提供访问权限。

随后,函数无法连接到CodeBuild (CB)服务的公共端点。为了纠正这个问题,有两个选项:

  • 将函数放在私有子网(public将不工作),setupNAT网关在一个公共子网和配置路由表,使您的功能可以访问互联网使用NAT。这个过程在这里解释。

  • setup VPC endpoint for CB。这将允许你的函数私下