Amazon-Ec2

AWS lamba start_instances 給出待處理響應,但控制台仍顯示已停止

  • December 17, 2020

我有一個 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 命令在執行後(手動啟動後)發送命令。如果我在它執行時嘗試它會成功。

您的 EBS 卷使用 KMS 密鑰加密,您的 Lambda 函式使用的 IAM 角色無權使用該 KMS 密鑰進行解密。在這種情況下,EC2 實例會啟動,但隨後會立即停止。

所以有兩種可能的解決方案。

解決方案 1:將您的 IAM 角色添加為您的 KMS 密鑰的“使用者”。這需要您編輯附加到您的 KMS 密鑰的權限策略,並將您的 IAM 角色添加為密鑰的“使用者”(以加密/解密)。

解決方案 2:添加kms:CreateGrant到您的 Lambda 的 IAM 角色。使用您的 IAM 角色,AWS 將允許 EC2 實例啟動。

引用自:https://serverfault.com/questions/1046490