amazon-ec2 - AWS Lambda EC2-Instances 客户端超时错误
问题描述
尝试通过 AWS Lambda 停止或启动 ec2-instances 时,我经常会出错。对我来说很奇怪,因为有时它可以工作(对于启动和停止 ec2 实例)。
我得到的错误如下所示。当我在 Lambda 控制台上运行测试时,大部分时间它都成功执行了。但是当我通过 AWS 事件规则 (CloudWatch) 运行它时,该功能通常会失败。
[ERROR] ConnectTimeoutError: Connect timeout on endpoint URL: "https://ec2.ap-southeast-2.amazonaws.com/"
Traceback (most recent call last):
File "/var/task/lambda_function.py", line 48, in lambda_handler
if stop_ec2_instances():
File "/var/task/lambda_function.py", line 155, in stop_ec2_instances
ec2_client.stop_instances(InstanceIds=ec2_instances)
File "/var/task/botocore/client.py", line 316, in _api_call
return self._make_api_call(operation_name, kwargs)
File "/var/task/botocore/client.py", line 621, in _make_api_call
http, parsed_response = self._make_request(
File "/var/task/botocore/client.py", line 641, in _make_request
return self._endpoint.make_request(operation_model, request_dict)
File "/var/task/botocore/endpoint.py", line 102, in make_request
return self._send_request(request_dict, operation_model)
File "/var/task/botocore/endpoint.py", line 136, in _send_request
while self._needs_retry(attempts, operation_model, request_dict,
File "/var/task/botocore/endpoint.py", line 253, in _needs_retry
responses = self._event_emitter.emit(
File "/var/task/botocore/hooks.py", line 356, in emit
return self._emitter.emit(aliased_event_name, **kwargs)
File "/var/task/botocore/hooks.py", line 228, in emit
return self._emit(event_name, kwargs)
File "/var/task/botocore/hooks.py", line 211, in _emit
response = handler(**kwargs)
File "/var/task/botocore/retryhandler.py", line 183, in __call__
if self._checker(attempts, response, caught_exception):
File "/var/task/botocore/retryhandler.py", line 250, in __call__
should_retry = self._should_retry(attempt_number, response,
File "/var/task/botocore/retryhandler.py", line 277, in _should_retry
return self._checker(attempt_number, response, caught_exception)
File "/var/task/botocore/retryhandler.py", line 316, in __call__
checker_response = checker(attempt_number, response,
File "/var/task/botocore/retryhandler.py", line 222, in __call__
return self._check_caught_exception(
File "/var/task/botocore/retryhandler.py", line 359, in _check_caught_exception
raise caught_exception
File "/var/task/botocore/endpoint.py", line 200, in _do_get_response
http_response = self._send(request)
File "/var/task/botocore/endpoint.py", line 269, in _send
return self.http_session.send(request)
File "/var/task/botocore/httpsession.py", line 287, in send
raise ConnectTimeoutError(endpoint_url=request.url, error=e)
这是我用于启动和停止实例的代码:甚至,我已经在函数内移动了实例化 og ec2_res ec2_client但它没有帮助。,
def start_ec2_instances():
try:
ec2_res = boto3.resource('ec2', region_name="ap-southeast-2")
ec2_client = boto3.client('ec2', region_name="ap-southeast-2")
ec2_client.start_instances(InstanceIds=ec2_instances)
for ec2_id in ec2_instances:
instance = ec2_res.Instance(id=ec2_id)
logger.info("Waiting instance " + ec2_id + " to start")
instance.wait_until_running()
return True
except bex.ClientError as err:
logger.error(err.response['Error']['Message'])
return False
def stop_ec2_instances():
try:
ec2_res = boto3.resource('ec2', region_name="ap-southeast-2")
ec2_client = boto3.client('ec2', region_name="ap-southeast-2")
ec2_client.stop_instances(InstanceIds=ec2_instances)
for ec2_id in ec2_instances:
instance = ec2_res.Instance(id=ec2_id)
logger.info("Waiting instance " + ec2_id + " to stop")
instance.wait_until_stopped()
return True
except bex.ClientError as err:
logger.error(err.response['Error']['Message'])
return False
如果你们中的任何一个人曾经面对过同样的人?谢谢
编辑:我将函数超时设置为 8 分钟。在正常情况下,执行该功能所需的时间少于 5 分钟。
附加说明:有时我使用 VPN (south-east-2) 工作,其中这个 VPN 与我居住的地区不同。实例(和其他组件)也部署在此区域 VPN (south-east-2) 上。
解决方案
您启动和停止实例的代码对我来说是正确的。发生超时是因为执行操作所花费的时间未在为 lambda 函数配置的超时中完成。
您可以通过简单地减去函数开始和停止之间的时间来测量函数所花费的时间。
默认超时为3 秒。所以你应该考虑为你的 lambda 函数增加这个超时间隔。说5分钟。
请注意,此超时的最大值为300 秒(15 分钟),您不能配置高于此的值。我确信上面的代码会在这个限制内完成,因此对你来说应该不是问题。
如何增加我的 lambda 函数的超时间隔?
有多种方法可以做到这一点。通过 AWS CLI、AWS 控制台或其他方式。
在 AWS 控制台中,您可以这样做:
进行此更改后单击“保存”按钮。
希望这可以帮助。
推荐阅读
- sql - MS Access 如何在保持格式的同时更新链接表路径
- reactjs - 反应错误:无法读取未定义的属性“地图”
- java - Hashtable 和 hashmap 的区别
- javascript - Mongoose.js 没有从数组中删除对象
- twitter-bootstrap - 带有 2 行的 React-Bootstrap 导航栏
- machine-learning - 如果准确性仍在提高但时代结束了怎么办?
- php - 如何在 nginx 位置提供 html/php
- mongodb - 在 mongodb 中使用该对象数组中的另一个键查找所有聚合
- ios - 将加载动画放在 VNDocumentViewController Swift
- vue.js - 将 ADAL.js 迁移到 MSAL.js