是的,这在纯CloudFormation中是可能的,但很困难且需要一些技巧。您需要滥用几乎所有可用的CloudFormation函数。
请考虑以下步骤:
1. 首先添加一个参数并要求逗号分隔的输入。
2. 使用逗号填充参数以强制为空值,并使用!Select和!Not来确定有多少个不为空。
3. 然后为每个设置的值设置一个条件(即列表中有一个项目?两个?三个?)。
4. 然后对于每个条件为true的情况,可以使用!Select在参数列表中查找该值。
这里有一个例子。请原谅我没有将所有内容拆分成纯YAML,我保留了JSON以使其至少有些可读性,但像PyCharm这样的工具会发出警告,尽管AWS认为它很好:
AWSTemplateFormatVersion: "2010-09-09"
Parameters:
MyCommaSeparatedParameters:
Type: String
Default: FirstParam,SecondParam,ThirdParam
Conditions:
# See the additional commas? That's to prevent erroring out when there's less than 3 items in the list
ConditionParam0: !Not [!Equals [!Select [0, !Split [',', !Sub '${MyCommaSeparatedParameters},,,']], '']]
ConditionParam1: !Not [!Equals [!Select [1, !Split [',', !Sub '${MyCommaSeparatedParameters},,,']], '']]
ConditionParam2: !Not [!Equals [!Select [2, !Split [',', !Sub '${MyCommaSeparatedParameters},,,']], '']]
Resources:
Ec2InstanceIamDefaultPolicy:
Type: "AWS::IAM::ManagedPolicy"
Properties:
ManagedPolicyName: "SomeRandomPolicy"
PolicyDocument:
Version: "2012-10-17"
Statement:
- Effect: "Allow"
Action:
- "s3:GetObject"
Resource:
- !If
- ConditionParam0
- !Sub
- "arn:aws:s3:::vopak-infra-automations/${param}"
- param: !Select [0, !Split [',', !Sub '${MyCommaSeparatedParameters},,,']]
- !Ref "AWS::NoValue"
- !If
- ConditionParam1
- !Sub
- "arn:aws:s3:::vopak-infra-automations/${param}"
- param: !Select [1, !Split [',', !Sub '${MyCommaSeparatedParameters},,,']]
- !Ref "AWS::NoValue"
- !If
- ConditionParam2
- !Sub
- "arn:aws:s3:::vopak-infra-automations/${param}"
- param: !Select [2, !Split [',', !Sub '${MyCommaSeparatedParameters},,,']]
- !Ref "AWS::NoValue"
你可能需要使用一个 Condition 属性,以一组单独的角色来创建你想要的内容,而不是基于列表的创建方式,就像我在这里所做的那样。