현재 애플리케이션에서 검색을 위한 tsv 파일들을 git에 올리고, 해당 파일들도 묶어서 도커 이미지로 올려 이미지 사이즈가 커져 scale-out 여러가지 단점이 존재한다.(scaling이 느림, ecr push가 느림 등등)
tsv 파일을 압축하여 S3에 올리고, Fargate에서 컨테이너 실행 시 aws cli를 활용하여 S3에서 zip파일을 받아서 압축을 풀고 애플리케이션에서 사용할 수 있도록 수정해보자.
이전 Dockerfile
FROM python:3.12.2-alpine AS builder
WORKDIR /app
COPY dev_requirements.txt /app
RUN pip install --no-cache-dir --upgrade -r dev_requirements.txt
COPY ./ /app
ENTRYPOINT ["uvicorn", "--host", "0.0.0.0", "--port", "8800", "--log-config", "dev_logconfig.py", "app.main:app"]
변경된 Dockerfile
FROM python:3.12.2-alpine AS builder
RUN apk --no-cache update && \\
apk --no-cache add \\
groff \\
less \\
&& pip install --no-cache-dir awscli
WORKDIR /app
COPY dev_requirements.txt /app
RUN pip install --no-cache-dir --upgrade -r dev_requirements.txt
COPY ./ /app
ENTRYPOINT ["/app/scripts/run_docker.sh"]
기존에는 ENTRYPOINT 에서 단일 uvicorn 실행명령만 처리했지만, s3 다운로드를 추가로 수행해야 하므로 쉘 파일로 분리해서 사용한다.
AWS CLI 를 사용하여 S3에서 파일을 다운로드하기 때문에 미리 설치해준다. (AWS CLI 설치 시 이미지 사이즈 84MB 증가하였음)
#!/bin/sh
aws s3api get-object --bucket yuppie-api-server --key to_search.zip ./to_search.zip
unzip to_search.zip -d to_search
uvicorn --host 0.0.0.0 --port 8800 --log-config dev_logconfig.py app.main:app
aws s3api 명령어로 검색을 위한 zip 파일을 다운받고 원하는 경로에 압축해제한 뒤 애플리케이션을 실행한다.
Unable to locate credentials. You can configure credentials by running "aws configure".
aws cli 를 사용하기 위해서는 aws 인증정보가 필요하여 s3 다운로드가 정상적으로 실행되지 않는다.
AWS 인증방법에는 크게 3가지가 존재한다.
aws configure 명령어로 설정
대화형 인터페이스를 통해 aws access key, aws secret access key 등을 환경변수로 설정한다.
컨테이너 실행시 쉘 명령어로 인증하는 방법은 아니므로 fargate 에서 적용이 어렵다.
직접 환경변수로 설정
도커 컨테이너 실행 시 환경변수를 추가하여 인증 시 사용할 수 있게 한다.
docker run -e AWS_ACCESS_KEY_ID=<your-access-key-id> -e AWS_SECRET_ACCESS_KEY=<your-secret-access-key> -e AWS_DEFAULT_REGION=<your-aws-region> your-image-name
task 설정에서 환경변수로 직접 넣을 수 있다. 그러나 secret access key 를 노출하게 되므로 보안상 좋지 않다.
SecretsManager 를 사용하여 값들을 안전한 곳에 보관하고 환경변수로 넣는 방법이 존재한다. (https://devminchan.github.io/develop/ecs_fargate_deploy_03/)
IAM 역할을 부여하여 설정
Task 설정 시 iam 역할로 S3 읽기 권한을 부여하여 aws cli 에서 S3 에 접근할 수 있도록 역할을 부여한다.
2, 3번 모두 좋은 방법이지만, 좀더 간편하고 보안면에서도 혹시 모르니 3번 방법으로 진행하기로 했다.
기존 ecsTaskExecutionRole 에서 AmazonECSTaskExecutionRolePolicy 정책을 추가한 IAM을 추가로 생성한다.
ECS Task Definition 에서 container role 을 1번에서 생성한 iam 으로 지정해준다.
배포~