如何解决 Image Builder 中加密 AMI 的分配错误?

3 分钟阅读
0

在尝试将加密 AMI 分配到 EC2 Image Builder 中的另一个账户时,我收到了错误消息。如何解决此问题?

简短描述

在将加密的 Amazon 机器映像(AMI)分配到另一个账户时,以下情况可能会导致 EC2 Image Builder 中的分配错误:

解决方法

分配的 AMI 使用适用于 Amazon EBS 的默认 AWS 托管式密钥进行加密

您收到以下错误:

Distribution failed with JobId 'XXXXXXXXXXXXXX', status = 'Failed' for ARN 'arn:aws:imagebuilder:us-east-1:xxxxxxxxxxxx:image/test-recipe/0.0.1/1'. 'Not all distribution jobs are completed. 1) EC2 Client Error: 'Snapshots encrypted with the AWS Managed CMK can’t be shared. Specify another snapshot.' when distributing the image from the source account (ID: xxxxxxxxxxxx) to the destination account (ID: xxxxxxxxxxxx) in Region us-east-1.'

您无法共享使用默认 AWS KMS 密钥加密的 AMI。有关更多信息,请参阅与特定 AWS 账户共享 AMI

要检查的场景包括:

  • AWS 托管式 KMS 密钥在配方的存储配置中指定。
  • AWS 托管式 KMS 密钥与一个或多个目标账户一起在分配配置中指定。
  • 父 AMI 使用 AWS 托管式 KMS 密钥进行加密。
  • 父 AMI 有多个快照,并且至少有一个快照使用 AWS 托管式 KMS 密钥加密。
  • 已激活您的 AWS 区域的默认加密,且使用 AWS 托管式 KMS 密钥。

要解决此问题,请创建映像配方的新版本,并在配方的存储配置中指定客户管理 KMS 密钥用于加密。对于分配配置中的 KMS 密钥,请在将 AMI 分配到其他账户时指定客户管理 KMS 密钥用于加密。

AWS KMS 或 IAM 实体没有所需的权限

您可以使用 launchPermissionstargetAccountIds 配置在 Image Builder 中分配 AMI。

launchPermissions

当您使用 launchPermissions 分配 AMI 时,Image Builder 将在源账户中使用 AWSServiceRoleForImageBuilder 的 IAM 角色。默认情况下,AWSServiceRoleForImageBuilder 对源账户中的资源拥有所需的 AWS KMS 权限。

KMS 密钥策略包含允许根用户执行 "kms:*" 操作的语句。如果此语句不在密钥策略中,则服务相关角色将无法访问源账户中的密钥。如果根用户不允许 "kms:*" 操作,则修改策略以允许服务相关角色使用密钥。

例如:

{
  "Sid": "Enable IAM User Permissions",
  "Effect": "Allow",
  "Principal": {
    "AWS": "arn:aws:iam::source_account_id:role/aws-service-role/imagebuilder.amazonaws.com/AWSServiceRoleForImageBuilder"
  },
  "Action": [
    "kms:Decrypt",
    "kms:Encrypt",
    "kms:GenerateDataKeyWithoutPlaintext",
    "kms:DescribeKey",
    "kms:CreateGrant",
    "kms:ReEncryptFrom",
    "kms:ReEncryptTo"
  ],
  "Resource": "*"
}

**注意:**将 source_account_id 替换为源账户的 ID。

targetAccountIds

如果目标账户没有 IAM 角色 EC2ImageBuilderDistributionCrossAccountRole,或者源账户未在信任策略中列出,则会收到以下错误:

Distribution failed with JobId 'xxxxxxxxxxxxxx', status = 'Failed' for ARN 'arn:aws:imagebuilder:us-east-1:XXXXXXXXXX:image/testdistribution/2.0.0/3'. 'Not all distribution jobs are completed. 1) STS Client Error: 'User: arn:aws:sts::XXXXXXXXXXXX:assumed-role/AWSServiceRoleForImageBuilder/Ec2ImageBuilderIntegrationService is not authorized to perform: sts:AssumeRole on resource: arn:aws:iam::xxxxxxxxx:role/EC2ImageBuilderDistributionCrossAccountRole'. Please make sure your 'EC2ImageBuilderDistributionCrossAccountRole' is setup with correct permission policies. If you are copying AMI to opt-in regions, please make sure the region is enabled in the account when distributing the image from the source account (ID: XXXXXXXXXXXX) to the destination account (ID: XXXXXXXXXXXX) in Region us-east-1.'STS Client Error User is not authorized to perform: sts:AssumeRole on resource.

要解决此问题,请创建角色 EC2ImageBuilderDistributionCrossAccountRole。然后,附加 Ec2ImageBuilderCrossAccountDistributionAccess 策略以允许跨账户分配。然后,在 EC2ImageBuilderDistributionCrossAccountRole 信任策略中列出 AWSServiceRoleForImageBuilder

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "Service": "ec2.amazonaws.com",
        "AWS": "arn:aws:iam::XXXXXXXXXX:root"
      },
      "Action": "sts:AssumeRole"
    }
  ]
}

由于跨账户 AWS KMS 权限问题,您可能会收到以下错误:

Distribution failed with JobId 'xxxxxxxxxxxxxx', status = 'Failed' for ARN 'arn:aws:imagebuilder:ap-southeast-2:11111111111:image/test/1.0.0/1'. 'Not all distribution jobs are completed. 1) AMI Copy Reported Failure For 'ami-0047623fbcxxxxx' when distributing the image from the source account (ID: 11111111111) to the destination account (ID: 222222222222) in Region ap-southeast-2.'

当您使用 targetAccountIds 分配 AMI 时,Image Builder 会使用源账户中的 AWSServiceRoleForImageBuilder 角色。在目标账户中,它使用角色 EC2ImageBuilderDistributionCrossAccountRole。确保您授予 EC2ImageBuilderDistributionCrossAccountRole 权限,以便在分配配置和配方的存储配置中使用 AWS KMS 密钥。

例如:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "VisualEditor0",
      "Effect": "Allow",
      "Action": [
        "kms:Decrypt",
        "kms:Encrypt",
        "kms:GenerateDataKeyWithoutPlaintext",
        "kms:DescribeKey",
        "kms:CreateGrant",
        "kms:ReEncryptFrom",
        "kms:ReEncryptTo"
      ],
      "Resource": "*"
    }
  ]
}

**注意:**您还可以通过指定 AWS KMS 密钥的 ARN 来限制 Resource(资源)部分。

如果客户管理 KMS 密钥属于目标账户,您必须与源账户共享 AWS KMS 密钥。如果客户管理 KMS 密钥属于源账户,您必须与目标账户共享 AWS KMS 密钥。

完成以下步骤以共享 AWS KMS 密钥:

1.    登录 KMS 密钥所在的账户。

2.    在同一 AWS 区域中打开 AWS KMS 控制台

3.    从左侧的导航窗格中选择 Customer managed keys(客户管理密钥)。

4.    选择 KMS key ID(KMS 密钥 ID)。

5.    选择 Key Policy(密钥策略)选项卡。

6.    在 Other AWS accounts(其他 AWS 账户)部分,选择 Add other AWS accounts(添加其他 AWS 账户)。

7.    指定要与之共享 KMS 密钥的账户的 ID。

8.    选择 Save Changes(保存更改)。


相关信息

使用 Image Builder 设置跨账户 AMI 分配

如何在多个 AWS 账户之间共享 AWS KMS 密钥?

AWS 官方
AWS 官方已更新 2 年前