Quiero leer la URL de mi base de datos desde el almacén de parámetros en mi plantilla de CloudFormation. Esto es bastante fácil para una sola URL, pero no puedo entender cómo cambiar la URL con diferentes entornos.
Tengo cuatro entornos (desarrollo, integración, preproducción y producción) y sus detalles se almacenan en cuatro rutas diferentes en el almacén de parámetros:
/database/dev/url /database/int/url /database/ppe/url /database/prod/urlAhora quiero elegir la URL de la base de datos correcta al implementar a través de CloudFormation. ¿Cómo puedo hacer esto?
Parameters: Environment: Type: String Default: dev AllowedValues: - dev - int - ppe - prod DatabaseUrl: Type: 'AWS::SSM::Parameter::Value<String>' # Obviously the '+' operator here won't work - so what do I do? Default: '/database/' + Environment + '/url'Esta característica no es tan ordenada como uno desearía. En realidad, debe pasar el nombre/ruta de cada parámetro que desea buscar en el almacén de parámetros.
Modelo:
AWSTemplateFormatVersion: 2010-09-09 Description: Example Parameters: BucketNameSuffix: Type: AWS::SSM::Parameter::Value<String> Default: /example/dev/BucketNameSuffix Resources: Bucket: Type: AWS::S3::Bucket Properties: BucketName: !Sub parameter-store-example-${BucketNameSuffix} Si no pasa ningún parámetro a la plantilla, BucketNameSuffix se completará con el valor almacenado en /example/dev/BucketNameSuffix . Si desea usar, por ejemplo, un valor de producción (señalado por /example/ prod /example/prod/BucketNameSuffix ), debe especificar el valor para el parámetro BucketNameSuffix , pero en lugar de pasar el valor real, debe pasar el nombre alternativo del parámetro a usar , entonces pasaría /example/prod/BucketNameSuffix .
aws cloudformation update-stack --stack-name example-dev \ --template-body file://./example-stack.yml aws cloudformation update-stack --stack-name example-prod \ --template-body file://./example-stack.yml \ --parameters ParameterKey=BucketNameSuffix,ParameterValue=/example/prod/BucketNameSuffixUna publicación de blog de AWS no tan buena sobre esto: https://aws.amazon.com/blogs/mt/integrating-aws-cloudformation-with-aws-systems-manager-parameter-store/
Debido a que pasar millones de parámetros sin sentido parece estúpido, en realidad podría generar una plantilla específica del entorno y establecer el valor Default: en la plantilla generada, de modo que para el entorno de producción, el valor Default sería /example/ prod /example/prod/BucketNameSuffix y luego puedo actualizar la pila de prod sin pasar cualquier parámetro.
Puedes hacer uso de Fn::Únete aquí.
Aquí hay un pseudocódigo.
Tendrá que tomar Environment como parámetro, lo que ya está haciendo.
Creando la cadena requerida en los recursos donde se requiere DatabaseUrl.
Resources : Instance : Type : 'AWS::Some::Resource' Properties : DatabaseURL : !Join [ "", [ "/database/", !Ref "Environment" , "/url ] ]Espero que esto ayude.
Nota: no puede asignar un valor a un parámetro de forma dinámica utilizando alguna lógica de cálculo. Todos los valores de los parámetros definidos deben proporcionarse como Entrada.