AWS Cloudformation: cómo hacer una cadena en mayúsculas o minúsculas en la plantilla json / yaml

8

ingrese la descripción de la imagen aquíEstoy trabajando en AWS CloudFormation y creé una plantilla en la que le pedí al usuario que seleccionara Entorno.

Sobre la base del valor seleccionado, creé los recursos. El usuario tiene que seleccionar entre DEV, QA, PROD, UAT, etc., pero cuando agrego este valor al nombre del depósito S3 (-downloads.com) no está permitido porque la letra mayúscula no está permitida en el nombre del depósito S3.

Así que cambié en JSON donde uso fn :: Transform con "Condición": "Lower" pero luego, al crear recursos, se produce un error por debajo.

Ninguna transformación llamada 871247504605 :: Cadena encontrada. Rollback solicitado por el usuario.

A continuación se muestra mi 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": ""
        }
    }
}

Mi pregunta es que quiero hacer un valor en minúsculas o, a veces, mayúsculas para el depósito S3 o cualquier otro recurso. ¿Cómo hacer? Gracias por adelantado.

Imagen de error de creación de plantilla adjunta.

Vikramsinh Gaikwad
fuente
3
El JSON no es válido, ¿puedes compartir la plantilla completa de cloudformatino?
Amit Baranes
He actualizado la pregunta y JSON también. Por favor, ayúdame. Gracias
Vikramsinh Gaikwad
1
No queda claro a partir de su pregunta si tiene una MyStringmacro de implementación de la función lambda que requiere aws para crear transformaciones personalizadas. Más información se puede encontrar aquí . Ejemplo (incluida la función lambda) se puede encontrar aquí .
Hombre molecular
1
Podría simplemente minúsculas las entradas del usuario, es decir, DEV = dev
George Rushby
2
no puedes hacer esta transformación solo con json / yaml. Aunque lo que podría hacer con json / yaml solo es mapear DEV to dev, PROD to prod, etcincorporando mapeos y Fn :: FindInMap en su plantilla.
Hombre molecular

Respuestas:

3

Tengo la respuesta de esta pregunta. Para esto, utilicé Mappings JSON en el que agregué valores como If Selected value is DEV, luego use dev, If QA y qa like this, y usé debajo de JSON que usó Fn: FindInMap

[{"Fn :: FindInMap": ["Entorno", "PlatformName", {"Ref": "selectedEnv"}]}, "nombre de cliente"]

A continuación se muestra el mapeo JSON:

"Mapeos": {"Entorno": {"PlatformName": {"DEV": "dev", "QA": "qa", "UAT": "uat", "PROD": "prod"}}}

Vikramsinh Gaikwad
fuente
1
Yo también lo he hecho así, pero realmente desearía que demostraran una función que podamos usar para estas manipulaciones simples. He estado recurriendo a hacer este tipo de manipulaciones en Jenkins Shell antes de enviarlo a CloudFormation. Ejemplo de Shell: UpperVar = DEV, LowerVar = $ {UpperVar ,,}
jDub9