如何在 CloudFormation 中将字符串列表作为参数传递?
Posted
技术标签:
【中文标题】如何在 CloudFormation 中将字符串列表作为参数传递?【英文标题】:How do I pass a list of strings as a parameter in CloudFormation? 【发布时间】:2019-02-05 07:33:18 【问题描述】:我有一个嵌套的 CloudFormation 模板,它接受来自其根模板的许多参数来配置它。目前我只传递简单的字符串参数,但现在我需要将 S3 存储桶 ARN 列表传递到子模板。
ChildLambdaStack:
Type: AWS::CloudFormation::Stack
Properties:
Parameters:
AwsRegion: !Ref AwsRegion
Environment: !Ref Environment
Product: !Ref Product
S3Buckets: "arn:aws:s3:::bucket1,arn:aws:s3:::bucket2"
TemplateURL: "https://s3.amazonaws.com/child-template.yml"
然后在子模板中我有这个
AWSTemplateFormatVersion: "2010-09-09"
Description: "Child Lambda"
Parameters:
AwsRegion:
Type: String
Environment:
Type: String
Product:
Type: String
S3Buckets:
Type: String
Resources:
DeployerPolicy:
Type: AWS::IAM::ManagedPolicy
Properties:
PolicyDocument:
Version: "2012-10-17"
Statement:
- Effect: Allow
Action:
- s3:PutObject
- s3:GetObject
- s3:DeleteObject
- s3:CreateBucket
- s3:DeleteBucket
- s3:ListBucket
- s3:PutBucketNotification
Resource:
- Fn::Split:
- ","
- !Ref S3Buckets
我的想法是,我输入的 S3 存储桶 ARN 列表会像这样在子模板中展开
Resource:
- arn:aws:s3:::bucket1
- arn:aws:s3:::bucket2
但是当我运行模板时,它只是出错了
Syntax errors in policy. (Service: AmazonIdentityManagement; Status Code: 400; Error Code: MalformedPolicyDocument)
我尝试了其他变体,例如使用 CommaDelimitedList
参数类型,但没有一个可行。有没有一种简单的方法可以将字符串列表作为参数传递?
【问题讨论】:
【参考方案1】:正如@MaiKaY 指出的那样,@Liam Mayfair 代码中的缺陷是Fn::Split
前面有-
,这导致列表包含单个元素,即列表。固定代码看起来像
...
Resource:
Fn::Split:
- ","
- !Ref S3Buckets
一般来说,您必须确保在使用Fn::Split
时使用String
而不是CommaDelimitedList
的参数类型,因为它不会拆分CommaDelimitedList
。
CommaDelimitedList
与Fn::Split
一起使用,您将收到错误Template error: every Fn::Split object requires two parameters, (1) a string delimiter and (2) a string to be split or a function that returns a string to be split
如果您使用 CommaDelimitedList
而不使用 Fn::Split
,您将收到错误 Syntax errors in policy
【讨论】:
【参考方案2】:因为!Split
的返回值是A list of string values.
,所以我会这样做:
[...]
Resource: !Split [",", !Ref S3Buckets]
[...]
【讨论】:
这与 OP 所做的有什么不同吗?它是内联的,但除此之外它使用相同的参数调用相同的函数,对吧? 不一样。 OP 在Fn::Split
前面添加了一个额外的-
,这意味着它传递了一个带有字符串的列表值的列表。以上是关于如何在 CloudFormation 中将字符串列表作为参数传递?的主要内容,如果未能解决你的问题,请参考以下文章
JPA - 如何在 DDL 中将字符串列设置为 varchar(max)
如何在 CloudFormation 中将字符串列表作为参数传递?