Comment définir des variables d'environnement dynamiques pour les générations à plusieurs étapes Docker dans Elastic Beanstalk ?

Dernière mise à jour : 21/08/2020

Je veux définir des variables d'environnement dynamiques pour les générations à plusieurs étapes Docker dans AWS Elastic Beanstalk.

Brève description

Dans la plate-forme Elastic Beanstalk Docker, les variables d'environnement Elastic Beanstalk sont définies et rendues accessibles pour le conteneur final dans le fichier Dockerfile. Cela s'applique aux scénarios impliquant plusieurs conteneurs (c'est-à-dire des générations à plusieurs étapes). Vous pouvez définir des variables codées en dur/statiques dans le Dockerfile uniquement dans les étapes de génération. Par exemple, vous pouvez utiliser la clié « ENV » pour définir des variables statiques. Étant donné que les variables Elastic Beanstalk ne sont pas accessibles aux autres conteneurs du Dockerfile qui sont générés dans les étapes précédentes, vous pouvez suivre les étapes de la solution pour définir des variables d'environnement dynamiques au cours de l'étape de génération.

Pour définir des variables d'environnement dynamiques au cours de l'étape de génération, utilisez un paramètre SSM ou une variable Elastic Beanstalk. Il est recommandé d'utiliser un paramètre SSM, car vous devez définir la variable une seule fois. Vous pouvez également suivre les mêmes étapes dans la section Utiliser un paramètre SSM pour créer et mettre à jour une variable Elastic Beanstalk.

Solution

Remarque : la solution suivante suppose qu'une application React est installée sur Alpine Linux. Cependant, vous pouvez utiliser le gestionnaire de package de n’importe quelle autre distribution pour générer votre conteneur et installer les packages requis.

Utiliser un paramètre SSM

Important : pour permettre à l'instance de récupérer le paramètre SSM, vérifiez que votre profil d'instance dispose de l'autorisation ssm:GetParameters.

1.    Créez un paramètre SSM. Par exemple, vous pouvez utiliser l’interface de ligne de commande AWS (CLI AWS pour créer le paramètre SSM :

aws ssm put-parameter --name PRODURL_SSM --value http://myproddomain.com --type String

2.    Déployez votre application à l'aide du Dockerfile suivant. Le Dockerfile récupère la valeur du paramètre SSM dans le conteneur temporaire/de génération, puis exporte la variable pendant la génération.

# Build environment
FROM node:13.12.0-alpine as build
WORKDIR /app
ENV PATH /app/node_modules/.bin:$PATH
COPY package.json ./
COPY package-lock.json ./
RUN npm install react-scripts@3.4.1
COPY . ./
## Install the required packages for awscli, curl, and jq. ##
RUN apk -v --no-cache add \
        py-pip \
        curl \
        jq \
        && \
        pip install awscli --upgrade --user
## Export the region dynamically retrieving it from the instance metadata, and then retrieve the SSM parameter value using awscli. Then, place the parameter in a text file, and export the variable using the value from the text file. Finally, run the build. ##
RUN export REGION=$(curl -s http://169.254.169.254/latest/dynamic/instance-identity/document | jq -r .region) && /root/.local/bin/aws ssm get-parameters --names PRODURL_SSM --region $REGION | grep Value | cut -d '"' -f4 >> /tmp/SSMParameter.txt && export DYNAMIC_SSM_VAR=$(cat /tmp/SSMParameter.txt) && npm run build
# Production environment
FROM nginx:stable-alpine
COPY --from=build /app/build /usr/share/nginx/html
## Copy the text file that has the SSM parameter value from the build container to the production container to confirm the variable was retrieved successfully. ##
COPY --from=build /tmp/SSMParameter.txt /tmp
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]

3.    Pour vous assurer que le déploiement a abouti, vérifiez le fichier que vous avez copié à partir du conteneur de génération. Ce fichier doit inclure la valeur de la variable du paramètre SSM. Par exemple :

# docker exec -it <Container-Id> sh
# cat /tmp/SSMParameter.txt 
http://myproddomain.com

Utiliser une variable Elastic Beanstalk

1.    Copiez le fichier config.yml utilisé par l’interface de ligne de commande Elastic Beanstalk (CLI EB) dans le répertoire racine du projet. Par exemple :

cp .elasticbeanstalk/config.yml .

2.    Pour définir la variable Elastic Beanstalk avec l'interface de ligne de commande EB, exécutez la commande suivante pour mettre à jour ou déployer vers un environnement existant :

eb setenv PRODURL_EB=http://myproddomain.com

3.    Pour créer un nouvel environnement Elastic Beanstalk, ajoutez le nouveau nom d'environnement dans le fichier config.yml dans le répertoire racine du projet, puis exécutez la commande suivante :

eb create --envvars PRODURL_EB=http://myproddomain.com

4.    Déployez votre application à l'aide du Dockerfile suivant. Le Dockerfile récupère la valeur de la variable Elastic Beanstalk à l'intérieur du conteneur de génération, puis exporte la variable pendant la génération.

# Build environment
FROM node:13.12.0-alpine as build
WORKDIR /app
ENV PATH /app/node_modules/.bin:$PATH
COPY package.json ./
COPY package-lock.json ./
RUN npm install react-scripts@3.4.1
COPY . ./
## Create an .elasticbeanstalk directory to place the config.yml file in, so that the eb cli can interact with the Elastic Beanstalk environment. ##
RUN mkdir .elasticbeanstalk
## Copy config.yml to /app/.elasticbeanstalk inside the build container as it will be used by eb cli ##
COPY config.yml /app/.elasticbeanstalk
## Install required packages for awsebcli ##
RUN apk -v --no-cache add \
        gcc \
        musl-dev \
        openssl \
        openssl-dev \
        make \
        py-pip \
        libffi-dev \
        python \
        python-dev \
        && \
        pip install awsebcli --upgrade --user 
## Retrieve the Elastic Beanstalk variable using awsebcli and place it in a text file. Then, export the desired variable using the value from the text file, then run the build. ##
RUN /root/.local/bin/eb printenv | grep PRODURL_EB | awk '{print $3}' >> /tmp/EBVar.txt && export DYNAMIC_EB_VAR=$(cat /tmp/EBVar.txt) && npm run build
# Production environment
FROM nginx:stable-alpine
COPY --from=build /app/build /usr/share/nginx/html
## Copy the text file that has the Elastic Beanstalk variable value from the build container to the production container to confirm the variable was retrieved successfully ##
COPY --from=build /tmp/EBVar.txt /tmp
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]

5.    Pour vous assurer que le déploiement a abouti, vérifiez le fichier que vous avez copié à partir du conteneur de génération. Le fichier doit inclure la valeur de la variable Elastic Beanstalk.

# docker exec -it <Container-Id> sh
# cat /tmp/EBVar.txt 
http://myproddomain.com

Cet article vous a-t-il été utile ?


Besoin d'aide pour une question technique ou de facturation ?