使用Lambda跨AWS账户复制AMI提示KMS密钥不可访问如何解决
报错根因
跨账户AMI复制场景下,AWS底层在执行关联快照的跨账户复制时,要求参与复制流程的双方身份都具备目标加密KMS密钥的使用权限。你当前仅在源账户KMS密钥的策略中为源账户Lambda角色授予了权限,缺少对目标账户扮演角色arn:aws:iam::TTTTTTTTTT:role/CopyAmiLambdaFunction的权限授权,因此触发密钥不可访问的报错。
另外你当前的copy_ami函数逻辑存在缺陷:遍历AMI列表时第一个AMI复制任务提交后就直接return,会导致其余AMI无法完成复制。
修复步骤
- 修改源账户KMS密钥的密钥策略,新增对目标账户角色的权限授权,在密钥策略的Statement块中添加如下配置:
{ "Sid": "Allow target account copy role to use KMS key", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::TTTTTTTTTT:role/CopyAmiLambdaFunction" }, "Action": [ "kms:Encrypt", "kms:Decrypt", "kms:ReEncrypt*", "kms:GenerateDataKey*", "kms:DescribeKey" ], "Resource": "*" }
- 在目标账户的
CopyAmiLambdaFunction角色的IAM权限策略中,新增源账户KMS密钥的使用权限,避免跨账户调用时的权限拦截:
- 在目标账户的
{ "Effect": "Allow", "Action": [ "kms:Encrypt", "kms:Decrypt", "kms:ReEncrypt*", "kms:GenerateDataKey*", "kms:DescribeKey" ], "Resource": "arn:aws:kms:eu-west-2:SXXXXXXXXXX:key/fabc4ee4-2c73-4c8d-a93e-ca572053a124" }
- 可选优化
copy_ami函数逻辑,修复提前返回的问题,修改后参考代码如下:
- 可选优化
def copy_ami(session, source_region, target_region, ami_id): """ 该函数用于将未加密AMI复制为使用源账户KMS密钥加密的AMI """ print("开始执行AMI复制") copied_image_ids = [] client = session.client('ec2', region_name = source_region) for i in ami_id: response = client.copy_image( Description='加密镜像', Encrypted=True, KmsKeyId='arn:aws:kms:eu-west-2:SXXXXXXXXXX:key/fabc4ee4-2c73-4c8d-a93e-ca572053a124', Name=f'Demo-Copy-AMI-{i.id}', SourceImageId=i.id, SourceRegion=target_region ) copied_image_ids.append(response["ImageId"]) print(f"AMI {i.id} 复制任务已提交,新AMI ID:{response['ImageId']}") return copied_image_ids
内容的提问来源于stack exchange,提问作者krisdigitx
相关产品推荐
相关产品推荐

