이번 포스팅은 바로 저번 GitHub Actions를 이용한 ECR배포에서 이어지는 포스팅이므로 참고하면 되겠다
[AWS] GitHub Actions으로 private ECR에 이미지 push 자동화하기
이번 포스팅에서는 Docker Hub가 아닌 AWS의 ECR에 이미지를 push 하기 까지를 GitHub Actions로 자동화를 해보려한다 먼저 테스트를 하기위한 간단한 express를 만들고 시작해보겠다 Express 어플리케이션 생
john721.tistory.com
fastify.js 애플리케이션
먼저 이번 코드와 다른 점은 express.js가 아닌 fastify.js로 만들어보겠다
$ npm i --global fastify-cli
$ fastify generate my-ecs-test
위의 명령어를 입력하면 아래와 같이 폴더들이 생길 텐데 여기까지만 해주고
도커라이징 해서 ECR에 먼저 올릴 건데 그 부분은 다시 한번 말하지만 위의 포스팅을 참고하면 되겠다.
아래의 root.js의 파일에서 이 코드로 바꿔 줄 건데 그 이유는 /경로로 들어갔을 때 정말 로드벨런싱이 잘되는지 확인하기 위해서다
const os = require('os');
module.exports = async function (fastify, opts) {
fastify.get('/', async function (request, reply) {
const interfaces = os.networkInterfaces();
let address;
Object.keys(interfaces).forEach((interfaceName) => {
interfaces[interfaceName].forEach((interface) => {
if (interface.family === 'IPv4' && !interface.internal) {
address = interface.address;
}
});
});
reply.code(200).send(`이서버의 IP는:${address}`);
});
};
아래의 yaml은 ECR에 푸시하기 위한 코드이다
name: Deploy to Amazon ECR
on:
push:
branches:
- main
pull_request:
branches:
- main
env:
AWS_REGION: ap-northeast-2
jobs:
deploy:
name: Deploy
runs-on: ubuntu-latest
environment: production
steps:
- name: Checkout
uses: actions/checkout@v2
- name: Configure AWS credentials
uses: aws-actions/configure-aws-credentials@v1
with:
aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
aws-region: ${{ env.AWS_REGION }}
- name: Login to Amazon ECR
id: login-ecr
uses: aws-actions/amazon-ecr-login@v1
- name: Build, tag, and push image to Amazon ECR
id: build-image
env:
ECR_REPOSITORY: my-was
ECR_REGISTRY: ${{ steps.login-ecr.outputs.registry }}
IMAGE_TAG: ${{ github.sha }}
# IMAGE_TAG: latest
run: |
cd ecr-test
docker build -t $ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG .
docker push $ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG
echo "::set-output name=image::$ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG"
GitHub Actions를 한다면 아래의 그림처럼 리포지토리에 이미지가 push 되어있다 이제 ECS로 배포해 보자
ECS서비스를 오게 된다면 먼저 클러스터를 생성하기 전 왼쪽을 확인해보면 태스크 정의가 있는데 먼저 태스크 정의를 클릭해 주자
태스크를 사용하려면 먼저 어떻게 태스크를 어떤 방법으로 사용하고 어떻게 배포전략을 할지 등 실행할 태스크의 명세서 작성이라고 생각하면 되겠다. 먼저 새 태스크 정의 생성을 클릭해 주자
먼저 태스크의 이름을 정해주고 사용할 컨테이너의 정보를 입력해 주자 이름은 자유이며 이미지 URI는 ECR에 있는 이미지의 URI를 사용하면 되겠다 컨테이너 포트는 8080으로 해놨기 때문에 8080으로 정해주면 되겠다 입력했다면 다음을 눌러주자
정의한 태스크는 AWS Fargate 서버리스 VM안에서 실행할 거 기 때문에 default로 놔두자
이 부분도 다른 것들은 건드릴 필요 없다 자세하게 알고 싶다면 따로 공부하는 걸 추천한다 여기서는 ECS로 어떻게 배포하는지에 중점을 뒀으니 넘어가겠다 다음을 눌러주자
검토하는 화면이 보이면 검토하고 생성을 클릭하자 생성했다면 아래의 그림처럼 태스크 정의가 하나 만들어진 걸 확인할 수 있다
태스크 정의를 만들었다면 이번에는 태스크정의를 사용하기 위한 클러스터를 생성해 보겠다 클러스터 생성을 눌러주자
클러스터 이름을 지정해 주고 사용할 VPC를 골라주고 서브넷을 선택해야 하는 필자는 default로 되어있는 서브넷을 사용하겠다
유의해야 할 사항은 서브넷이 프라이빗 서브넷이면 안된다 만약에 서브넷을 만들어 놓은 것 중에서 프라이빗이 있는지 잘 확인하길 바란다
여기까지 정해주고 아래는 그냥 지나가겠다 생성을 눌러주자
생성했다면 생성한 클러스터를 클릭해 보자 클릭한다면 아래의 그림을 확인할 수 있는데 태스크를 생성하기 위해서 서비스 생성을 클릭해 주자
별다른 지정 없이 시작 유형을 클릭해 주자
배포 구성에서는 서비스를 선택해 주고 패밀리는 앞에서 생성한 태스크 정의로 선택하면 되겠으며
서비스 이름은 취향대로 지정해 주고 우리는 태스크를 2개를 만들어주겠다
앞에서도 얘기했듯이 2개의 태스크를 로드밸런싱 하기 위해 ALB를 생성해 주겠다 아래의 그림처럼 입력했다면 생성 버튼을 클릭해 주자
5~10분 정도 기다리다 보면 서비스가 배포 완료된 걸 확인할 수 있다 우리는 ALB를 앞단에 둬서 배포했으니까 로드벨런 서 DNS로 접속해 보자(만약에 뭔가 더 느리고 배포완료가 안 뜬다면 로그를 확인하자 필자는 보안그룹을 3000 포트를 열어주지 않았다... 꼭 확인하길 바란다)
로드밸런서로 이동해서 DNS NAME로 접속해 보겠다 참고로 3000 포트도 넣어줘야 한다
아래의 그림처럼 새로고침을 하게 되면 서버의 IP가 변하게 되는 걸 확인할 수 있다 즉 로드벨런싱이 이뤄지고 있는 상태이다
여기 까지도 사실 손으로 직접 클릭하고 ECR을 자동화했어도 만약에 코드를 수정할 때마다 태스크 정의를 다시 고치고 서비스를 또 직접 업데이트를 해야 한다... 얼마나 귀찮은 일이 아닌가 싶다 이제 ECS 배포까지 자동화해보자
먼저 태스크 정의로 이동하고 마지막으로 생성한 태스크 정의를 클릭하자 확인해 보면 JSON이 있는데 이걸 가지고 배포를 자동화할 수 있다 일단 JSON을 복사하자
생성한 파일의 최상단에 task-definition.json 파일에 붙여 넣어주자 넣어줬다면 이제 workflows를 수정해줘야 한다
아래의 yaml로 바꿔주고 push를 해보자
name: Deploy to Amazon ECS
on:
push:
branches: ['main']
env:
AWS_REGION: ap-northeast-2 # 서울리전
ECR_REPOSITORY: my-was # 설정한 리포지토리이름
ECS_SERVICE: my-test-svc1 # 설정한 서비스이름
ECS_CLUSTER: my-test-cluster1 # 설정한 클러스터 이름
CONTAINER_NAME: my-teest # 태스크 정의 할때 만들었던 컨테이너 이름이다
permissions:
contents: read
jobs:
deploy:
name: Deploy
runs-on: ubuntu-latest
environment: production
steps:
- name: Checkout
uses: actions/checkout@v3
- name: Configure AWS credentials
uses: aws-actions/configure-aws-credentials@v1
with:
aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
aws-region: ${{ env.AWS_REGION }}
- name: Login to Amazon ECR
id: login-ecr
uses: aws-actions/amazon-ecr-login@v1
- name: Build, tag, and push image to Amazon ECR
id: build-image
env:
ECR_REGISTRY: ${{ steps.login-ecr.outputs.registry }}
IMAGE_TAG: ${{ github.sha }}
run: |
# Build a docker container and
# push it to ECR so that it can
# be deployed to ECS.
cd ecr-test
docker build -t $ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG .
docker push $ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG
echo "image=$ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG" >> $GITHUB_OUTPUT
- 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 }}
- name: Deploy Amazon ECS task definition
uses: aws-actions/amazon-ecs-deploy-task-definition@v1
with:
task-definition: ${{ steps.task-def.outputs.task-definition }}
service: ${{ env.ECS_SERVICE }}
cluster: ${{ env.ECS_CLUSTER }}
wait-for-service-stability: true
GitHub Actions를 확인해 보면 잘 배포된 걸 확인할 수 있는데 ECS에서 확인해 보자
분명 전에는 개정이 4였는데 5로 바뀌었다 이렇게 GitHub Actions로 배포를 자동화하는 방법이었다
트러블 슈팅
사실 express로 배포해보려 했다 하지만 에러는 없는데 태스크는 계속 배포하다 죽고 반복을 했다 그래서 모든 방법을 동원했는데 결국 안돼서 다른 프레임워크를 사용해봐야 하나 해서 fastify를 사용한 거다 하지만 fastify도 express를 배포했을 때랑 상황이 똑같았었다.. 아차 싶었는데 알고 보니 fastify가 사용하는 3000번 포트를 보안그룹에서 인바운드에서 허용을 하지 않았었다.... 찾은 순간 아... express는 8080 포트로 해놨는데 그때도 보안그룹을 허용 안 했구나 생각이 들었다.. 역시 컴퓨터는 잘못이 없다 휴먼에러..
'DevOps > AWS' 카테고리의 다른 글
[자격증 후기] AWS SAA-C03 솔루션즈 아키텍트 어소시에이트 합격후기(2023-02-27) (4) | 2023.02.27 |
---|---|
[AWS] SAM으로 API Gateway와 lambda, dynamoDB 배포 (0) | 2023.02.03 |
[AWS] GitHub Actions으로 private ECR에 이미지 push 자동화하기 (0) | 2023.01.18 |
[AWS] AWS ECS 개념 (0) | 2023.01.10 |
[AWS] Route53에 외부 도메인(가비아) 연결, SSL 인증서 (0) | 2023.01.09 |