AWS (2) 소스 코드 푸시 시 Docker 빌드 및 컨테이너 배포 자동화

별빛사막·2025년 3월 17일
0

aws

목록 보기
2/3
post-thumbnail

AWS 인증 정보를 찾는 우선순위

aws cli가 다운받아져 있고 현재 상황에서 aws configure해서 로그인이 되어 있다면
aws configure list하면 목록이 나온다.

그렇기 때문에 springBoot에서 S3 실행하면 따로 api키를 입력하지 않아도 실행이 된다.
이때, AWS 인증 정보를 찾는 우선순위는 아래와 같다.

  1. 환경변수
  2. aws configure 명령어로 설정된 list
  3. application.yml
  4. EC2 IAM ROLE

도커 빌드 과정에서 테스트 실패를 회피하는 방법 2가지

도커 빌드 과정에서 테스트가 실패 원인) 해당 환경에서는 aws 인증정보가 없어서

  1. dockerfile > RUN gradle build --no-daemon -x test
    : -x test 옵션을 추가하면 Gradle 빌드 시 테스트를 실행하지 않음.

  2. application-test.yml에서 S3 자동 설정 제외
    : src/main/resources/application-test.yml에 아래 내용 추가해 테스트 환경에서 S3 서버 찾는 시도를 하지 않도록 막음

spring:
   autoconfigure:
     exclude: io.awspring.cloud.autoconfigure.s3.S3AutoConfiguration

이때 Test class에 @ActiveProfiles("test") 추가

🙋‍♀️ @ActiveProfiles("test")는 Spring Boot가 application-test.yml을 우선 적용하도록 설정하는 역할을 한다.
일반적으로 테스트 코드에서 특정 프로파일을 강제 적용할 때 사용됨.

만약, application-testing.yml 파일을 참조하려면 @ActiveProfiles("testing")으로 설정해야 한다

docker 이미지 빌드, 푸시 방법

Dockerizing 하는 과정
1) 애플리케이션 코드 준비(git pull)
2) Dockerfile 작성
3) docker build로 Docker 이미지 생성
docker build -t seyoen3/app:8 . : .빼먹으면 안된다!!

4) Docker push로 Docker hub에 업로드
docker push seyoen3/app:8

→ 이후 docker pull로 해당 이미지 다운받아 docker에서 컨테이너로 실행가능
docker pull seyoen3/app:8
docker run -d -p 8080:8080 --name app seyoen3/app:8

docker 이미지 빌드, 푸시 자동화

  • .github/workflows/deploy.yml에 job 작성
  • GitHub Actions를 통해 Docker 이미지를 자동으로 빌드
  • GitHub Packages(Container Registry)에 저장
  • 해당 패키지 setting에 들어가서 Private(비공개)로 설정해야함

🙋‍♀️Docker 이미지 내부에 환경 변수, API Key, 민감한 설정 파일이 포함될 가능성이 있어 보안 상 해당 패키지를 Private(비공개)로 설정하는게 좋다

  • 비공개 패키지를 EC2에서 다운로드하려면?
  1. access Token을 생성
  2. 로그인 진행
docker login ghcr.io -u [github아이디]  //이후, password에 accessToken 입력
  1. docker pull ghcr.io/your-org/your-private-image:latest
  2. EC2에서 docker run -d -p 8080:8080 --name app [이미지] 컨테이너 실행

🙋‍♀️ ghcr.io는 GitHub Container Registry(GHCR)의 도메인이며, GitHub Packages에서 제공하는 Docker 이미지 저장소이다. 비공개(Private) 패키지는 EC2에서 다운로드하려면 반드시 docker login ghcr.io 과정을 거쳐야 한다.(공개(Public) 패키지는 로그인 없이 다운로드 가능)


서버 작업 자동화

  • 자동화 대상 : 기존 새 이미지 다운 → 기존 컨테이너 종료 → 새 이미지 실행 → 기존 도커이미지 삭제
  • GITHUB ACTION 에서 도커 이미지 푸시가 완료되면 운영서버에게 교체하라는 명령어를 전송하여 자동배포 완성
  1. 리포지터리 세팅에서 AWS_REGION, AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY 시크릿 변수 생성
  2. .github/workflows/deploy.yml에 step추가
   deploy:
    runs-on: ubuntu-latest
    needs: [ buildImageAndPush ]
    steps:
      - name: AWS SSM Send-Command
        uses: peterkimzz/aws-ssm-send-command@master
        id: ssm
        with:
          aws-region: ${{ secrets.AWS_REGION }}
          aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
          aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
          instance-ids: "i-015d44766db7d2a9f"
          working-directory: /
          comment: Deploy
          command: |
            docker pull ghcr.io/${{ env.OWNER_LC }}/app20250314:latest
            docker stop app1 2>/dev/null
            docker rm app1 2>/dev/null
            docker run -d --name app1 -p 8080:8080 ghcr.io/${{ env.OWNER_LC }}/app20250314:latest
            docker rmi $(docker images -f "dangling=true" -q)

명령어

nslookup: 특정 DNS(Domain Name System) 조회를 수행하는 명령어
curl : Command-line URL tool의 약자로, 터미널에서 HTTP 요청을 보내고 응답을 확인할 수 있는 명령어

ex. curl https://example.com → 브라우저에서 페이지를 여는 것과 동일한 효과)

profile
조금씩 매일 성장하자

0개의 댓글