You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

能否在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 00:24:18