在 cloudformation 中是否可以创建可重复使用的字符串?

在 cloudformation 中是否可以创建可重复使用的字符串?

我有一个由多个变量组成的字符串,我将其用于许多不同的东西,例如标签和主机名。

有没有办法创建一个可重复使用的字符串,我可以通过模板来引用它?

对此有任何想法都将不胜感激。编辑:一个例子是传递两个参数,例如 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!")

相关内容