AWS Cloudformation - 如何在 json/yaml 模板中执行字符串大写或小写

Vik*_*wad 17 json amazon-s3 amazon-web-services aws-cloudformation aws-cloudformation-custom-resource

在此处输入图片说明

我正在研究 AWS CloudFormation,我创建了一个模板,我要求用户在其中选择环境。

根据选定的价值,我创建了资源。用户必须在 DEV、QA、PROD、UAT 等之间进行选择,但是当我将此值添加到 S3 存储桶名称 (-downloads.com) 后,这是不允许的,因为 S3 存储桶名称中不允许使用大写字母。

因此,我确实在 JSON 中进行了更改,其中我将fn::Transform"Condition":"Lower" 一起使用, 但随后在创建以下资源时发生错误。

未找到名为 871247504605::String 的转换。用户请求回滚。

下面是我的 CloudFormation JSON

{
    "AWSTemplateFormatVersion": "2010-09-09",
    "Description": "Provides nesting for required stacks to deploy a full resource of ****",
    "Metadata": {
        "AWS::CloudFormation::Interface": {
            "ParameterGroups": [
                {
                    "Label": {
                        "default": "Enviroment Selection"
                    },
                    "Parameters": [
                        "selectedEnv"
                    ]
                }
            ],
            "ParameterLabels": {
                "selectedEnv": {
                    "default": "Please select Enviroment"
                }
            }
        }
    },
    "Parameters": {
        "selectedEnv": {
            "Type": "String",
            "Default": "DEV",
            "AllowedValues": [
                "DEV",
                "QA",
                "UAT",
                "PROD"
            ]
        }
    },
    "Resources": {
        "S3BucketName": {
            "Type": "AWS::S3::Bucket",
            "Properties": {
                "BucketName": {
                    "Fn::Join": [
                        "",
                        [
                            {
                                "Fn::Transform": {
                                    "Name": "MyString",
                                    "Parameters": {
                                        "InputString": {
                                            "Ref": "selectedEnv"
                                        },
                                        "Operation": "Lower"
                                    }
                                }
                            },
                            "-deployment.companyname.com"
                        ]
                    ]
                },
                "PublicAccessBlockConfiguration": {
                    "BlockPublicAcls": "true",
                    "BlockPublicPolicy": "true",
                    "IgnorePublicAcls": "true",
                    "RestrictPublicBuckets": "true"
                },
                "Tags": [
                    {
                        "Key": "ENV",
                        "Value": {
                            "Ref": "selectedEnv"
                        }
                    },
                    {
                        "Key": "Name",
                        "Value": {
                            "Fn::Join": [
                                "",
                                [
                                    {
                                        "Ref": "selectedEnv"
                                    },
                                    "deployments"
                                ]
                            ]
                        }
                    }
                ]
            },
            "Metadata": {
                "AWS::CloudFormation::Designer": {
                    "id": "c81705e6-6c88-4a3d-bc49-80d8736bd88e"
                }
            }
        },
        "QueueForIOT": {
            "Type": "AWS::SQS::Queue",
            "Properties": {
                "QueueName": {
                    "Fn::Join": [
                        "",
                        [
                            {
                                "Ref": "selectedEnv"
                            },
                            "QueueForIOT"
                        ]
                    ]
                },
                "DelaySeconds": "0",
                "MaximumMessageSize": "262144",
                "MessageRetentionPeriod": "345600",
                "ReceiveMessageWaitTimeSeconds": "20",
                "VisibilityTimeout": "30"
            },
            "Metadata": {
                "AWS::CloudFormation::Designer": {
                    "id": "6484fbb7-a188-4a57-a40e-ba9bd69d4597"
                }
            }
        }
    },
    "Outputs": {
        "Help": {
            "Description": "This is description",
            "Value": ""
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我的问题是,我想为 S3 存储桶或任何其他资源设置小写或有时大写的值。这该怎么做?

附上模板创建错误的图像。

Cla*_*ise 6

Young 先生是正确的,这就是您需要用来调用宏的语法。

然而,他们和文档都没有提到的关键因素是,为了调用转换宏,您需要将此堆栈部署到您的帐户中,然后才能使用自述文件中列出的功能。

https://github.com/awslabs/aws-cloudformation-templates/blob/master/aws/services/CloudFormation/MacrosExamples/StringFunctions/string.yaml

我认为文档可以在这方面得到澄清,我会看看是否可以进行澄清


Vik*_*wad 5

我得到了这个问题的答案。为此,我使用了映射 JSON,其中添加了诸如“如果所选值是 DEV 则使用 dev”、“如果是 QA 则使用 qa”之类的值,并在下面使用了使用Fn:FindInMap 的JSON

[ { "Fn::FindInMap": [ "Enviroment", "PlatformName", { "Ref": "selectedEnv" } ] }, "clientname" ]

以下是映射 JSON:

"映射" : { "环境" : { "平台名称" : { "DEV" : "dev", "QA" : "qa", "UAT" : "uat", "PROD" : "prod" } } }

  • 我也这样做过,但真的希望他们能证明我们可以用于这些简单操作的函数。在发送到 CloudFormation 之前,我一直在 Jenkins Shell 中进行这些类型的操作。外壳示例:UpperVar=DEV, LowerVar=${UpperVar,,} (4认同)