AWS Cloudformation - So führen Sie Zeichenfolgen in Großbuchstaben oder Kleinbuchstaben in der JSON / YamL-Vorlage aus

8

Geben Sie hier die Bildbeschreibung einIch arbeite an AWS CloudFormation und habe eine Vorlage erstellt, in der ich den Benutzer gebeten habe, Umgebung auszuwählen.

Auf Basis des ausgewählten Wertes habe ich die Ressourcen erstellt. Der Benutzer muss zwischen DEV, QA, PROD, UAT usw. wählen, aber wenn ich diesen Wert an den S3-Bucket-Namen (-downloads.com) anhänge, ist dies nicht zulässig, da Großbuchstaben im S3-Bucket-Namen nicht zulässig sind.

Also habe ich in JSON geändert, wo ich fn :: Transform mit "Condition": "Lower" verwende, aber dann beim Erstellen von Ressourcen unterhalb des Fehlers auftritt.

Keine Transformation mit dem Namen 871247504605 :: String gefunden. Vom Benutzer angeforderter Rollback.

Unten ist mein 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": ""
        }
    }
}

Meine Frage ist, ich möchte Kleinbuchstaben oder manchmal Großbuchstaben für S3-Bucket oder andere Ressourcen verwenden. Wie macht man? Danke im Voraus.

Bild des Vorlagenerstellungsfehlers beigefügt.

Vikramsinh Gaikwad
quelle
3
Der JSON ist ungültig. Können Sie die vollständige Cloudformatino-Vorlage freigeben?
Amit Baranes
Ich habe die Frage und JSON auch aktualisiert. Bitte hilf mir. Danke
Vikramsinh Gaikwad
1
Aus Ihrer Frage geht nicht hervor, ob Sie eine Lambda-Funktion haben, die ein MyStringMakro implementiert, das von aws benötigt wird, um benutzerdefinierte Transformationen zu erstellen. Weitere Infos finden Sie hier . Ein Beispiel (einschließlich der Lambda-Funktion) finden Sie hier .
Molecular Man
1
Sie können die Benutzereingaben einfach in Kleinbuchstaben schreiben, dh DEV = dev
George Rushby
2
Sie können diese Transformation nicht nur mit json / yaml durchführen. Mit json / yaml können Sie jedoch nur eine Zuordnung vornehmen, DEV to dev, PROD to prod, etcindem Sie Zuordnungen und Fn :: FindInMap in Ihre Vorlage integrieren.
Molecular Man

Antworten:

3

Ich habe die Antwort auf diese Frage bekommen. Dafür habe ich Mappings JSON verwendet, in dem ich Werte wie Wenn ausgewählter Wert DEV ist, dann benutze dev, wenn QA dann qa wie folgt und unter JSON verwendet, das Fn: FindInMap verwendet

[{"Fn :: FindInMap": ["Umgebung", "Plattformname", {"Ref": "selectedEnv"}]}, "Clientname"]

Unten ist der Mappings JSON:

"Mappings": {"Enviroment": {"PlatformName": {"DEV": "dev", "QA": "qa", "UAT": "uat", "PROD": "prod"}}}

Vikramsinh Gaikwad
quelle
1
Auch ich habe das so gemacht, aber ich wünschte wirklich, sie würden eine Funktion beweisen, die wir für diese einfachen Manipulationen verwenden können. Ich habe diese Art von Manipulationen in Jenkins Shell durchgeführt, bevor ich sie an CloudFormation gesendet habe. Shell-Beispiel: UpperVar = DEV, LowerVar = $ {UpperVar ,,}
jDub9
1

Sie können dies mit einem CloudFormation-Makro tun.

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

Herr Young
quelle