[英]Cross-account pass role is not allowed in AWS CDK
我有一个帐户 DEV 试图在帐户模块中创建一个 lambda。 当 DEV 中的代码(由 S3 触发的 lambda)尝试在 MODULE 中创建 lambda 时,我收到错误“不允许跨帐户传递角色”[Symbol]
过程是这样的:我向 DEV S3 添加一个文件,这个 lambda 被触发并且应该调用 lambda await getLambdaClient(opts).send(new CreateFunctionCommand(params))
其中 opts 是使用moduleAssumeRole
获得的临时 STS 信用
我正在使用 CDK/打字稿:
在我的模块帐户中,我创建角色:
// Basic role for module lambdas created on the fly
const moduleAssumeRole = new Role(this, 'ModuleAssumeRole', {
roleName: 'moduleAssumeRole',
assumedBy: new CompositePrincipal(
new AccountPrincipal(DEV_ACCOUNT_ID),
new ServicePrincipal('lambda.amazonaws.com')
)
})
moduleAssumeRole.addToPolicy(
new PolicyStatement({
actions: [
'iam:*',
'sts:*',
'lambda:*',
'logs:*',
'xray:PutTelemetryRecords',
'xray:PutTraceSegments'
],
resources: ['*']
})
)
在我的开发堆栈中:
const moduleDeployerLamdba = new NodejsFunction(this, 'DeployLambda', {
...
environment: {
MODULE_ASSUME_ROLE: moduleAssumeRoleArn
}
))
// I dont think these are needed here but hey... trying passrole everywhere
moduleDeployer.addToRolePolicy(
new PolicyStatement({
actions: ['lambda:*', 'logs:*', 's3:*'],
resources: ['*']
})
)
moduleDeployer.addToRolePolicy(
new PolicyStatement({
actions: ['sts:AssumeRole'],
resources: ['*']
})
)
moduleDeployer.addToRolePolicy(
new PolicyStatement({
actions: ['iam:PassRole'],
resources: ['*']
})
)
在我在 DEV 上的部署代码中,我使用 STS 客户端并将 moduleAssumeRoleArn 传递给它以获取用于将 lambda 部署到 MODULE 帐户的凭据。
阅读了数十篇关于此的帖子/博客,我找不到答案。 文档一直提到有权传递角色的用户 - 不确定他们在这里谈论的是哪个用户,但 CDK 是使用 AdministratorAccess API 密钥部署的。
有任何想法吗?
一些最低权限调整和清理:
ModuleAssumeRole
应该只信任 DEV Lambda 角色。 Account Principal 过于宽泛。 Lambda 服务主体无效。
const moduleAssumeRole = new Role(this, 'ModuleAssumeRole', {
roleName: 'moduleAssumeRole',
assumedBy: new CompositePrincipal(
new ArnPrincipal(DEV_LAMBDA_ROLE_ARN), // best option for least-privilege access
new AccountPrincipal(DEV_ACCOUNT_ID), // valid, but very broad
)
})
对于最低权限,应该只允许 DEV DeployLambdaRole
担任ModuleAssumeRole
,而不是每个角色。
moduleDeployer.addToRolePolicy(
new PolicyStatement({
actions: ['sts:AssumeRole'],
resources: [MODULE_ASSUME_ROLE_ARN] // "*" valid, but not least-privilege
})
)
删除其他moduleDeployer.addToRolePolicy
调用。 没有必要。
注意应用最小权限时两个角色之间的循环依赖。 ModuleAssumeRole
需要DeployLambdaRole
ARN 作为其信任策略。 DeployLambdaRole
的权限策略需要ModuleAssumeRole
ARN。 在这种情况下,处理此问题的最简单方法是使用显式角色名称而不是 CDK 生成的名称。 或者不要使用最小权限。
所以我把这个问题留给了我愚蠢的错误,因为错误信息让我很难找到罪魁祸首,所以也许会帮助别人。 我所有的 CDK 代码都是正确的,但我搞砸了将假定的临时凭据传递给 lambda 客户端。 我使用了一个小的配置合并实用程序,它基本上丢弃了过程中假定的信用。 糟糕的编码器。 没有披萨。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.