為什麼我具有完整 Amazon EC2 許可的 IAM 使用者或角色無法啟動 EC2 執行個體?

上次更新日期:2022-05-18

我的 AWS Identity and Access Management (IAM) 實體 (使用者、群組、角色) 具有完整的 Amazon Elastic Compute Cloud (Amazon EC2) 執行個體許可。我想要啟動 Amazon EC2 執行個體,但卻從待處理狀態變成已停止

簡短描述

檢查執行個體是否連接有 Amazon Elastic Block Store (Amazon EBS)。如果 Amazon EBS 磁碟區使用 AWS Key Management Service (AWS KMS) 金鑰加密,則可能會有許可問題。呼叫 StartInstances API 動作的 IAM 實體必須具有許可,才能為 Amazon EC2 服務建立授權。此授權允許 Amazon EC2 解密 AWS KMS 金鑰 (KMS 金鑰)。

Amazon EBS 磁碟區會將 GenerateDataKeyWithoutPlaintext API 呼叫請求傳送至 AWS KMS,以建立新的資料金鑰並在 KMS 金鑰中加密該資料金鑰。加密的資料金鑰會傳回 Amazon EBS 磁碟區,然後連接至 Amazon EC2 執行個體。就此情境而言,KMS 金鑰出現在與 EC2 執行個體和 KMS 金鑰相同的 AWS 帳戶中。

注意:如果您在執行 AWS Command Line Interface (AWS CLI) 命令時收到錯誤,請確保您使用的是最新的 AWS CLI 版本

1.若要確認 Amazon EC2 執行個體為何處於已停止狀態,請執行 AWS CLI 命令,如下所示:

aws ec2 describe-instances --instance-id your-instance_ID --query "Reservations[*].Instances[*].StateReason"

範例輸出:

[
  [
    {
      "Message": "Client.InternalError: Client error on launch",
      "Code": "Client.InternalError"
    }
  ]
]

此錯誤表示根磁碟區或其他相連接的磁碟區已加密。您沒有存取 AWS KMS 金鑰以進行解密的許可。

2.(選用) 依照事件名稱 CreateGrant 的篩選 AWS CloudTrail 事件指示進行。

範例輸出:

"errorMessage": "User: arn:aws:iam::123456789012:user/test is not authorized to perform: kms:CreateGrant on resource: arn:aws:kms:eu-west-1:123456789012:key/8e3426b8-87b4-434c-ae74-8e63dadf354a"

此錯誤表示 IAM 實體沒有 Amazon EC2 的 CreateGrant 許可以解密資料金鑰,因此執行個體無法啟動。

解決方案

若要找出金鑰類型,請依照以下步驟操作:

1.    開啟 Amazon EC2 主控台,然後選擇 Instances (執行個體)。

2.    在 Instance ID ( 執行個體 ID) 中,選擇 Amazon EC2 執行個體 ID,然後選擇 Storage (儲存) 索引標籤。

3.    在 Volume ID (磁碟區 ID) 中,選擇已加密磁碟區的磁碟區 ID。

4.    在 KMS key ID (KMS 金鑰 ID) 中,複製金鑰 ID。

5.    在同一個 AWS 區域中開啟 AWS KMS 主控台

6.    在 AWS managed keys (AWS 管理金鑰) 和 Customer managed keys (客戶管理金鑰) 中,貼上在步驟 4 中複製的 KMS 金鑰 ID。

7.    選擇金鑰 ID。

8.    在 Description (說明) 下的 General configuration (一般配置) 中,記下 KMS 金鑰類型。

將 IAM 政策連接到 IAM 實體,如下所示:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "kms:CreateGrant"
      ],
      "Resource": [
        "arn:aws:kms:eu-west-1:123456789012:key/8e3426b8-87b4-434c-ae74-8e63dadf354a"
      ],
      "Condition": {
        "Bool": {
          "kms:GrantIsForAWSResource": true
        }
      }
    }
  ]
}

kms:GrantIsForAWSResource 條件金鑰確保 IAM 實體只能使用 AWS 資源 (例如 EC2 執行個體) 為 KMS 金鑰建立授權。此政策不允許 IAM 實體為另一個 IAM 實體建立授權。

(選用) 允許 AWS 帳戶根使用者 帳戶完整存取 KMS 金鑰,如下所示:

{
  "Sid": "Enable IAM User Permissions",
  "Effect": "Allow",
  "Principal": {"AWS": "arn:aws:iam::123456789012:root"},
  "Action": "kms:*",
  "Resource": "*"
}

您也可以在 KMS 金鑰政策中新增 IAM 實體,以允許 CreateGrant API 動作。

注意:


此文章是否有幫助?


您是否需要帳單或技術支援?