
インスタンスを開始するために設定した 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 インスタンスは起動しますが、すぐに停止します。
したがって、解決策は 2 つ考えられます。
解決策 1: IAM ロールを KMS キーの「ユーザー」として追加します。これには、KMS キーに添付されたアクセス許可ポリシーを編集し、IAM ロールをキーの「ユーザー」として追加する必要があります (暗号化/復号化のため)。
解決策 2: kms:CreateGrant
Lambda の IAM ロールに追加します。IAM ロールにこれを追加すると、AWS は EC2 インスタンスの起動を許可します。