본문 바로가기

개발/Python

Github Actions을 이용한 ECS 배포 자동화

backend : Python Django

Dockerfile을 기반으로 Docker image를 빌드하여 ECS Fargate를 이용해 배포한다.

* 원래는 .env 에 환경변수를 저장해 os.environ.get(변수) 로 가져왔는데,

.env 파일은 깃허브에 올리지 않기 때문에 깃헙 액션에서 빌드-배포를 할때 변수 값을 Github Actions Secrets 사용해 넣어주고

Dockerfile과 yml 파일에서 이미지 빌드 시 해당 변수를 받아올 수 있도록 했다.

FROM python:3.9-alpine

COPY frontend /code/backend/frontend/
COPY ./backend/ /code/

WORKDIR /code
COPY --from=FRONTEND /code/backend/frontend/src/App.tsx .


RUN apk add --no-cache gcc musl-dev postgresql-dev curl
RUN pip install -r /code/backend/requirements/production.txt

EXPOSE 8000

ARG SECRET_KEY
ARG DB_NAME
ARG DB_USER
ARG DB_PASSWORD
ARG DB_HOST
ARG DB_PORT

ENV SECRET_KEY=${SECRET_KEY} DEBUG=${DEBUG} \
    DB_NAME=${DB_NAME} DB_USER=${DB_USER} DB_PASSWORD=${DB_PASSWORD} DB_HOST=${DB_HOST} DB_PORT=${DB_PORT}

RUN ["python", "manage.py", "makemigrations"]

RUN ["python", "manage.py", "migrate"]

ENTRYPOINT [ "python", "manage.py", "runserver", "0.0.0.0:8000" ]

ARG 안넣고 ENV만 넣으면 값이 안 들어간다! 주의!  

        docker build --build-arg SECRET_KEY \
                    --build-arg DB_USER \
                    --build-arg DEBUG \
                    --build-arg DB_NAME \
                    --build-arg DB_USER \
                    --build-arg DB_PASSWORD \
                    --build-arg DB_HOST \
                    --build-arg DB_PORT \
                    -t $ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG .

aws.yml 파일에서는 이런 식으로 환경변수를 전달할수 있다. 

 

Github Actions - new workflow - ecs 를 검색하면 workflow 양식이 바로 뜨는데, 
이 양식만 사용하면

위와 같은 에러가 난다.

https://github.com/aws-actions/amazon-ecs-deploy-task-definition 를 참조해서

    - name: Download task definition
      run: |
        aws ecs describe-task-definition --task-definition my-task-definition-family --query taskDefinition > task-definition.json

단계를 추가해주고

아래 단계의 task-definition을 다음과 같이 수정해주어야 한다. 

    - name: Fill in the new image ID in the Amazon ECS task definition
      id: task-def
      uses: aws-actions/amazon-ecs-render-task-definition@v1
      with:
        task-definition: task-definition.json
        container-name: ${{ env.CONTAINER_NAME }}
        image: ${{ steps.build-image.outputs.image }}

 

이미지 빌드 시 requirements를 설치해주는게 매번 생각보다 오래 걸려서 총 작업은 5분이 넘게 걸린다. 

 

뱅크샐러드 기술블로그를 참고하여 캐시를 추가해볼 예정이다!

https://blog.banksalad.com/tech/github-action-npm-cache/