使用 boto3 从 AWS Lambda 启动 EC2 实例时超时

Timeout while starting an EC2 instance from AWS Lambda using boto3

我想允许用户仅在需要时启动 EC2 实例。

所以我创建了一个 Lambda 函数来做到这一点:

import boto3

def lambda_handler(event, context):
    ec2 = boto3.resource('ec2', region_name='eu-central-1')
    return ec2.instances.filter(InstanceIds=['i-abc123']).start()

我还添加了以下 IAM 权限:

    {
        "Effect": "Allow",
        "Action": [
            "ec2:StartInstances"
        ],
        "Resource": "arn:aws:ec2:*"
    },
    {
        "Effect": "Allow",
        "Action": [
            "ec2:DescribeInstances"
        ],
        "Resource": "*"
    }

问题是当我执行 Lambda 时超时。

BTW 运行 来自同一 VPC 和相同权限内的 EC2 的完全相同的代码,returns 立即。

有什么想法吗?

如果凭据是问题,您将不会超时。更有可能的是,您使用的是小内存模型,而 boto 占用大量内存,即使是做简单的事情。尝试 运行 更大的内存模型或更长的超时时间。

如果这确实成为问题,请考虑在 class 初始化代码中创建 ec2 资源或使用单例模式,以便后续调用可以使用相同的资源。但是,一定要设置函数超时,以便它有足够的时间进行初始化和正常职责,即使这似乎没有必要。如果您的函数出错,下一个 运行 可能包括 class 初始化时间。