gpt4 book ai didi

amazon-web-services - AWS Cloudformation 定义策略一次,与多个角色关联

转载 作者:行者123 更新时间:2023-12-03 07:48:20 25 4
gpt4 key购买 nike

在 AWS CloudFront 中,我使用 AWS::IAM::Role 定义了两个单独的角色。在Policies 下有一个它们之间通用的策略。 (它们都应该具有相同的数据库访问权限。)我不想重复策略(其中列出了许多单独的操作),而是希望定义一次策略并从每个角色定义中引用该策略定义。

我看到有一个单独的 AWS::IAM::Policy我也许可以用来定义策略,但是如何在我的 AWS:IAM:Role 定义中引用该策略? AWS::IAM::Role Policy 中没有任何内容文档表明我可以引用某个策略,而无需内联提供整个策略文档。

AWS::IAM::Policy 似乎还表明需要组、角色或用户。因此,我不是期望从角色中引用策略,而是定义角色,然后单独创建一个引用现有角色的策略,而不是从角色本身引用通用策略?这似乎相当有限。

我宁愿定义一个策略,然后根据需要从角色中引用它,但这可能吗?还是我必须全力以赴创建一个AWS::IAM::ManagedPolicy为此?

最佳答案

这实际上有一个简单的答案。假设我定义了一个角色,允许我的 ECS 服务访问我的数据库表进行写入。它可能看起来像这样:

  EcsServiceTaskRole:
Type: AWS::IAM::Role
Properties:
RoleName: my-task-role
AssumeRolePolicyDocument:
Version: 2012-10-17
Statement:
- Effect: Allow
Principal:
Service:
- ecs-tasks.amazonaws.com
Action:
- sts:AssumeRole
Policies:
- PolicyName: store-in-database
PolicyDocument:
Version: 2012-10-17
Statement:
- Effect: Allow
Action:
- dynamodb:PutItem
Resource:
- !GetAtt MyDbTble.Arn

我还有一个想要访问数据库的 lambda:

  LambdaFunctionRole:
Type: AWS::IAM::Role
Properties:
RoleName: my-lambda-role
AssumeRolePolicyDocument:
Version: 2012-10-17
Statement:
- Effect: Allow
Principal:
Service:
- lambda.amazonaws.com
Action:
- sts:AssumeRole
Policies:
- PolicyName: store-in-database
PolicyDocument:
Version: 2012-10-17
Statement:
- Effect: Allow
Action:
- dynamodb:PutItem
Resource:
- !GetAtt MyDbTble.Arn
ManagedPolicyArns:
- !Sub "arn:${AWS::Partition}:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole"

如果我不想重复策略,我似乎无法定义策略并从角色中引用它。相反,我可以从初始角色定义中删除策略,并单独定义策略,指示应应用该策略的角色:

  EcsServiceTaskRole:
Type: AWS::IAM::Role
Properties:
RoleName: my-task-role
AssumeRolePolicyDocument:
Version: 2012-10-17
Statement:
- Effect: Allow
Principal:
Service:
- ecs-tasks.amazonaws.com
Action:
- sts:AssumeRole
Policies:
- PolicyName: store-in-database
PolicyDocument:
Version: 2012-10-17
Statement:
- Effect: Allow
Action:
- dynamodb:PutItem
Resource:
- !GetAtt MyDbTble.Arn

LambdaFunctionRole:
Type: AWS::IAM::Role
Properties:
RoleName: my-lambda-role
AssumeRolePolicyDocument:
Version: 2012-10-17
Statement:
- Effect: Allow
Principal:
Service:
- lambda.amazonaws.com
Action:
- sts:AssumeRole
Policies:
- PolicyName: store-in-database
PolicyDocument:
Version: 2012-10-17
Statement:
- Effect: Allow
Action:
- dynamodb:PutItem
Resource:
- !GetAtt MyDbTble.Arn
ManagedPolicyArns:
- !Sub "arn:${AWS::Partition}:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole"

DatabaseAccessPolicy:
Type: AWS::IAM::Policy
Properties:
PolicyName: store-in-database
PolicyDocument:
Version: 2012-10-17
Statement:
- Effect: Allow
Action:
- dynamodb:PutItem
Resource:
- !GetAtt MyDbTable.Arn
Roles:
- !Ref EcsServiceTaskRole
- !Ref LambdaFunctionRole

有趣的是,这似乎并没有在我可以看到的 AWS 账户中创建一些单独的策略实体(与 AWS::IAM::ManagedPolicy 无疑会不同),尽管它是通过名称标识的。在 IAM 控制台中,策略已分别附加到每个角色,就好像我已内联定义它一样。

CloudFormation 有一千种引用事物的方法,并且它一直在发明新的方法。在这种情况下,它采取的方法似乎是反向引用,即将策略应用于角色,而不是从角色本身引用策略。因此,跨 CloudFormation 堆栈使用它可能不会像其他方式那样灵活。显然他们希望您为此使用托管策略。但为了防止一个 CloudFormation 模板内的定义重复,它似乎工作得很好。

关于amazon-web-services - AWS Cloudformation 定义策略一次,与多个角色关联,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/76637582/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com