SK네트웍스 Family AI캠프 10기

SK네트웍스 AI캠프 118일차 - DNS설정(route53)__AWS-CICD(청년정책 상담 챗봇)

netsma 2025. 7. 3. 09:03

ECS 서비스의 퍼블릭 IP가 변경될 때마다 Route53의 youthbot.click 도메인 A 레코드를 자동으로 최신 퍼블릭 IP로 업데이트하려면, 다음과 같은 Python 스크립트를 추가하면 됩니다.

아래 코드는

  • 현재 ECS 서비스의 퍼블릭 IP를 가져오고
  • Route53에서 youthbot.click의 A 레코드를 해당 IP로 업데이트합니다.

사전 준비:

  • boto3 라이브러리 설치
  • AWS IAM 권한: ecs:DescribeTasks, ec2:DescribeNetworkInterfaces, route53:ChangeResourceRecordSets, route53:ListHostedZones
  • youthbot.click이 Route53에 등록되어 있어야 함

아래 코드를 새 파일로 추가하거나, 배포 파이프라인에서 실행되도록 구성하세요.

  1. 환경변수 ECS_CLUSTER_NAME, ECS_SERVICE_NAME를 배포 파이프라인에서 지정
  2. 배포 후 이 스크립트를 실행하도록 파이프라인에 추가
  3. youthbot.click의 A 레코드가 자동으로 최신 퍼블릭 IP로 변경됨

참고:

  • 여러 태스크가 실행 중이면 첫 번째 태스크의 IP만 사용합니다.
  • 도메인, 클러스터, 서비스 이름 등은 환경에 맞게 수정하세요.
  • Route53에 youthbot.click이 등록되어 있어야 합니다.

buildspec.yml에 실행 단계 추가

buildspec.yml의 post_build 단계 마지막에 아래 명령을 추가하세요.

아래처럼 post_build의 마지막에 추가합니다.

  • your-ecs-cluster와 your-ecs-service는 실제 사용 중인 ECS 클러스터/서비스 이름으로 변경하세요.

IAM 권한 확인

CodeBuild 역할에 아래 권한이 있어야 합니다:

  • ecs:ListTasks
  • ecs:DescribeTasks
  • ec2:DescribeNetworkInterfaces
  • route53:ListHostedZonesByName
  • route53:ChangeResourceRecordSets

파이프라인 동작

  1. 배포가 끝나면, 위 파이썬 스크립트가 실행되어
  2. ECS에서 퍼블릭 IP를 조회하고
  3. Route53의 youthbot.click A 레코드를 자동으로 최신 IP로 변경합니다.

AWS 콘솔에서 CodeBuild 역할에 위 3가지 권한을 추가하는 방법은 다음과 같습니다.


1. AWS 콘솔 접속 및 IAM 역할 찾기

  1. AWS Management Console에 로그인
  2. 상단 검색창에 IAM 입력 후 이동
  3. 왼쪽 메뉴에서 역할(Roles) 클릭
  4. CodeBuild에서 사용하는 역할(예: codebuild-ecs-llm-container-service-role)을 클릭

2. 권한 추가

  1. 역할 상세 페이지에서 권한 추가(Attach policies) 버튼 클릭
  2. 검색창에 각각 아래 이름을 입력하고 체크박스 선택
    • AmazonECSFullAccess
    • AmazonEC2ReadOnlyAccess
    • AmazonRoute53FullAccess
  3. 하단의 권한 추가(Attach policies) 버튼 클릭

3. 완료

  • 이제 해당 역할에 필요한 권한이 모두 부여되었습니다.
  • CodeBuild를 다시 실행하면 권한 문제 없이 동작합니다.

1. CodeBuild 프로젝트 준비

  • 이미 buildspec-route53.yml 파일과 CodeBuild 프로젝트가 있다고 가정합니다.
  • CodeBuild 프로젝트의 **빌드 명세 파일(buildspec)**로 buildspec-route53.yml을 사용하도록 설정하세요.

2. CodePipeline에서 단계 추가

1) CodePipeline 콘솔 접속

  • AWS 콘솔 → CodePipeline → 해당 파이프라인 클릭

2) 파이프라인 편집

  • 우측 상단 편집(Edit) 버튼 클릭

3) ECS 배포 다음에 새 액션 추가

  • ECS 배포가 끝나는 **스테이지(예: Deploy)**에서
    “+ Add action group” 또는 “+ Add action” 버튼 클릭

4) 새 액션 설정

  • Action name: 예) UpdateRoute53
  • Action provider: CodeBuild
  • Project name: Route53 IP 업데이트용으로 만든 CodeBuild 프로젝트 선택
  • Input artifacts:
    • 이전 단계(빌드 또는 소스)에서 전달된 아티팩트 선택
    • 예: BuildArtifact 또는 SourceArtifact 
    • (이전 단계에서 전달받은 소스 코드가 있어야 update_route53_ip.py를 실행할 수 있습니다.)

5) 고급 설정(선택)

  • 환경 변수: 필요하다면 CodeBuild 프로젝트의 환경 변수로 ECS_CLUSTER_NAME, ECS_SERVICE_NAME을 지정할 수 있습니다.
  • buildspec 파일 경로:
    • CodeBuild 프로젝트 생성 시 또는 액션 설정에서
      buildspec-route53.yml을 명시적으로 지정할 수 있습니다.

6) 저장 및 파이프라인 재시작

  • 저장(Save) 또는 파이프라인 릴리즈(Release change) 클릭
  • 파이프라인이 실행되면,
    1. 소스 →
    2. 빌드 →
    3. ECS 배포 →
    4. Route53 IP 업데이트(CodeBuild)
      순서로 동작합니다.

참고

  • 입력 아티팩트는 update_route53_ip.py가 포함된 소스가 전달되어야 하므로,
    보통 빌드 단계의 아티팩트를 그대로 사용합니다.
  • CodeBuild 프로젝트의 buildspec 파일이 루트가 아니라면,
    buildspec-route53.yml 경로를 명시해야 합니다.

두 번째 CodeBuild(즉, Route53 업데이트 단계)에서 첫 번째 빌드의 산출물(아티팩트)을 사용하려면, CodePipeline에서 아티팩트 전달 설정이 반드시 필요합니다.


확인해야 할 사항

  1. 첫 번째 CodeBuild(빌드 단계)에서 산출물(아티팩트)을 생성해야 합니다.
    • 예: imagedefinitions.json, 소스 코드 등
  2. 두 번째 CodeBuild(배포 후 Route53 단계)에서 입력 아티팩트로 첫 번째 빌드의 산출물을 받아야
    update_route53_ip.py 등 필요한 파일을 사용할 수 있습니다.

CodePipeline에서 아티팩트 전달 설정 예시

  • 첫 번째 빌드 단계
    • Output artifacts: BuildArtifact (예시 이름)
  • 두 번째 빌드 단계
    • Input artifacts: BuildArtifact (위에서 생성한 아티팩트 이름)

buildspec 파일 위치와 아티팩트 포함 여부

  • buildspec-route53.yml update_route53_ip.py
    첫 번째 빌드의 아티팩트에 포함되어야 두 번째 빌드에서 사용할 수 있습니다.
  • 보통 첫 번째 빌드의 artifacts 설정에 **/* 또는 필요한 파일을 모두 포함시켜야 합니다.

예시: 첫 번째 buildspec.yml의 artifacts 설정

 

현재 artifacts에 imagedefinitions.json만 포함되어 있어서,
두 번째 CodeBuild 단계에서 필요한 소스 파일(update_route53_ip.pybuildspec-route53.yml 등)이
아티팩트에 포함되지 않습니다.


수정 방법

모든 소스 파일을 아티팩트에 포함시키려면 아래처럼 수정하세요:

 

이렇게 하면 프로젝트의 모든 파일이 아티팩트에 포함되어
두 번째 빌드 단계에서 필요한 파일을 사용할 수 있습니다.


요약

  • imagedefinitions.json만 포함 → 필요한 소스 파일이 누락됨
  • **/*로 변경 → 모든 파일이 포함되어 두 번째 빌드에서 사용 가능

# 1. 개발자가 GitHub에 코드 Push
# 2. CodePipeline이 변경 감지 후 파이프라인 실행
# 3. CodeBuild가 소스 체크아웃 → Docker 이미지 빌드 → ECR에 푸시
# 4. ECS가 새 이미지를 감지, 서비스에 배포
# 5. ECS Task가 SSM Parameter Store에서 환경변수(비밀키 등) 로드
# 6. CodeBuild가 ECS로 인해 변경된 퍼블릭IP를 route53에 등록된 도메인 네임에 업데이트함.
# 7. 사용자는 새 버전의 웹서비스에 접속