AWS

[AWS] ECR, ECS, Github Actions Push

sungchilll 2025. 1. 2. 22:22

2024.12.31

개발환경

[MacOS]

Github Actions

Docker

Spring Boot

AWS ECR

AWS ECS

 

ECS

  • AWS에서 제공하는 컨테이너 서비스

종류

  • EC2
  • Fargate
    • 컨테이너 운영을 위한 서버리스 컴퓨팅
    • OS의 maintenance 필요 x
    • 어플리케이션 집중 가능

구성요소

  • Cluster
    • 같은 Cluster 내부의 태스크와 서비스는 같은 네트워킹 정보와 인프라 설정
    • 여러 Cluster instance가 실행될 수 있는 가상의 공간
  • Service
    • Task Defintion과 1:1 관계를 맺어 실제 동작 스케쥴링 설정
  • Task
    • 컨테이너를 실행하는 최소 단위
    • 컨테이너를 ECS 상에서 실행시키기 위해서는 Task 안에서 정의
    • Task Definition 필수
      • Task Definition 설명서
      • CPU, Memory 성능, 실행할 컨테이너에 대한 image 정의 등을 설정
  • Container Instance

 

ecsTaskExcutionRole 권한 정책 추가

 

Task 정의

새 태스크 생성

 

컨테이너 이미지 URI에 ECR URI 입력 후 생성

 

 

클러스터 생성

 

서비스 생성

 

Github Actions yml 작성

name: User source Deploy to Amazon ECR & ECS
on:
  push:
    branches:
      - main
env:
  AWS_REGION: ap-northeast-2
  ECR_REPOSITORY: ${{ secrets.ECR_REPOSITORY }}
  ECS_SERVICE: ${{ secrets.ECS_SERVICE }}
  ECS_CLUSTER: ${{ secrets.ECS_CLUSTER }}
  CONTAINER_NAME: ${{ secrets.CONTAINER_NAME }}
  
jobs:
  build-deploy:
    runs-on: ubuntu-latest

    steps:
      - name: Checkout
        uses: actions/checkout@v4
        
      - name: Set up JDK 17
        uses: actions/setup-java@v4
        with:
          java-version: '17'
          distribution: 'temurin'
          cache: maven
          
      - name: Make application-prod.properties
        run: |
          cd ./src/main/resources
          touch ./application.properties
          echo "${{ secrets.PROPERTIES }}" > ./application.properties
        shell: bash
        
      - name: Build with Maven
        run: mvn -B package --file pom.xml
        
      - name: Naming jar file
        run: mv ./target/*.jar ./target/app.jar
  
      - name: Check jar file
        run: ls ./target
      
      - name: Set up Docker Buildx
        uses: docker/setup-buildx-action@v3

      - name: Configure 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

      - 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: latest
        run: |
          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: ECS task definition JSON file
        id: retrieve-task-def
        env:
          ECR_REGISTRY: ${{ steps.login-ecr.outputs.registry }}
          IMAGE_TAG: latest
          TASK_FAMILY: ${{ secrets.TASK_FAMILY }}
        run: |
          aws ecs describe-task-definition --task-definition $TASK_FAMILY --query taskDefinition > task-definition.json
          cat task-definition.json
          echo "task-def-file=task-definition.json" >> $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: ${{ steps.retrieve-task-def.outputs.task-def-file }}
          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

 

Secrets 변수 선언

Secrets 변수
ECR_REPOSITORY ECR 레포지토리 이름
ECS_SERVICE ECS 서비스 이름
ECS_CLUSTER ECS 클러스터 이름
CONTAINER_NAME ECS 컨테이너 이름
PROPERTIES application.properties
AWS_ACCESS_KEY_ID AWS Access key ID
AWS_SECRET_ACCESS_KEY AWS Secret access Key
TASK_FAMILY 하단 사진 참조

Task 세부 내용 JSON 파일
38번 라인 "family" = TASK_FAMILY

Github Push

성공 시 우측 하단 퍼블릭 IP로 요청 가능


 

반응형