如何解决 Image Builder 中加密 AMI 的分配错误?
在尝试将加密 AMI 分配到 EC2 Image Builder 中的另一个账户时,我收到了错误消息。如何解决此问题?
简短描述
在将加密的 Amazon 机器映像(AMI)分配到另一个账户时,以下情况可能会导致 EC2 Image Builder 中的分配错误:
- 分配的 AMI 使用 Amazon Elastic Block Store(Amazon EBS)的默认 AWS 托管式密钥进行加密。
- AWS Key Management Service(AWS KMS)或 AWS Identity and Access Management(IAM)实体没有所需的权限。
解决方法
分配的 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 实体没有所需的权限
您可以使用 launchPermissions 或 targetAccountIds 配置在 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(保存更改)。
相关信息
相关内容
- AWS 官方已更新 6 个月前
- AWS 官方已更新 6 个月前
- AWS 官方已更新 2 年前
- AWS 官方已更新 6 个月前