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

Lecture de 5 minute(s)
0

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

Brève description

Il est possible de définir des variables statiques ou codées en dur dans le Dockerfile uniquement lors des étapes de génération. Par exemple, vous pouvez utiliser la touche ENV pour définir des variables statiques. Les autres conteneurs du Dockerfile générés au cours des étapes précédentes ne peuvent pas accéder aux variables Elastic Beanstalk. Pour définir des variables d'environnement dynamiques lors d'une génération à plusieurs étapes, utilisez la ressource AWS::SSM::Parameter d'AWS Systems Manager ou une variable Elastic Beanstalk. Étant donné que vous ne devez définir la variable qu'une seule fois, il est recommandé d'utiliser le paramètre SSM.

Remarque : si des erreurs surviennent lorsque vous exécutez des commandes de l'interface de la ligne de commande AWS (AWS CLI), consultez la page Résolution des erreurs liées à AWS CLI. Vérifiez également que vous utilisez la version la plus récente de l'interface AWS CLI.

Résolution

Remarque : dans l'exemple suivant, une application React est installée sur Alpine Linux. Vous pouvez utiliser n'importe quel gestionnaire de packages de distribution pour générer votre conteneur et installer les packages nécessaires.

Utilisation d'un paramètre SSM

Remarque : pour permettre à l'instance Linux Amazon Elastic Compute Cloud (Amazon EC2) d'obtenir le paramètre SSM, votre profil d'instance Linux EC2 doit disposer de l'autorisation ssm:GetParameters.

1.    Utilisez la console Systems Manager pour créer le paramètre SSM. Vous pouvez aussi choisir d'exécuter plutôt la commande put-parameter de l'interface AWS CLI :

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

2.    Utilisez le Dockerfile suivant pour déployer votre application. Le Dockerfile obtient la valeur du paramètre SSM qui se trouve dans le conteneur temporaire ou 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 TOKEN=`curl -X PUT "http://169.254.169.254/latest/api/token" -H "X-aws-ec2-metadata-token-ttl-seconds: 21600"` && export REGION=$(curl -H "X-aws-ec2-metadata-token: $TOKEN" -v 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 confirmer la réussite du déploiement, vérifiez que le fichier que vous avez copié inclut bien la valeur de la variable de paramètre SSM.

Exemple :

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

Utilisation d'une variable Elastic Beanstalk

Remarque : pour permettre au profil d'instance d’accéder à l'environnement, votre profil d'instance doit disposer de l'autorisation AWS Identity and Access Management (IAM) elasticbeanstalk:DescribeConfigurationSettings.

1.    Copiez le fichier config.yml qu'utilise Elastic Beanstalk Command Line Interface (EB CLI) dans le répertoire racine du projet.

Exemple :

cp .elasticbeanstalk/config.yml .

2.    Pour définir la variable Elastic Beanstalk avec EB CLI, exécutez la commande suivante pour mettre à jour ou déployer dans 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 du répertoire racine du projet. Exécutez ensuite la commande suivante :

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

4.    Utilisez le Dockerfile suivant pour déployer votre application. Le Dockerfile obtient la valeur de la variable Elastic Beanstalk qui se trouve dans le conteneur de génération, puis exporte la variable pendant la génération.

# Build environmentFROM 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 confirmer la réussite du déploiement, vérifiez que le fichier que vous avez copié inclut bien la valeur de la variable Elastic Beanstalk.

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

Informations connexes

Documents d'identité de l'instance

get-parameters

AWS OFFICIEL
AWS OFFICIELA mis à jour il y a 6 mois