Secretos como tokens y similares nunca deben estar en el código fuente. Dichos secretos se pueden pasar a la aplicación en staging o producción por medio de unas variables de entorno especiales que toman el secreto del servicio AWS ParameterStore y lo inyectan en la variable de entorno en el momento que se arranca el contenedor.
ETAPA 1: Crear el secreto en AWS Parameter Store.
- Ejecutar
hosting/hosting aws_web_consoledentro del proyecto. Se te mostrarán varios links:
- Primero haz click en el LINK 1 para autentificarte en la consola AWS
- Una vez autentificado haz click en el LINK 4 (secretos de producción y staging) para que se abra la consola con los secretos de tu aplicación. Si ya hay secretos dados de alta para staging o producción los verás listados.
- Para crear un secreto presiona "Create parameter". Indica bajo Name la ruta completa del secreto (que siempre incluye el código de proyecto:
/ecs-apps/projects/[código de proyecto]/[production o staging]/[IDENTIFICADOR DEL SECRETO]). Por convención, para el identificador del secreto usa MAYÚSCULAS:- Por ejemplo si el nombre del secreto es `
POSTMARK_TOKEN` y el código de proyecto estoyota_integrationentonces Name sería/ecs-apps/projects/toyota_integration/production/POSTMARK_TOKEN - Type:
SecureString - KMS key source: My current account
- Value: el secreto en sí.
- Por ejemplo si el nombre del secreto es `
- Si el proyecto usa ambiente de staging asegúrate de crear el secreto también para ese ambiente (con otro valor al de producción, claro). Siguiendo con el ejemplo sería
/ecs-apps/projects/toyota_integration/staging/POSTMARK_TOKEN. - Click en
Savey listo.
ETAPA 2: Agregar secreto a ser usado por el contenedor
- Abre para editar
hosting/deploy_env/task-definition.json - Busca en el JSON, bajo
containerDefinitions, el contenedor al que agregarás el secreto (cada contenedor tiene propuiedades comoname,image,essential,environment, etc. - Agrega bajo secrets el secreto recién creado (agrega la sección si no existe aún). El secreto es un diccionario con dos propiedades: name y valueFrom.
-
name: será la variable de entorno donde se injectará el secreto. Por convención siempre usar el mismo nombre del secreto que se agregó a ParameterStore. En el ejemplo es
POSTMARK_TOKEN. -
ValueFrom debe ser el prefijo literal
/${PROJECT_ECS_CLUSTER}/projects/${PROJECT_CODE}/${PROJECT_DEPLOY_ENVIRONMENT}/seguido por el nombre del secreto (no la ruta completa). Por ejemplo, si el nombre del secreto esPOSTMARK_TOKEN, quedaría así: //.... otras configuraciones "containerDefinitions": [ { "name": "${PROJECT_CONTAINER_HTTPD_NAME}", "image": "${PROJECT_REGISTRY}:${PROJECT_CONTAINER_HTTPD_NAME}-${PROJECT_RELEASE_VERSION}", // .... otras configuraciones "secrets": [ { "name": "POSTMARK_TOKEN", "valueFrom": "/${PROJECT_ECS_CLUSTER}/projects/${PROJECT_CODE}/${PROJECT_DEPLOY_ENVIRONMENT}/POSTMARK_TOKEN" } ], // .... otras configuraciones } // .... otras configuraciones
-
name: será la variable de entorno donde se injectará el secreto. Por convención siempre usar el mismo nombre del secreto que se agregó a ParameterStore. En el ejemplo es
- Valida que la sintaxis JSON de la tarea sea correcta:
# Validar para producción
aws_ecs_task_definition production
# Validar para staging
aws_ecs_task_definition staging
ETAPA 3: Deployment de prueba
- Realiza un deployment en cada ambiente para validar que todo esté funcionando.
- Una vez hecho el deployment, el valor del secreto estará disponible como una variable de entorno dentro del contenedor.
- También puedes consultar en la consola web de AWS (ver Guía: Cómo consultar en la consola web de AWS el estado de mi aplicación, sus logs, registry y secretos), para casa uno de los contenedores en ejecución de tu aplicación, qué secretos (y variables de entorno) se están usando. En detalles del contenedor, tab "Environment variables and files":