¿Alguien sabe si es posible pasar un valor secreto como variable de entorno en beanstalk elástico? Obviamente, la alternativa es usar el SDK en nuestro código base, pero primero quiero explorar el enfoque de la variable de entorno.
Saludos Damián
Según la respuesta de @Ali, no está integrado en este punto. Sin embargo, es relativamente fácil usar.ebextensions y AWS cli. Aquí hay un ejemplo que extrae un secreto a un archivo, de acuerdo con una variable de entorno MY_ENV. Luego, este valor podría establecerse en una variable de entorno, pero tenga en cuenta que las variables de entorno son específicas del shell. Necesitaría pasarlos a cualquier cosa que esté lanzando.
10-extract-htpasswd: env: MY_ENV: "Fn::GetOptionSetting": Namespace: "aws:elasticbeanstalk:application:environment" OptionName: MY_ENV command: | aws secretsmanager get-secret-value --secret-id myproj/$MY_ENV/htpasswd --region=us-east-1 --query=SecretString --output text > /etc/nginx/.htpasswd chmod o-rwx /etc/nginx/.htpasswd chgrp nginx /etc/nginx/.htpasswdEsto también requiere otorgar permisos de IAM para los secretos a la función de servicio de EB. es decir, una política como:
{ "Version": "2012-10-17", "Statement": [ { "Sid": "xxxxxxxxxx", "Effect": "Allow", "Action": "secretsmanager:GetSecretValue", "Resource": "arn:aws:secretsmanager:us-east-1:xxxxxxxxxxxx:secret:myproj*" } ] }Desafortunadamente, EB no admite secretos en este momento, esto podría agregarse más adelante. Puede usarlos en sus variables de entorno como sugiere la documentación, pero aparecerán en texto sin formato en la consola. Otro enfoque, y en mi opinión mejor, sería usar ebextensions y usar los comandos de AWS CLI para obtener secretos del administrador de secretos , que necesita alguna configuración (por ejemplo, tener AWS CLI instalado y tener sus secretos almacenados en SM). Puede configurarlas como variables de entorno en la misma configuración de eb. ¡Espero que esto ayude!
Como mencionan las respuestas anteriores, todavía no hay una solución integrada si desea hacer esto en Elastic Beanstalk. Sin embargo, una solución alternativa es usar "gancho de plataforma". Desafortunadamente, está mal documentado en este punto.
Para almacenar su secreto, la mejor solución es crear un secreto personalizado en AWS-Secret-Manager . En el administrador de secretos, puede crear un nuevo secreto haciendo clic en "Almacenar un nuevo secreto", luego seleccionando "Otro tipo de secreto" e ingresando su clave/valor secreto (ver
). En el siguiente paso, debe proporcionar un Nombre secreto (por ejemplo, "su_nombre_secreto") y puede dejar todo lo demás en su configuración predeterminada.
Luego, debe permitir que Elastic Beanstalk obtenga este secreto. Puede hacerlo creando una nueva política de IAM, por ejemplo, con este contenido:
{ "Version": "2012-10-17", "Statement": [ { "Sid": "Getsecretvalue", "Effect": "Allow", "Action": [ "secretsmanager:GetResourcePolicy", "secretsmanager:GetSecretValue", "secretsmanager:DescribeSecret", "secretsmanager:ListSecretVersionIds" ], "Resource": "your-secret-arn" } ]}Debe reemplazar "your-secret-arn" con su ARN secreto que puede obtener en la interfaz AWS-secret-manager. Luego, debe agregar la política que creó a los roles de EB (debe ser "aws-elasticbeanstalk-ec2-role" o "aws-elasticbeanstalk-service-role").
Finalmente, debe agregar un archivo de enlace en su aplicación. Desde la raíz de la ubicación de su aplicación debe ser ".platform/hooks/prebuild/your_hook.sh". El contenido de su archivo puede ser algo como esto:
#!/bin/sh export your_secret_key=$(aws secretsmanager get-secret-value --secret-id your-secret-name --region us-east-1 | jq -r '.SecretString' | jq -r '. your_secret_key') touch .env { printf "SECRET_KEY=%s\n" "$your_secret_key" # printf whatever other variable you want to pass } > .envObviamente, debe reemplazar "su_nombre_secreto" y la otra variable por sus propios valores y establecer la región en la región donde se almacena su secreto (si no es us-east-1). Y no olvides hacerlo ejecutable ("chmod +x your_hook.sh").
Esto supone que su aplicación puede cargar su env desde un archivo .env (que funciona bien con docker/docker-compose por ejemplo).
Otra opción es almacenar la variable en un archivo de configuración ".ebextensions", pero lamentablemente no parece funcionar con la nueva plataforma Amazon Linux 2. Además, no debe almacenar información confidencial, como credenciales, directamente en la compilación de su aplicación. Cualquier persona con acceso de lectura de Elastic Beanstalk puede acceder a las compilaciones de la aplicación y también se almacenan sin cifrar en S3.
Con el enfoque de enlace, el secreto solo se almacena localmente en sus instancias EC2 subyacentes de Elastic Beanstalk, y puede (¡debe!) restringir el acceso SSH directo a ellas.