Tengo una cadena de conexión de base de datos almacenada en el almacén de parámetros de AWS Systems Manager que quiero pasar a las variables de entorno de una instancia de Elastic Beanstalk. No quiero comprometerlo con el código fuente ni tener que confiar en que el implementador establezca los valores en la implementación o hacerlo manualmente a través de la consola web.
Probé referencias dinámicas como {{resolve:ssm:DATABASE_CONNECTION_STRING:1}} (con y sin tildes) que funcionan en las pilas de CloudFormation pero no en la configuración de Elastic Beanstalk.
He intentado usar container_commands como
export DATABASE_CONNECTION_STRING=`aws ssm get-parameter --name DATABASE_CONNECTION_STRING --region eu-west-1 --query Parameter.Value --output text
pero la instancia de Elastic Beanstalk no tiene los permisos correctos y no estoy seguro de cómo configurarlos.
Intenté crear un archivo a partir del contenido de un archivo S3 usando files: y source: pero obtuve errores.
Idealmente, las referencias dinámicas funcionarían, por ejemplo .ebextensions/env.config =>
OptionSettings: aws:elasticbeanstalk:application:environment: DATABASE_CONNECTION_STRING: {{resolve:ssm:ANNOTATOR_DATABASE_CONNECTION_STRING:1}}Pude hacer que esto funcionara creando el archivo .ebextensions/options.config con el contenido:
option_settings: aws:elasticbeanstalk:application:environment: ENCRYPT_CERT: '{{resolve:ssm:SOA_ENCRYPT_CERT:1}}' ENCRYPT_KEY: '{{resolve:ssm:SOA_ENCRYPT_KEY:1}}'He optado por una configuración de files que descarga un archivo de S3 en /tmp/app.env y luego la aplicación Python usa load_dotenv('/tmp/app.env') . No es ideal, pero funciona por ahora.
Aquí está el .ebextensions/env.config :
Resources: AWSEBAutoScalingGroup: Metadata: AWS::CloudFormation::Authentication: S3Auth: type: "s3" buckets: ["S3_BUCKET_NAME"] roleName: "Fn::GetOptionSetting": Namespace: "aws:autoscaling:launchconfiguration" OptionName: "IamInstanceProfile" DefaultValue: "aws-elasticbeanstalk-ec2-role" files: "/tmp/app.env": mode: "444" owner: wsgi group: wsgi authentication: "S3Auth" source: https://URL_TO_S3_BUCKET/app.env Asegúrese de cambiar S3_BUCKET_NAME y URL_TO_S3_BUCKET a su configuración.
Luego, en Python uso;
if os.path.exists('/tmp/app.env'): load_dotenv('/tmp/app.env') else: load_dotenv('.env')Debe usar comillas simples en su archivo de configuración, en el navegador puede pegarlo sin comillas.
DATABASE_CONNECTION_STRING: '{{resolve:ssm:ANNOTATOR_DATABASE_CONNECTION_STRING:1}}' Si actualizas el parámetro cambia el 1 al final a la versión que es. Entonces, si lo actualizó una vez después de crear la clave de parámetro, será 2 .