AWS Cloudformation- Como executar uma seqüência de caracteres em maiúsculas ou minúsculas no modelo json / yaml

8

insira a descrição da imagem aquiEstou trabalhando no AWS CloudFormation e criei um modelo no qual pedi ao usuário para selecionar Ambiente.

Com base no valor selecionado, criei os recursos. O usuário precisa selecionar entre DEV, QA, PROD, UAT etc., mas quando eu sufixo esse valor no nome do bloco S3 (-downloads.com), não é permitido porque letras maiúsculas não são permitidas no nome do bloco S3.

Então mudei no JSON, onde uso fn :: Transform com "Condition": "Lower" mas ocorre a criação de recursos abaixo do erro.

Nenhuma transformação denominada 871247504605 :: String encontrada. Reversão solicitada pelo usuário.

Abaixo está meu 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": ""
        }
    }
}

Minha pergunta é: eu quero fazer um valor em minúsculas ou às vezes em maiúsculas para o bucket S3 ou qualquer outro recurso. Como fazer? Desde já, obrigado.

Imagem do erro de criação do modelo anexada.

Vikramsinh Gaikwad
fonte
3
O JSON é inválido. Você pode compartilhar o modelo completo do cloudformatino?
Amit Baranes
Atualizei a pergunta e o JSON também. Por favor, me ajude. Obrigado
Vikramsinh Gaikwad
1
Não está claro em sua pergunta se você possui a função lambda implementando uma MyStringmacro que é requerida pelo aws para criar transformações personalizadas. Mais informações podem ser encontradas aqui . Exemplo (incluindo a função lambda) pode ser encontrado aqui .
Molecular Man
1
Você pode apenas minúsculas as entradas do usuário, ou seja, DEV = dev
George Rushby 07/01
2
você não pode fazer essa transformação apenas com json / yaml. Embora o que você possa fazer apenas com json / yaml seja mapear DEV to dev, PROD to prod, etc, incorpore mapeamentos e Fn :: FindInMap ao seu modelo.
Molecular Man

Respostas:

3

Eu recebi a resposta desta pergunta. Para isso, usei JSON de mapeamentos nos quais adicionei valores como Se o valor selecionado é DEV, use dev, Se QA, faça um qa como este e usei abaixo o JSON que usou Fn: FindInMap

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

Abaixo está o JSON de mapeamentos:

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

Vikramsinh Gaikwad
fonte
1
Eu também fiz assim, mas realmente gostaria que eles provassem uma função que podemos usar para essas manipulações simples. Estive recorrendo a esses tipos de manipulação no Jenkins Shell antes de enviar para o CloudFormation. Exemplo de Shell: UpperVar = DEV, LowerVar = $ {UpperVar ,,}
jDub9 03/04
1

Você pode fazer isso com uma macro 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

Mr. Young
fonte