如何根据 IAM 角色云形成模板中的参数提供不同的条件



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

我已经尝试过使用地图和!FindInMap 以获取正确的键,并尝试使用 !如果。

在第一种情况下...

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 keys must be strings; received a map instead

在第二种情况下...

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"

。我收到另一个错误:Template format error: Conditions can only be boolean operations on parameters and other conditions

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

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

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

:是的,可以使用开箱即用的样式。AssumeRolePolicyDocument是一种字符串类型,符合 AWS Cloudformation 文档的"AWS::IAM::Role"。因此,无需将 YAML 样式数据用于AssumeRolePolicyDocument属性,只需使用Fn::Sub传递原始 JSON 格式的 Assumerole 策略,并使用变量替换密钥,而不会出现任何问题或警告。下面是您可以使用的示例。这是我试图解决的一个复杂用例,但它显示了如何使用 !子!选择等

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

在评论部分让我知道您的想法。

我认为不允许在 IAM 策略条件元素中使用内部函数,我还没有看到任何这样的例子。条件元素仅接受一组预定义的键。我想你可以试试下面的模板,它有点冗长,但它应该可以工作。由云卡斯特提供支持的模板

{  
"AWSTemplateFormatVersion":"2010-09-09",
"Description":"Template created by CloudKast",
"Parameters":{  
},
"Mappings":{  
},
"Conditions":{  
"Prod":{  
"Fn::Equals":[  
{  
"Ref":"Stage"
},
"prod"
]
},
"Dev":{  
"Fn::Equals":[  
{  
"Ref":"Stage"
},
"dev"
]
}
},
"Resources":{  
"ProdRole":{  
"Properties":{  
"AssumeRolePolicyDocument":{  
"Version":"2012-10-17",
"Statement":[  
{  
"Sid":"Stmt1567153169873",
"Action":[  
"sts:AssumeRoleWithWebIdentity"
],
"Effect":"Allow",
"Resource":"arn:aws:iam::namespace::relativeid"
}
]
},
"RoleName":"ProdRole"
},
"Type":"AWS::IAM::Role",
"Condition":"Prod"
},
"DevRole":{  
"Properties":{  
"AssumeRolePolicyDocument":{  
"Version":"2012-10-17",
"Statement":[  
{  
"Sid":"Stmt1567153169873",
"Action":[  
"sts:AssumeRoleWithWebIdentity"
],
"Effect":"Allow",
"Resource":"arn:aws:iam::namespace::relativeid"
}
]
},
"RoleName":"DevRole"
},
"Type":"AWS::IAM::Role"
}
},
"Outputs":{  
}
}

相关内容

  • 没有找到相关文章

最新更新