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
相关产品推荐
相关产品推荐

