使用 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 初始化时间。
我想允许用户仅在需要时启动 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 初始化时间。