首页 > 解决方案 > AWS Lambda EC2-Instances 客户端超时错误

问题描述

尝试通过 AWS Lambda 停止或启动 ec2-instances 时,我经常会出错。对我来说很奇怪,因为有时它可以工作(对于启动和停止 ec2 实例)。

我得到的错误如下所示。当我在 Lambda 控制台上运行测试时,大部分时间它都成功执行了。但是当我通过 AWS 事件规则 (CloudWatch) 运行它时,该功能通常会失败。

这是我在第 48 行的代码 在此处输入图像描述

[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) 上。

标签: amazon-ec2aws-lambdaamazon-cloudwatch

解决方案


您启动和停止实例的代码对我来说是正确的。发生超时是因为执行操作所花费的时间未在为 lambda 函数配置的超时中完成。

您可以通过简单地减去函数开始和停止之间的时间来测量函数所花费的时间。

默认超时为3 秒。所以你应该考虑为你的 lambda 函数增加这个超时间隔。说5分钟。

请注意,此超时的最大值为300 秒(15 分钟),您不能配置高于此的值。我确信上面的代码会在这个限制内完成,因此对你来说应该不是问题。

如何增加我的 lambda 函数的超时间隔?

有多种方法可以做到这一点。通过 AWS CLI、AWS 控制台或其他方式。

在 AWS 控制台中,您可以这样做:

更改 lambda 超时间隔

进行此更改后单击“保存”按钮。

希望这可以帮助。


推荐阅读