Elastic Beanstalk에서 Docker 다단계 빌드에 대한 동적 환경 변수를 설정하려면 어떻게 해야 합니까?

최종 업데이트 날짜: 2020년 8월 21일

AWS Elastic Beanstalk에서 Docker 다단계 빌드에 대한 동적 환경 변수를 설정하려고합니다.

간략한 설명

Elastic Beanstalk Docker 플랫폼에서 Elastic Beanstalk 환경 변수가 설정되고 Dockerfile의 최종 컨테이너에 액세스할 수 있습니다. 이는 여러 컨테이너(즉, 다단계 빌드)와 관련된 시나리오에 적용됩니다. 빌드 단계에서만 Dockerfile에서 하드 코드/정적 변수를 설정할 수 있습니다. 예를 들어, “ENV” 키를 사용하여 정적 변수를 설정할 수 있습니다. 이전 단계에서 빌드된 Dockerfile의 다른 컨테이너는 Elastic Beanstalk 변수에 액세스할 수 없으므로 해결 방법의 단계에 따라 빌드 단계에서 동적 환경 변수를 설정해야 합니다.

빌드 단계에서 동적 환경 변수를 설정하려면 SSM 파라미터 또는 Elastic Beanstalk 변수를 사용합니다. 변수를 한 번만 설정해야 하므로 SSM 파라미터를 사용하는 것이 가장 좋습니다. 또한 SSM 파라미터 사용 섹션의 동일한 단계를 수행하여 Elastic Beanstalk 변수를 생성하고 업데이트할 수 있습니다.

​해결 방법

참고: 다음 해결 방법은 React 응용 프로그램이 Alpine Linux에 설치되어 있다고 가정합니다. 그러나 다른 배포판의 패키지 관리자를 사용하여 컨테이너를 빌드하고 필요한 패키지를 설치할 수 있습니다.

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

이 문서가 도움이 되었습니까?


결제 또는 기술 지원이 필요합니까?