CDK:如何为CompositePrincipal添加Lambda角色?解决非空断言问题
解决方案:Lambda角色加入CompositePrincipal及角色信任配置
一、正确将Lambda角色加入CompositePrincipal(解决非空断言问题)
1. 针对CDK创建的Lambda函数
CDK创建Lambda时默认会生成角色,可直接安全引用,无需依赖不确定的可选链:
// 先创建Lambda函数 const myLambda = new lambda.Function(this, 'CleLambda', { runtime: lambda.Runtime.NODEJS_18_X, handler: 'index.handler', code: lambda.Code.fromAsset('lambda'), }); // 构建CompositePrincipal时直接引用Lambda的角色 const targetRole = new iam.Role(this, 'TargetRole', { assumedBy: new CompositePrincipal( // 其他需要的主体... new ArnPrincipal(myLambda.role!.roleArn) ), });
如果担心非空断言的风险,也可以先判断角色存在再添加:
const targetRole = new iam.Role(this, 'TargetRole', { assumedBy: new CompositePrincipal(), }); if (myLambda.role) { targetRole.assumedBy.addPrincipal(new ArnPrincipal(myLambda.role.roleArn)); }
2. 针对现有Lambda角色(导入的情况)
如果是引用AWS账户中已存在的Lambda角色,用Role.fromRoleArn直接获取确定的角色实例,避免可选链问题:
const existingLambdaRole = iam.Role.fromRoleArn(this, 'ExistingLambdaRole', 'arn:aws:iam::123456789012:role/your-lambda-role'); const targetRole = new iam.Role(this, 'TargetRole', { assumedBy: new CompositePrincipal( // 其他主体... existingLambdaRole ), });
二、让Lambda角色"扮演"目标角色的正确方式
你写的assumeRole方法不是CDK的正确用法,要实现这个需求需要完成两个关键配置:
1. 配置目标角色的信任策略(即你最初的需求)
确保目标角色的assumedBy包含Lambda角色,这一步是让AWS允许Lambda角色来扮演目标角色,也就是前面解决的CompositePrincipal配置。
2. 给Lambda角色添加AssumeRole权限
需要给Lambda的角色添加允许调用sts:AssumeRole的权限,目标资源为目标角色的ARN:
myLambda.role?.addToPrincipalPolicy(new iam.PolicyStatement({ actions: ['sts:AssumeRole'], resources: [targetRole.roleArn], }));
完成这两步后,你就可以在Lambda代码中通过AWS STS客户端调用AssumeRole接口,获取目标角色的临时凭证,从而使用目标角色的权限执行操作。
内容的提问来源于stack exchange,提问作者Casey
相关产品推荐
相关产品推荐

