我有一个由多个变量组成的字符串,我将其用于许多不同的东西,例如标签和主机名。
有没有办法创建一个可重复使用的字符串,我可以通过模板来引用它?
对此有任何想法都将不胜感激。编辑:一个例子是传递两个参数,例如 ProjectName 和 Environment 将它们连接起来
"Fn::Join" : [ "-", [ {"Ref":"ProjectName"}, {"Ref":"Environment"} ] ]
并在很多地方使用结果
答案1
不幸的是,我的实验与你的结论一致,Graeme。我为此苦苦挣扎了一段时间,但没有找到通过 Fn::Join 计算字符串并将其保存在模板中以供日后使用的方法。
我可以和大家分享一个典型的例子吗?
截至 2014-09-18,在资源部分中存储字符串值以供重复使用的最复杂方法是通过(二级)映射。更好的是,我可以预先计算条件并确定是否使用字符串。但不幸的是,存储字符串根本行不通。
以下是此类映射的示例节……
"LoadBalancerBucketMap": {
"BucketName": {
"string": {
"Fn::Join": [
"-",
[
"mylb",
{
"Ref": "Environment"
},
"logs"
]
]
}
}
},
下面是资源中对它的访问表达式
"S3BucketName": {
"Fn::FindInMap": [
"LoadBalancerBucketMap",
"BucketName",
"string"
}
在此示例中,Environment 是一个带有方便默认值的文字字符串参数。因此,这是一个创建和重复使用字符串的非常清晰的示例。但 CloudFormation 处理器是这样说的……
模板验证错误:模板格式错误:每个 Mappings 属性必须是字符串或列表。
因此,我理解你的沮丧,因为模板中似乎没有办法提供临时字符串变量的效果。
…据我所知。但你最初收到的答案却与此相反(尽管没有例子)。
因此,如果有人确实有一个示例解决方法,那么他们可以分享吗?
答案2
您可以使用参数或映射来存储可在模板中使用的字符串。
答案3
不幸的是,我发现我无法实现我想要实现的目标。这没有帮助,但事实就是如此。
答案4
如果您尚未切换到 CDK,您可以考虑切换到 YAML。YAML 有一个锚点 ( &
) 和别名 ( *
) 的概念,它们可以在文档的任何地方使用。必须在使用别名之前定义锚点。还有一个合并功能 ( <<: *<name>
),它几乎总是受支持,包括 SAM 或我正在使用的任何功能,但不是 YAML 规范中的官方功能。
这样,在首次定义之后,您可以轻松地重复使用您想要的任何内容。
Resources:
Hello:
Type: AWS::Serverless::Function
Properties: &FUNCTION_PROPERTIES # This is the anchor
Handler: index.handler
Runtime: python3.6
InlineCode: |
def handler(event, context):
print("Hello, world!")
ReservedConcurrentExecutions: 30
Layers:
- Ref: MyLayer
Tracing: Active
Timeout: 120
FileSystemConfigs:
- Arn: !Ref MyEfsFileSystem
LocalMountPath: /mnt/EFS
Policies:
- AWSLambdaExecute
- Version: '2012-10-17'
Statement:
- Effect: Allow
Action:
- s3:GetObject
- s3:GetObjectACL
Resource: 'arn:aws:s3:::my-bucket/*'
Events:
ApiEvent:
Type: Api
Properties:
Path: /path
Method: get
Goodbye:
Type: AWS::Serverless::Function
Properties:
<<: *FUNCTION_PROPERTIES # This is the alias
InlineCode: |
def handler(event, context):
print("Goodbye, world!")