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

AWS CDK跨账号传递角色报错:Cross-account pass role is not allowed

解决跨账号创建Lambda时的"Cross-account pass role is not allowed"错误

以下是针对你的场景的具体解决思路:

1. 确认CreateFunction参数中的Role是MODULE账号内的角色

这是核心问题:你不能将DEV账号的角色作为新Lambda的执行角色传递给MODULE账号的Lambda服务,这会触发跨账号PassRole的限制。必须在MODULE账号中单独创建给新Lambda用的执行角色:

// 在MODULE账号的栈中添加:新Lambda的执行角色
const lambdaExecutionRole = new Role(this, 'LambdaExecutionRole', {
  roleName: 'LambdaExecutionRole',
  assumedBy: new ServicePrincipal('lambda.amazonaws.com'),
  // 附加基础执行权限,可根据需求调整
  managedPolicies: [
    ManagedPolicy.fromAwsManagedPolicyName('service-role/AWSLambdaBasicExecutionRole')
  ]
});

然后在调用CreateFunctionCommand时,params.Role必须填写这个角色的ARN。

2. 修正moduleAssumeRole的权限(可选但推荐)

你的moduleAssumeRole虽然配置了iam:*权限,但为了最小化权限风险,建议明确添加针对上述Lambda执行角色的iam:PassRole权限,替换原来的iam:*:

moduleAssumeRole.addToPolicy(
  new PolicyStatement({
    actions: [
      'iam:PassRole',
      'lambda:CreateFunction',
      'lambda:*', // 保留其他需要的Lambda操作
      'logs:*',
      'xray:PutTelemetryRecords',
      'xray:PutTraceSegments'
    ],
    resources: [
      lambdaExecutionRole.roleArn, // 明确指定可传递的角色ARN
      '*' // 其他资源按需调整
    ]
  })
)

3. 精简DEV账号Lambda的权限

DEV账号的Lambda角色不需要iam:PassRole权限(PassRole操作是在MODULE账号内由moduleAssumeRole执行的),只需要保留必要的权限:

moduleDeployerLamdba.addToRolePolicy(
  new PolicyStatement({
    actions: ['sts:AssumeRole'],
    // 限制到MODULE账号的moduleAssumeRole ARN,不要用*
    resources: [moduleAssumeRoleArn]
  })
);
// 保留S3触发相关的权限(如果需要)
moduleDeployerLamdba.addToRolePolicy(
  new PolicyStatement({
    actions: ['s3:GetObject', 's3:ListBucket'],
    resources: [yourS3BucketArn, `${yourS3BucketArn}/*`]
  })
);

4. 验证STS AssumeRole的代码正确性

确保在DEV的Lambda中,正确使用STS获取MODULE账号的临时凭证,并初始化Lambda客户端:

import { STSClient, AssumeRoleCommand } from "@aws-sdk/client-sts";
import { LambdaClient, CreateFunctionCommand } from "@aws-sdk/client-lambda";

const stsClient = new STSClient({ region: "你的区域" });
const assumeRoleCmd = new AssumeRoleCommand({
  RoleArn: process.env.MODULE_ASSUME_ROLE,
  RoleSessionName: "cross-account-deploy-session"
});
const assumeResult = await stsClient.send(assumeRoleCmd);

// 用临时凭证初始化MODULE账号的Lambda客户端
const lambdaClient = new LambdaClient({
  region: "你的区域",
  credentials: {
    accessKeyId: assumeResult.Credentials.AccessKeyId,
    secretAccessKey: assumeResult.Credentials.SecretAccessKey,
    sessionToken: assumeResult.Credentials.SessionToken
  }
});

// 调用CreateFunction时,Role参数必须是MODULE账号内的Lambda执行角色ARN
const createFuncCmd = new CreateFunctionCommand({
  Role: "MODULE账号内的LambdaExecutionRole的ARN",
  // 其他参数:Code、Handler、Runtime等
});
await lambdaClient.send(createFuncCmd);

5. 排查信任策略的常见问题

  • 确认MODULE账号的moduleAssumeRole信任策略中,DEV_ACCOUNT_ID是正确的账号ID,没有拼写错误。
  • 确认MODULE账号的lambdaExecutionRole信任策略明确允许lambda.amazonaws.com作为信任主体,否则新Lambda无法启动。

内容的提问来源于stack exchange,提问作者cyberwombat

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 05:20:42