Elastic Beanstalk で Docker マルチステージビルドの動的環境変数を設定するにはどうすればよいですか?
AWS Elastic Beanstalk で Docker マルチステージビルドの動的環境変数を設定したいと考えています。
簡単な説明
Dockerfile にハードコーディングされた変数/静的変数を設定できるのは、ビルドステージのみです。たとえば、ENV キーを使用して静的変数を設定します。これより前のステージで構築された Dockerfile 内の他のコンテナからは、Elastic Beanstalk 変数にアクセスできません。マルチステージビルド中に動的環境変数を設定するには、AWS Systems Manager AWS:: SSM::パラメータリソースまたは Elastic Beanstalk 変数を使用します。変数は 1 度しか設定する必要がないため、SSM パラメータを使用することがベストプラクティスです。
注: AWS コマンドラインインターフェイス (AWS CLI) コマンドの実行中にエラーが発生した場合は、「AWS CLI エラーのトラブルシューティング」を参照してください。また、AWS CLI の最新バージョンを使用していることを確認してください。
解決策
注: 以下の解決方法は、Alpine Linux に React アプリケーションがインストールされていることを前提としています。他のディストリビューションのパッケージマネージャーを使用してコンテナを構築し、必要なパッケージをインストールすることも可能です。
SSM パラメータを使用する
注: Amazon Elastic Compute Cloud (Amazon EC2) Linux インスタンスが SSM パラメータを取得できるようにするには、EC2 Linux インスタンスプロファイルに ssm:GetParameters 許可が必要となります。
1. Systems Manager コンソールを使用して SSM パラメータを作成します。または、put-parameter の AWS CLI コマンドを実行します。
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 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. ビルドコンテナからコピーしたファイルをチェックして、デプロイメントが正常に行われたことを確認します。このファイルには、SSM パラメータ変数の値が含まれている必要があります。
例:
# docker exec -it <Container-Id> sh# cat /tmp/SSMParameter.txt http://myproddomain.com
Elastic Beanstalk 変数を使用する
注: インスタンスプロファイルを環境に取り込むには、インスタンスプロファイルにelasticbeanstalk:DescribeConfigurationSettings AWS Identity and Access Management (IAM) アクセス許可が必要となります。
1. **Elastic Beanstalk Command Line Interface (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 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. ビルドコンテナからコピーしたファイルをチェックして、デプロイメントが正常に行われたことを確認します。このファイルには、Elastic Beanstalk 変数の値が含まれている必要があります。
# docker exec -it <Container-Id> sh# cat /tmp/EBVar.txt http://myproddomain.com
関連情報
関連するコンテンツ
- 質問済み 4ヶ月前lg...
- 質問済み 6年前lg...
- AWS公式更新しました 1年前
- AWS公式更新しました 1年前
- AWS公式更新しました 10ヶ月前