能否在AWS账号Acc1的Lambda中跨账号向Acc2复制密钥?
跨AWS账号密钥复制(Acc1→Acc2)实现方案
完全可行,通过在Acc1的Lambda中扮演Acc2的IAM角色,就能直接调用Acc2的Secrets Manager接口完成密钥复制,具体实现步骤如下:
步骤1:在Acc2中创建跨账号访问角色
需要在Acc2里建一个IAM角色,允许Acc1的Lambda执行角色来扮演它,同时给这个角色分配创建密钥的权限:
- 信任策略:指定允许Acc1的Lambda执行角色ARN(或Acc1账号ID)调用
sts:AssumeRole - 权限策略:赋予
secretsmanager:CreateSecret权限,按需可追加标签、描述等相关权限
示例信任策略(JSON):
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::[Acc1账号ID]:role/[Acc1的Lambda执行角色名]" }, "Action": "sts:AssumeRole" } ] }
示例权限策略(JSON):
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "secretsmanager:CreateSecret", "Resource": "arn:aws:secretsmanager:[Acc2区域]:[Acc2账号ID]:secret:*" } ] }
步骤2:配置Acc1的Lambda执行角色权限
给Acc1的Lambda执行角色加两个必要权限:
- 读取Acc1目标密钥的
secretsmanager:GetSecretValue权限 - 扮演Acc2角色的
sts:AssumeRole权限
示例权限策略(JSON):
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "secretsmanager:GetSecretValue", "Resource": "arn:aws:secretsmanager:[Acc1区域]:[Acc1账号ID]:secret:[要复制的密钥名]" }, { "Effect": "Allow", "Action": "sts:AssumeRole", "Resource": "arn:aws:iam::[Acc2账号ID]:role/[Acc2中创建的角色名]" } ] }
步骤3:编写Lambda代码(Python示例)
核心逻辑就是:读Acc1密钥→拿Acc2临时凭证→用凭证写Acc2密钥
import boto3 def lambda_handler(event, context): # 读取Acc1中的目标密钥 sm_acc1 = boto3.client('secretsmanager', region_name='[Acc1区域]') try: secret_res = sm_acc1.get_secret_value(SecretId='[Acc1要复制的密钥名]') secret_content = secret_res['SecretString'] # 二进制密钥用SecretBinary except Exception as e: return {'statusCode': 500, 'body': f'Failed to read secret from Acc1: {str(e)}'} # 扮演Acc2的角色,获取临时访问凭证 sts_client = boto3.client('sts') try: assume_res = sts_client.assume_role( RoleArn='arn:aws:iam::[Acc2账号ID]:role/[Acc2角色名]', RoleSessionName='cross-account-secret-copy' ) temp_creds = assume_res['Credentials'] except Exception as e: return {'statusCode': 500, 'body': f'Failed to assume role in Acc2: {str(e)}'} # 初始化Acc2的Secrets Manager客户端 sm_acc2 = boto3.client( 'secretsmanager', region_name='[Acc2目标区域]', aws_access_key_id=temp_creds['AccessKeyId'], aws_secret_access_key=temp_creds['SecretAccessKey'], aws_session_token=temp_creds['SessionToken'] ) # 在Acc2中创建新密钥 try: sm_acc2.create_secret( Name='[Acc2目标密钥名]', SecretString=secret_content, Description='Copied from Acc1', Tags=[{'Key': 'Source', 'Value': 'Acc1'}] ) return {'statusCode': 200, 'body': 'Secret copied successfully'} except Exception as e: return {'statusCode': 500, 'body': f'Failed to create secret in Acc2: {str(e)}'}
关键注意事项
- 权限最小化:两个账号的IAM角色都只给必要权限,别过度授权
- 时效问题:STS临时凭证默认有效期1小时,最长可设12小时,长耗时任务要注意调整
- 区域匹配:确保代码中指定的区域和Secrets Manager所在区域一致
- 异常处理:代码里的捕获逻辑可按需扩展,比如处理密钥已存在、权限不足等场景
内容的提问来源于stack exchange,提问作者kingsepp
相关产品推荐
相关产品推荐

