我有一个 lambda 函数,已设置为启动一个实例:
import boto3
ec2 = boto3.client('ec2')
response = ec2.start_instances(
InstanceIds=['i-xxx']
)
print(response)
响应看起来不错,显示它从停止状态转为待处理状态:
START RequestId: 26c0cf5e-6d70-4701-b0bd-68276b06d30d Version: $LATEST
{
"StartingInstances": [
{
"CurrentState": {"Code": 0, "Name": "pending"},
"InstanceId": "i-xxxxxx",
"PreviousState": {"Code": 80, "Name": "stopped"},
}
],
"ResponseMetadata": {
"RequestId": "fdab5818-0536-457f-a19e-17fea60100f4",
"HTTPStatusCode": 200,
"HTTPHeaders": {
"x-amzn-requestid": "fdab5818-0536-457f-a19e-17fea60100f4",
"content-type": "text/xml;charset=UTF-8",
"content-length": "579",
"date": "Wed, 16 Dec 2020 18:38:57 GMT",
"server": "AmazonEC2",
},
"RetryAttempts": 0,
},
}
END RequestId: f2ed2be9-e2f2-4beb-a69b-4cddee35bef4
REPORT RequestId: f2ed2be9-e2f2-4beb-a69b-4cddee35bef4 Duration: 1381.48 ms Billed Duration: 1382 ms Memory Size: 256 MB Max Memory Used: 97 MB Init Duration: 688.96 ms
但是,当我查看控制台时,它仍然显示为已停止并且从未启动。
看起来它并没有启动失败:
"StateReason": {
"Code": "Client.UserInitiatedShutdown",
"Message": "Client.UserInitiatedShutdown: User initiated shutdown",
},
基于执行的政策:
{
"Version": "2012-10-17",
"Id": "default",
"Statement": [
{
"Sid": "xxxxxxx",
"Effect": "Allow",
"Principal": {
"Service": "s3.amazonaws.com"
},
"Action": "lambda:InvokeFunction",
"Resource": "xxxxxxFunction",
"Condition": {
"StringEquals": {
"AWS:SourceAccount": "xxxxxxxx"
}
}
}
]
}
似乎它并没有真正尝试启动。我已使用此代码启动其他实例。我想知道这是否是权限问题,但没有错误。lambda 函数执行角色具有 EC2fullaccess。
注意,另一个数据点。我尝试了进一步的代码,该代码使用 ssm send 命令在运行后(手动启动后)发送命令。如果我在运行时尝试该命令,它会成功。
答案1
您的 EBS 卷使用 KMS 密钥加密,而您的 Lambda 函数使用的 IAM 角色无权使用该 KMS 密钥解密。在这种情况下,EC2 实例启动后立即停止。
因此有两种可能的解决方案。
解决方案 1:将您的 IAM 角色添加为 KMS 密钥的“用户”。这需要您编辑附加到 KMS 密钥的权限策略,并将您的 IAM 角色添加为密钥的“用户”(用于加密/解密)。
解决方案 2:添加kms:CreateGrant
到您的 Lambda 的 IAM 角色。有了您的 IAM 角色,AWS 将允许 EC2 实例启动。