Elastic Beanstalk で Docker マルチステージビルドの動的環境変数を設定するにはどうすればよいですか?

最終更新日: 2020 年 8 月 21 日

AWS Elastic Beanstalk で Docker マルチステージビルドの動的環境変数を設定したいと考えています。

簡単な説明

Elastic Beanstalk Docker プラットフォームでは、Elastic Beanstalk 環境変数が設定され、Dockerfile の最終コンテナからのアクセスが可能になります。これは、複数のコンテナが関与する (つまり、マルチステージビルド) シナリオに該当します。Dockerfile でのハードコーディングされた変数/静的変数の設定は、ビルドステージでしか実行できません。例えば、「ENV」キーを使用して静的変数を設定できます。これより前のステージで構築される Dockerfile 内の他のコンテナからは Elastic Beanstalk 変数にアクセスできないため、解決方法の手順を実行して、ビルドステージ中に動的環境変数を設定することができます。

ビルドステージ中に動的環境変数を設定するには、SSM パラメータまたは Elastic Beanstalk 変数を使用します。変数は 1 度しか設定する必要がないため、SSM パラメータを使用することがベストプラクティスです。また、「SSM パラメータを使用する」セクションにある同じ手順に従って Elastic Beanstalk 変数を作成および更新することもできます。

解決方法

注意: 以下の解決方法は、Alpine Linux に React アプリケーションがインストールされていることを前提としていますが、他のディストリビューションのパッケージマネージャーを使用してコンテナを構築し、必要なパッケージをインストールすることも可能です。

SSM パラメータを使用する

重要: インスタンスが SSM パラメータを取得できるようにするには、インスタンスプロファイルに SSM: getParameters 許可があることを確認してください。

1.    SSM パラメータを作成します。例えば、AWS コマンドラインインターフェイス (AWS CLI) を使用して SSM パラメータを作成できます。

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

2.    以下の Dockerfile を使用してアプリケーションをデプロイします。Dockerfileは、一時/ビルドコンテナ内の SSM パラメータ値を取得してから、ビルド中に変数をエクスポートします。

# 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.    ビルドコンテナからコピーしたファイルをチェックして、デプロイメントが正常に行われたことを確認します。このファイルには、SSM パラメータ変数の値が含まれている必要があります。以下はその例です。

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

Elastic Beanstalk 変数を使用する

1.    Elastic Beanstalk コマンドラインインターフェイス(EB CLI) で使用される config.yml ファイルをプロジェクトルートディレクトリにコピーします。以下はその例です。

cp .elasticbeanstalk/config.yml .

2.    EB CLI を使用して Elastic Beanstalk 変数を設定するには、以下のコマンドを実行して更新する、または既存の環境にデプロイします。

eb setenv PRODURL_EB=http://myproddomain.com

3.    新しい Elastic Beanstalk 環境を作成するには、プロジェクトルートディレクトリにある config.yml ファイルに新しい環境名を追加し、以下のコマンドを実行します。

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

4.    以下の Dockerfile を使用してアプリケーションをデプロイします。Dockerfile がビルドコンテナ内の Elastic Beanstalk 変数の値を取得し、ビルド中にその変数をエクスポートします。

# 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.    ビルドコンテナからコピーしたファイルをチェックして、デプロイメントが正常に行われたことを確認します。このファイルには、Elastic Beanstalk 変数の値が含まれている必要があります。

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

この記事はお役に立ちましたか?


請求に関するサポートまたは技術的なサポートが必要ですか?