오늘은 트러블 슈팅이다.
문제 상황
내가 현재 진행하고 있는 프로젝트는 AWS의 프리티어를 이용해 개발 서버를 구축했다. 배포 방식은 Private ECR과 ECS with EC2를 이용해 배포 중이다. Private ECR은 Public ECR과 다르게 프리 티어에 제한이 상당히 적다. 우리의 개발 서버 이미지를 저장할 Private ECR이 잦은 배포로 사용량이 넘쳐서 프리티어 제공량을 넘을 것 같은 상황이었다.

그렇게 Public ECR로 바꾸기로 결정했다.
CD 파이프라인을 GitHub Actions를 이용해 구축했다. AWS의 공식 action인 amazon-ecr-login을 이용해 Private ECR과 Public ECR을 모두 간단하게 접근할 수 있다. 공식 레포 에서 언급한 것처럼 registry-type
으로 public 명시 후 Repository Alias까지 확인해서 업데이트 후 실행했다.
- name: ECR 로그인
id: login-ecr
uses: aws-actions/amazon-ecr-login@v2
with:
registry-type: public
- name: Docker 이미지 빌드 후 배포
id: build-docker
env:
REGISTRY: ${{ steps.login-ecr.outputs.registry }}
REGISTRY_ALIAS: ${{ inputs.ecr-registry-alias }}
REPOSITORY: ${{ inputs.ecr-repository }}
IMAGE_TAG: ${{ github.sha }}
PROFILE: ${{ inputs.env }}
run: |
docker build -t $REGISTRY/$REGISTRY_ALIAS/$REPOSITORY:$IMAGE_TAG --build-arg PROFILE=$PROFILE .
docker push $REGISTRY/$REGISTRY_ALIAS/$REPOSITORY:$IMAGE_TAG
echo "image=$REGISTRY/$REGISTRY_ALIAS/$REPOSITORY:$IMAGE_TAG" >> $GITHUB_OUTPUT
inputs는 외부에서 주입하는 변수라고 생각하시면 된다. 이제 정상적으로 배포가 될 지 PR을 머지해봤다.
결과는 다음과 같이 끔찍하다. 무엇 때문인지 감도 잘 못 잡았다.

원인
이유는 굉장히 간단했고, 공식 문서에도 언급을 하고 있었다. Public ECR은 us-east-1 Region에서만 접속 가능하다. 하지만 ECS Service를 구동시켜 Task Definition을 배포하기 위해 AWS Credentials 접속을 ap-northeast-2로 지정하고 있었다.
- name: AWS Credentials 설정
uses: aws-actions/configure-aws-credentials@v4
with:
aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
aws-region: ap-northeast-2
해결
Public ECR에 로그인하기 위해 ECS 태스크까지 영향이 가니 AWS Credentials 리젼은 건들기 싫었다. 우리 서버가 현재 서울에 있고, 만약에 CD 파이프라인에 AWS 작업이 추가될 수 있다면 그 Region은 서울일 확률이 높을 것이다.
ECR 로그인 시의 Region이나 ECS 배포 시의 Region을 특정할 수 있다면 간단하게 해결될 수 있을 것 같았지만, 두 actions의 변수에는 그렇게 Region을 특정하는 법은 보이지 않고 AWS configure credentials actions를 사용하라고만 나와있다.
파이프라인을 분리해서 us-east-1으로 로그인해 Public ECR을 Push하는 파이프라인과 ap-northeast-2로 로그인해 ECS 작업을 배포하는 파이프라인을 절차적으로 구동할까도 생각했다. 그렇게되면 ECR에 로그인 하고 이미지 푸시 후 output으로 나오는 이미지 주소를 절차적으로 사용하지 못하고 직접 입력해야한다.
- name: Docker 이미지 빌드 후 배포
id: build-docker
env:
REGISTRY: ${{ steps.login-ecr.outputs.registry }}
REGISTRY_ALIAS: ${{ inputs.ecr-registry-alias }}
REPOSITORY: ddudu-ecr
IMAGE_TAG: ${{ github.sha }}
PROFILE: ${{ inputs.env }}
run: |
docker build -t $REGISTRY/$REGISTRY_ALIAS/$REPOSITORY:$IMAGE_TAG --build-arg PROFILE=$PROFILE .
docker push $REGISTRY/$REGISTRY_ALIAS/$REPOSITORY:$IMAGE_TAG
echo "image=$REGISTRY/$REGISTRY_ALIAS/$REPOSITORY:$IMAGE_TAG" >> $GITHUB_OUTPUT
- name: ECS Task Definition 생성
id: render-task-definition
uses: aws-actions/amazon-ecs-render-task-definition@v1
with:
task-definition: ${{ inputs.task-definition }}
container-name: ${{ inputs.ecs-container-name }}
image: ${{ steps.build-docker.outputs.image }}
물론 파이프라인 간 아웃풋 전달은 구현은 할 수 있겠으나 더 간단한 방법이 존재하지 않을까싶었다.
굉장히 간단한 방법이 있었다. 내가 바라던대로 Public ECR 로그인 시에만 Region을 설정할 수 있다. Credentials에서 Region을 지정하지 않으면 Public ECR 로그인에 실패하게 되는데, 그 이유는 ECR 로그인 action에 변수 중 AWS_DEFAULT_REGION=us-east-2
였기 때문이다. AWS_DEFAULT_REGION이라는 변수가 존재하는 줄도 몰랐다. 그렇게 ECR 로그인만 Region을 us-east-1으로 설정해서 해결했다.
- name: ECR 로그인
id: login-ecr
uses: aws-actions/amazon-ecr-login@v2
with:
registry-type: public
env:
AWS_DEFAULT_REGION: us-east-1
AWS_REGION: us-east-1
'DevOps > CICD' 카테고리의 다른 글
Gradle build와 GitHub Actions CI에 Checkstyle 추가 (0) | 2024.05.20 |
---|---|
Github Actions와 Github Secrets로 CI 도입 (1) | 2024.04.18 |
오늘은 트러블 슈팅이다.
문제 상황
내가 현재 진행하고 있는 프로젝트는 AWS의 프리티어를 이용해 개발 서버를 구축했다. 배포 방식은 Private ECR과 ECS with EC2를 이용해 배포 중이다. Private ECR은 Public ECR과 다르게 프리 티어에 제한이 상당히 적다. 우리의 개발 서버 이미지를 저장할 Private ECR이 잦은 배포로 사용량이 넘쳐서 프리티어 제공량을 넘을 것 같은 상황이었다.

그렇게 Public ECR로 바꾸기로 결정했다.
CD 파이프라인을 GitHub Actions를 이용해 구축했다. AWS의 공식 action인 amazon-ecr-login을 이용해 Private ECR과 Public ECR을 모두 간단하게 접근할 수 있다. 공식 레포 에서 언급한 것처럼 registry-type
으로 public 명시 후 Repository Alias까지 확인해서 업데이트 후 실행했다.
- name: ECR 로그인
id: login-ecr
uses: aws-actions/amazon-ecr-login@v2
with:
registry-type: public
- name: Docker 이미지 빌드 후 배포
id: build-docker
env:
REGISTRY: ${{ steps.login-ecr.outputs.registry }}
REGISTRY_ALIAS: ${{ inputs.ecr-registry-alias }}
REPOSITORY: ${{ inputs.ecr-repository }}
IMAGE_TAG: ${{ github.sha }}
PROFILE: ${{ inputs.env }}
run: |
docker build -t $REGISTRY/$REGISTRY_ALIAS/$REPOSITORY:$IMAGE_TAG --build-arg PROFILE=$PROFILE .
docker push $REGISTRY/$REGISTRY_ALIAS/$REPOSITORY:$IMAGE_TAG
echo "image=$REGISTRY/$REGISTRY_ALIAS/$REPOSITORY:$IMAGE_TAG" >> $GITHUB_OUTPUT
inputs는 외부에서 주입하는 변수라고 생각하시면 된다. 이제 정상적으로 배포가 될 지 PR을 머지해봤다.
결과는 다음과 같이 끔찍하다. 무엇 때문인지 감도 잘 못 잡았다.

원인
이유는 굉장히 간단했고, 공식 문서에도 언급을 하고 있었다. Public ECR은 us-east-1 Region에서만 접속 가능하다. 하지만 ECS Service를 구동시켜 Task Definition을 배포하기 위해 AWS Credentials 접속을 ap-northeast-2로 지정하고 있었다.
- name: AWS Credentials 설정
uses: aws-actions/configure-aws-credentials@v4
with:
aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
aws-region: ap-northeast-2
해결
Public ECR에 로그인하기 위해 ECS 태스크까지 영향이 가니 AWS Credentials 리젼은 건들기 싫었다. 우리 서버가 현재 서울에 있고, 만약에 CD 파이프라인에 AWS 작업이 추가될 수 있다면 그 Region은 서울일 확률이 높을 것이다.
ECR 로그인 시의 Region이나 ECS 배포 시의 Region을 특정할 수 있다면 간단하게 해결될 수 있을 것 같았지만, 두 actions의 변수에는 그렇게 Region을 특정하는 법은 보이지 않고 AWS configure credentials actions를 사용하라고만 나와있다.
파이프라인을 분리해서 us-east-1으로 로그인해 Public ECR을 Push하는 파이프라인과 ap-northeast-2로 로그인해 ECS 작업을 배포하는 파이프라인을 절차적으로 구동할까도 생각했다. 그렇게되면 ECR에 로그인 하고 이미지 푸시 후 output으로 나오는 이미지 주소를 절차적으로 사용하지 못하고 직접 입력해야한다.
- name: Docker 이미지 빌드 후 배포
id: build-docker
env:
REGISTRY: ${{ steps.login-ecr.outputs.registry }}
REGISTRY_ALIAS: ${{ inputs.ecr-registry-alias }}
REPOSITORY: ddudu-ecr
IMAGE_TAG: ${{ github.sha }}
PROFILE: ${{ inputs.env }}
run: |
docker build -t $REGISTRY/$REGISTRY_ALIAS/$REPOSITORY:$IMAGE_TAG --build-arg PROFILE=$PROFILE .
docker push $REGISTRY/$REGISTRY_ALIAS/$REPOSITORY:$IMAGE_TAG
echo "image=$REGISTRY/$REGISTRY_ALIAS/$REPOSITORY:$IMAGE_TAG" >> $GITHUB_OUTPUT
- name: ECS Task Definition 생성
id: render-task-definition
uses: aws-actions/amazon-ecs-render-task-definition@v1
with:
task-definition: ${{ inputs.task-definition }}
container-name: ${{ inputs.ecs-container-name }}
image: ${{ steps.build-docker.outputs.image }}
물론 파이프라인 간 아웃풋 전달은 구현은 할 수 있겠으나 더 간단한 방법이 존재하지 않을까싶었다.
굉장히 간단한 방법이 있었다. 내가 바라던대로 Public ECR 로그인 시에만 Region을 설정할 수 있다. Credentials에서 Region을 지정하지 않으면 Public ECR 로그인에 실패하게 되는데, 그 이유는 ECR 로그인 action에 변수 중 AWS_DEFAULT_REGION=us-east-2
였기 때문이다. AWS_DEFAULT_REGION이라는 변수가 존재하는 줄도 몰랐다. 그렇게 ECR 로그인만 Region을 us-east-1으로 설정해서 해결했다.
- name: ECR 로그인
id: login-ecr
uses: aws-actions/amazon-ecr-login@v2
with:
registry-type: public
env:
AWS_DEFAULT_REGION: us-east-1
AWS_REGION: us-east-1
'DevOps > CICD' 카테고리의 다른 글
Gradle build와 GitHub Actions CI에 Checkstyle 추가 (0) | 2024.05.20 |
---|---|
Github Actions와 Github Secrets로 CI 도입 (1) | 2024.04.18 |