web-dev-qa-db-ja.com

AWS Cloudformation-json / yamlテンプレートで大文字または小文字の文字列を実行する方法

enter image description here

私はAWS CloudFormationで作業しており、環境を選択するようユーザーに要求するテンプレートを1つ作成しました。

選択した値に基づいて、リソースを作成しました。ユーザーはDEV、QA、PROD、UATなどから選択する必要がありますが、この値をS3バケット名(-downloads.com)に追加すると、S3バケット名では大文字が許可されないため許可されません。

だから私は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": ""
        }
    }
}

私の質問は、S3バケットまたはその他のリソースに対して小文字または場合によっては大文字の値を実行することです。これを行う方法?

テンプレート作成エラーの画像が添付されています。

10

CloudFormationマクロでこれを行うことができます。

Parameters:
  InputString:
    Default: "This is a test input string"
    Type: String
Resources:
  S3Bucket:
    Type: "AWS::S3::Bucket"
    Properties:
      Tags:
        - Key: Upper
          Value:
            'Fn::Transform':
             - Name: 'String'
               Parameters:
                 InputString: !Ref InputString
                 Operation: Upper

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

2
Mr. Young

この質問の答えを得ました。このために、私はマッピングJSONを使用しました。ここで、If Selected値がDEVの場合に値を追加し、次にdevを使用し、QAの場合はこのようにqaし、以下を使用したJSONを使用しましたFn:هnMap

[{"Fn :: AddItemnMap":["環境"、 "プラットフォーム名"、{"参照": "選択されたEnv"}]}、 "クライアント名"]

以下はマッピングJSONです。

"マッピング":{"環境":{"プラットフォーム名":{"DEV": "dev"、 "QA": "qa"、 "UAT": "uat"、 "PROD": "prod"}}}

3