首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >AWS IRole.addManagedPolicy()没有作用,IRole.attachInlinePolicy()起作用。为什么?

AWS IRole.addManagedPolicy()没有作用,IRole.attachInlinePolicy()起作用。为什么?
EN

Stack Overflow用户
提问于 2021-07-21 16:03:06
回答 3查看 1.6K关注 0票数 3

我正在和两个CDK栈一起工作。

  • 堆栈A创建一个将权限授予资源的iam.ManagedPolicy
  • 堆栈B尝试导入此托管策略(IManagedPolicy),导入角色(IRole),然后使用IRole.addManagedPolicy(IManagedPolicy)将托管策略附加到角色
代码语言:javascript
复制
// Stack B
const iam = require("@aws-cdk/aws-iam");

const ec2InstanceRole = iam.Role.fromRoleArn(this, 'my-role', 'the-arn-of-the-role');

const managedPolicy = iam.ManagedPolicy.fromManagedPolicyName(this, 'my-managed-policy', 'name-of-the-policy');

ec2InstanceRole.addManagedPolicy(managedPolicy);

当我部署Stack B时,没有错误。但是,角色也没有被修改。如果我没有这样做,我做的是:

  • 在堆栈B中,导入相同的角色(IRole)
  • 调用IRole.attachInlinePolicy(iam.Policy)并在iam.Policy中定义与Stack A在托管策略中定义的权限相同的权限,可以修改堆栈B中的角色。
代码语言:javascript
复制
// Stack B
const iam = require("@aws-cdk/aws-iam");

const ec2InstanceRole = iam.Role.fromRoleArn(this, 'my-role', 'the-arn-of-the-role');

ec2InstanceRole.attachInlinePolicy(
    new iam.Policy(this, 'test-policy', {
        policyName: 'test-policy-name',
        statements: [
            new iam.PolicyStatement({
                effect: iam.Effect.ALLOW,
                actions: ['product:capability'],
                resources: ['arn-of-resource']
            })
        ]
    })
);

这是可行的。通过添加包含定义的权限的新内联策略来修改角色。

一些额外的背景信息..。

  • 角色和管理策略都在同一个帐户中。
  • 我正在使用CDK 1.114.0。
  • Stack B中引用的角色是一个预先存在的角色,它不是由CDK管理的,而是附加到作为其实例配置文件角色的Ec2实例上的。
  • Stack A中定义的托管策略用于正在开发的新服务,而在Stack B中定义的服务需要与之交互。

为什么第一种方法失败而第二种方法成功?是否认为将内联策略附加到静态导入的角色是“更安全的”,因为我必须显式定义在策略中添加的权限,而不是从另一个堆栈中提取托管策略?这仅仅是在执行附加操作时在同一个堆栈中定义策略的问题(同样是某种安全措施)吗?我想做的事情有什么更根本的错误吗?

任何想法都将不胜感激。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2021-08-31 18:12:03

代码中的"FIXME“不支持这一点。

这个评论表明,这是由于CDK和CloudFormation相关的限制存在差距。当然,可以将托管策略附加/分离到现有角色,否则。

票数 2
EN

Stack Overflow用户

发布于 2021-11-19 01:47:47

我找到的解决办法如下。它并不完美,但它很好:

  1. 定义策略声明
  2. 使用该策略语句创建托管策略
  3. 将策略语句附加到导入的角色。

示例

代码语言:javascript
复制
const statement = new PolicyStatement({
    effect: Effect.ALLOW,
    actions: ['execute-api:Invoke'],
    resources: [
        //SOME RESOURCE
    ]
})
this.cloudAuthAccessPolicy = new ManagedPolicy(this, 'FOO', {
    managedPolicyName: 'FOO',
    description: "BAR",
    statements: [
        statement
    ]
})

const role = Role.fromRoleArn(this, `name`, `arn:aws:iam::${props.account}:role/SOME_ROLE_NAME`)
role.addToPolicy(statement)
票数 1
EN

Stack Overflow用户

发布于 2021-07-21 17:11:38

这很有趣。如果您还没有获得有关托管/内联策略的其他信息,我建议您阅读policies.html

另外,您是否尝试过在stack B中创建ManagedPolicy并应用它,而不是从不同的堆栈导入它?可能是进口失败或诸如此类的事情。

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68472867

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档