我正在为 KMS 密钥开发云形成模板。在策略文档中,我想根据阶段(无论是生产还是测试(设置主体。如果两个阶段只有一个主体,我可以轻松使用Fn:If
。但是我每个阶段都有不止一个原则,Fn:If 只允许您根据我的理解分配一个值,而不是集合(如果我错了,请纠正我(。
我尝试将集合分配给值,它给了我"映射键必须是字符串;而是收到集合"错误,使用 AWS 中的 CloudFormation 设计器验证模板。
"MyEncryptionKey": {
"DeletionPolicy": "Retain",
"Properties": {
"Description": "MyEncryptionKey",
"EnableKeyRotation": true,
"Enabled": true,
"KeyPolicy": {
"Statement": [
{
"Action": "kms:*",
"Effect": "Allow",
"Principal": {
"AWS": "root"
},
"Resource": "*"
},
{
"Action": "kms:Decrypt",
"Effect": "Allow",
"Principal": {
"AWS": [
{
"Fn::If": [
"IsProd",
{["arn1","arn2"]},
"arn2"
]
}
]
},
"Resource": "*"
}
]
}
},
"Version": "2012-10-17",
"Type": "AWS::KMS::Key"
}
理想情况下,密钥策略中的第二条语句应具有两个 arn 值(如果不是 prod(和一个 arn 值。
我也愿意探索是否有任何其他方法可以实现这一目标,而不是在这里使用Fn::If
不要将 Fn::If 计算的值视为单个数组项,而应将其视为数组。 将主体替换为以下内容,它将起作用。
杰伦
{
"Principal": {
"AWS": {
"Fn::If": [
"IsProd",
[
"arn1"
],
[
"arn1",
"arn2"
]
]
}
}
}
在 yaml 中看起来很简单
Principal:
AWS:
Fn::If:
- IsProd
- - arn1
- - arn1
- arn2
实际上,如果您在数组中插入一个空元素(AWS::NoValue
(,CloudFormation 将忽略它。因此,您可以执行此操作,而不是复制数组的所有常见元素:
Principal:
AWS:
- "arn1"
- "Fn::If":
- "IsProd"
- Ref: "AWS::NoValue"
- "arn2"
我不确定它是否适用于您的特定使用案例,但我只是使用它来有条件地添加 CloudFront 缓存行为和来源,并且它奏效了。