gpt4 book ai didi

yaml - 如何根据 IAM 角色 CloudFormation 模板中的参数提供不同的条件

转载 作者:行者123 更新时间:2023-12-01 06:20:56 24 4
gpt4 key购买 nike

我正在为将通过 STS 承担的 IAM 角色编写 CloudFormation 模板。我需要添加一个条件,其中键等于值,其中键和值都取决于“Stage”参数。我已经能够根据参数以编程方式更改该值,但我所有基于阶段更改 key 的尝试都失败了。

我尝试使用 map 和 !FindInMap 来获取正确的 key ,并尝试使用 !If 构建两种情况的条件。

第一种情况...

Mappings:
Constants:
beta:
Id: "beta.example.com"
Endpoint: "beta-link.example.com/api/oauth2/v2:aud"
prod:
Id: "example.com"
Endpoint: "link.example.com/api/oauth2/v2:aud"

AssumeRolePolicyDocument:
Statement:
Action:
- "sts:AssumeRoleWithWebIdentity"
Condition:
StringEquals:
!FindInMap [Constants, !Ref Stage, Endpoint]:
- !FindInMap [Constants, !Ref Stage, Id]

...我收到错误: map 键必须是字符串;而是收到了一张 map

在第二种情况...

AssumeRolePolicyDocument:
Statement:
Action:
- "sts:AssumeRoleWithWebIdentity"
Condition:
!If
- !Equals [!Ref Stage, prod]
- StringEquals:
"link.example.com/api/oauth2/v2:aud": "example.com"
- StringEquals:
"beta-link.example.com/api/oauth2/v2:aud": "beta.example.com"

...我收到另一个错误:模板格式错误:条件只能是对参数和其他条件的 bool 运算

简而言之,如何指定键和值都依赖于参数的条件?

最佳答案

我连续奋斗了大约8个小时,终于找到了这个问题的答案。我想为观众总结一下问题:

问题陈述:作为一名基础设施工程师,我想为 AWS::IAM::Role 编写一个 cloudformation 资源,它定义一个带有 Condition 子句的 AssumeRolePolicyDocument,其中的键需要参数化。另外一个问题是我们可以将内部函数与条件键一起使用吗?

答案:是的,可以使用开箱即用的样式。 AssumeRolePolicyDocument 是根据 AWS Cloudformation documentation 的字符串类型对于“AWS::IAM::角色”。因此,无需将 YAML 样式数据用于 AssumeRolePolicyDocument 属性,只需使用 Fn::Sub 传递原始 JSON 格式的 Assumerole 策略,并使用变量来替换 key ,不会出现任何问题或警告。以下是您可以使用的示例。这是我试图解决的一个复杂用例,但它展示了如何使用 !SUB、!Select 等替换 IAM 条件子句下的键。

  ExampleAppRole:
Type: 'AWS::IAM::Role'
Properties:
RoleName: !Sub ${Environment}-ExampleAppRole
AssumeRolePolicyDocument:
Fn::Sub:
- |
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"Federated": "arn:aws:iam::${AWS::AccountId}:oidc-provider/oidc.eks.${AWS::Region}.amazonaws.com/id/${id}"
},
"Action": "sts:AssumeRoleWithWebIdentity",
"Condition": {
"StringEquals": {
"${clusterid}": "${serviceaccount}"
}
}
}
]
}
-
clusterid: !Join ["",[!Sub "oidc.eks.${AWS::Region}.amazonaws.com/id/",!Select [1, !Split ["//", !Select [0, !Split [".", !GetAtt Cluster.Endpoint]]]],":sub"]]
id: !Select [1, !Split ["//", !Select [0, !Split [".", !GetAtt Cluster.Endpoint]]]]
Region: !Sub ${AWS::Region}
serviceaccount: system:serviceaccount:default:awsiamroleexample
Path: /
ManagedPolicyArns:
- !Ref SnsPublishAccessPolicy

请在评论部分告诉我你的想法。

关于yaml - 如何根据 IAM 角色 CloudFormation 模板中的参数提供不同的条件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57719471/

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