为什么我无法从复制的 AMI 中启动 EC2 实例?

上次更新时间:2020 年 9 月 10 日

我将 Amazon 系统映像 (AMI) 复制到了其他账户或区域。我无法从所复制的 AMI 启动 Amazon Elastic Compute Cloud (Amazon EC2) 实例。如何解决此问题?

简短描述

如果您无法使用加密的 Amazon Elastic Block Store (Amazon EBS) 从复制的 AMI 启动实例,可能的原因如下:

  • AWS Key Management Service (KMS) 客户托管密钥 (CMK) 的密钥策略缺少允许请求账户访问权限的适当委托人。
  • 请求账户中的 AWS Identity and Access Management (IAM) 实体没有对卷的跨账户 CMK 的所需 KMS 权限。

解决方法

启用对所复制 AMI 上现有 KMS 自定义密钥的跨账户访问

有关详细说明,请参阅使用 AWS Key Management Service 更安全地在账户间共享自定义加密密钥中的如何启用对现有自定义密钥的跨账户访问

设置 EC2 实例访问 KMS 密钥的权限

1.    打开 AWS KMS 控制台

注意:确保您处于正确的区域中。

2.    选择客户管理的密钥,然后选择相应的密钥。

3.    在密钥策略中,向下滚动到密钥用户。验证密钥用户部分中列出了需要访问该密钥的所有内部和外部账户和用户。

4.    如果密钥用户部分中缺少任何账户或用户,请选择策略视图

注意:如果您手动编辑过 AWS KMS CMK 密钥策略,则密钥策略仅在策略 (JSON) 视图中可用。

5.    验证密钥策略中的允许使用密钥语句是否正确。该语句必须包含所有需要访问此密钥的账户和用户的 ARN。

以下是默认密钥策略中允许使用密钥语句的示例。以下示例中的允许使用密钥语句包含下列 ARN:

  • 包含所复制 AMI 的外部 AWS 账户。
  • AMI 的父账户。
  • 外部帐户中的用户。

有关完整默认密钥策略的概述和示例,请参阅在 AWS KMS 中使用密钥策略 – 默认密钥策略

{
             "Sid": "Allow use of the key",
            "Effect": "Allow",
            "Principal": {
                "AWS": [
                    "arn:aws:iam::111122223333:root",
                    "arn:aws:iam::444455556666:root",
                    "arn:aws:iam::111122223333:user/UserA"
                ]
            },
            "Action": [
                "kms:Encrypt",
                "kms:Decrypt",
                "kms:ReEncrypt*",
                "kms:GenerateDataKey*",
                "kms:DescribeKey"
            ],
            "Resource": "*"
        },
        {
            "Sid": "Allow attachment of persistent resources",
            "Effect": "Allow",
            "Principal": {
                "AWS": [
                    "arn:aws:iam::111122223333:root",
                    "arn:aws:iam::444455556666:root",
                    "arn:aws:iam::111122223333:user/UserA"
                ]
            },
            "Action": [
                "kms:CreateGrant",
                "kms:ListGrants",
                "kms:RevokeGrant"
            ],
            "Resource": "*",
            "Condition": {
                "Bool": {
                    "kms:GrantIsForAWSResource": "true"
                }
            }
        }
    ]
}
   

6.    如果您尚未创建 IAM 策略,请继续执行下一部分以创建并分配策略。

创建 IAM 策略并将其附加到 IAM 用户或组

1.    使用具有管理员权限的用户登录 IAM 控制台

2.    选择策略

3.    选择创建策略

4.    选择 JSON 选项卡。复制下面的示例 JSON 策略,然后将其粘贴到 JSON 文本框中。将 arn:aws:kms:REGION:MAINACCOUNTNUMBER:key/1a345678-1234-1234-1234-EXAMPLE 替换为您的 CMK 的 ARN。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "AllowUseOfTheKey",
            "Effect": "Allow",
            "Action": [
                "kms:Encrypt",
                "kms:Decrypt",
                "kms:ReEncrypt*",
                "kms:GenerateDataKey*",
                "kms:DescribeKey"
            ],
            "Resource": [
                "arn:aws:kms:REGION:MAINACCOUNTNUMBER:key/1a345678-1234-1234-1234-EXAMPLE"
            ]
        },
        {
            "Sid": "AllowAttachmentOfPersistentResources",
            "Effect": "Allow",
            "Action": [
                "kms:CreateGrant",
                "kms:ListGrants",
                "kms:RevokeGrant"
            ],
            "Resource": [
                "arn:aws:kms:REGION:MAINACCOUNTNUMBER:key/1a345678-1234-1234-1234-EXAMPLE"
            ],
            "Condition": {
                "Bool": {
                    "kms:GrantIsForAWSResource": true
                }
            }
        }
    ]
}

5.    选择查看策略。策略验证程序将报告任何语法错误。

6.    在查看页面上,输入 KmsKeyUsagePolicy 作为策略名称。查看策略摘要以检查您的策略授予的权限,然后选择创建策略以保存策略。新策略将在托管策略列表上显示,可以随时附加到您的 IAM 用户或组中。

7.    在 IAM 控制台的导航窗格中,选择策略

8.    在策略列表顶部的搜索框中,开始键入 KmsKeyUsagePolicy,直到您看到您的策略。然后,选中列表中的 KmsKeyUsagePolicy 旁的框。

9.    选择策略操作,然后选择附加

10.    对于筛选条件,请选择用户

11.    在搜索框中,开始键入用户名,直到您的用户显示在列表中。然后选中列表中该用户旁的框。

12.    选择附加策略