formation español cloudformation aws amazon-web-services automation condition amazon-cloudformation

amazon web services - español - Cómo verificar si un recurso específico ya existe en el script de CloudFormation



aws cloudformation (3)

No hay una forma obvia de hacerlo, a menos que cree la plantilla dinámicamente con una comprobación explícita. Las pilas creadas a partir de la misma plantilla son entidades independientes, y si crea una pila que contiene un depósito, elimine la pila mientras conserva el depósito y luego crea una nueva pila (incluso una con el mismo nombre), no hay conexión entre esta. Nueva pila y el cubo creado como parte de la pila anterior.

Si desea usar el mismo cubo S3 para varias pilas (incluso si solo existe una de ellas a la vez), ese cubo no pertenece realmente a la pila. Tendría más sentido crear el cubo en una pila separada, usando una plantilla separada (que coloca la URL del depósito en la sección "Salidas") y luego la referencia desde su pila original utilizando un parámetro.

Estoy usando Cloud Formation para crear una pila que incluye una instancia de EC2 a escala automática y un grupo de S3. Para el grupo de S3 tengo DeletionPolicy configurado para Retener, que funciona bien, hasta que deseo volver a ejecutar mi script de formación de nube nuevamente. Como en las ejecuciones anteriores, la secuencia de comandos creó el grupo S3, falla en las ejecuciones posteriores y dice que mi grupo S3 ya existe. Ninguno de los otros recursos, por supuesto, se crean también. Mi pregunta es cómo verifico si mi grupo de S3 existe primero dentro del script de formación de nubes y, si es así, omito la creación de esos recursos. He buscado en las condiciones de AWS, pero parece que todo está basado en parámetros, todavía tengo que encontrar una función que verifique los recursos existentes.


Si realiza actualizaciones, (potencialmente de pilas dentro de pilas, también conocidas como Pilas anidadas), las partes sin cambios no se actualizan. https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-stack.html?icmpid=docs_cfn_console_designer

A continuación, puede establecer políticas como se menciona para evitar la eliminación. [recuerde los permisos de ''cancelar actualización'' para rollbacks] https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/protect-stack-resources.html

También hay que tener en cuenta la salida de pila cruzada al agregar nombres de exportación a las salidas de pila. http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/outputs-section-structure.html Tutorial ... http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/walkthrough-crossstackref.html

Entonces necesita usar Fn :: ImportValue ... http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-importvalue.html

Implica que uno podría usar un parámetro de nombre de pila de red.

Desafortunadamente, obtienes un error como este cuando los pruebas en Condiciones.

Error de validación de plantilla: Error de plantilla: no se puede usar Fn :: ImportValue en condiciones.

¿O en los parámetros?

Error de validación de plantilla: Error de formato de plantilla: cada miembro predeterminado debe ser una cadena.

También esto puede suceder al intentar ...

Error de formato de plantilla: La salida de salida de ExportOut tiene un formato incorrecto. El campo Nombre de Exportar no debe depender de ningún recurso, valor importado o Fn :: GetAZs.

Por lo tanto, no puede detenerlo haciendo que el recurso existente vuelva al mismo archivo. Solo cuando se coloca en otra pila y se usa la referencia de importación y exportación.

Pero si separa los dos, existe una dependencia que se detendrá y revertirá, por ejemplo, la eliminación de una dependencia, gracias a la referencia a través de la función ImportValue.

Ejemplo dado aquí es:

Primero haz una plantilla de grupo

{ "AWSTemplateFormatVersion": "2010-09-09", "Metadata": { "AWS::CloudFormation::Designer": { "6927bf3d-85ec-449d-8ee1-f3e1804d78f7": { "size": { "width": 60, "height": 60 }, "position": { "x": -390, "y": 130 }, "z": 0, "embeds": [] }, "6fe3a2b8-16a1-4ce0-b412-4d4f87e9c54c": { "source": { "id": "ac295134-9e38-4425-8d20-2c50ef0d51b3" }, "target": { "id": "6927bf3d-85ec-449d-8ee1-f3e1804d78f7" }, "z": 1 } } }, "Resources": { "TestGroup": { "Type": "AWS::IAM::Group", "Properties": {}, "Metadata": { "AWS::CloudFormation::Designer": { "id": "6927bf3d-85ec-449d-8ee1-f3e1804d78f7" } }, "Condition": "" } }, "Parameters": {}, "Outputs": { "GroupNameOut": { "Description": "The Group Name", "Value": { "Ref": "TestGroup" }, "Export": { "Name": "Exported-GroupName" } } } }

Luego haz una plantilla de usuario que necesite el grupo.

{ "AWSTemplateFormatVersion": "2010-09-09", "Metadata": { "AWS::CloudFormation::Designer": { "ac295134-9e38-4425-8d20-2c50ef0d51b3": { "size": { "width": 60, "height": 60 }, "position": { "x": -450, "y": 130 }, "z": 0, "embeds": [], "isrelatedto": [ "6927bf3d-85ec-449d-8ee1-f3e1804d78f7" ] }, "6fe3a2b8-16a1-4ce0-b412-4d4f87e9c54c": { "source": { "id": "ac295134-9e38-4425-8d20-2c50ef0d51b3" }, "target": { "id": "6927bf3d-85ec-449d-8ee1-f3e1804d78f7" }, "z": 1 } } }, "Resources": { "TestUser": { "Type": "AWS::IAM::User", "Properties": { "UserName": { "Ref": "UserNameParam" }, "Groups": [ { "Fn::ImportValue": "Exported-GroupName" } ] }, "Metadata": { "AWS::CloudFormation::Designer": { "id": "ac295134-9e38-4425-8d20-2c50ef0d51b3" } } } }, "Parameters": { "UserNameParam": { "Default": "testerUser", "Description": "Username For Test", "Type": "String", "MinLength": "1", "MaxLength": "16", "AllowedPattern": "[a-zA-Z][a-zA-Z0-9]*", "ConstraintDescription": "must begin with a letter and contain only alphanumeric characters." } }, "Outputs": { "UserNameOut": { "Description": "The User Name", "Value": { "Ref": "TestUser" } } } }

Conseguirás

No se ha encontrado ninguna exportación denominada Exported-GroupName. Rollback solicitado por el usuario.

Si se está ejecutando un usuario sin grupo encontrado exportado.

A continuación, podría utilizar el enfoque de pila anidada.

{ "AWSTemplateFormatVersion": "2010-09-09", "Metadata": { "AWS::CloudFormation::Designer": { "66470873-b2bd-4a5a-af19-5d54b11f48ef": { "size": { "width": 60, "height": 60 }, "position": { "x": -815, "y": 169 }, "z": 0, "embeds": [] }, "ed1de011-f1bb-4788-b63e-dcf5494d10d1": { "size": { "width": 60, "height": 60 }, "position": { "x": -710, "y": 170 }, "z": 0, "dependson": [ "66470873-b2bd-4a5a-af19-5d54b11f48ef" ] }, "c978f2d9-3fb2-4420-b255-74941f10a28a": { "source": { "id": "ed1de011-f1bb-4788-b63e-dcf5494d10d1" }, "target": { "id": "66470873-b2bd-4a5a-af19-5d54b11f48ef" }, "z": 1 } } }, "Resources": { "GroupStack": { "Type": "AWS::CloudFormation::Stack", "Properties": { "TemplateURL": "https://s3-us-west-2.amazonaws.com/cf-templates-x-TestGroup.json" }, "Metadata": { "AWS::CloudFormation::Designer": { "id": "66470873-b2bd-4a5a-af19-5d54b11f48ef" } } }, "UserStack": { "Type": "AWS::CloudFormation::Stack", "Properties": { "TemplateURL": "https://s3-us-west-2.amazonaws.com/cf-templates-x-TestUserFindsGroup.json" }, "Metadata": { "AWS::CloudFormation::Designer": { "id": "ed1de011-f1bb-4788-b63e-dcf5494d10d1" } }, "DependsOn": [ "GroupStack" ] } } }

Lamentablemente, aún puede eliminar la pila de Usuario aunque fue creada por MultiStack en este ejemplo, pero con políticas de eliminación y otras cosas que podrían ayudar.

Entonces solo estás Actualizando las varias pilas que crea, y no harás el Multi Stack si, por ejemplo, estás reutilizando un Bucket.

De lo contrario, verás APIs y scripts en varios tipos.


Simplemente agregue un parámetro de entrada a la plantilla de CloudFormation para indicar que se debe usar un depósito existente ... a menos que no lo sepa en el momento en que va a usar la plantilla. Luego puede agregar un nuevo recurso o no en función del valor del parámetro.