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에 등록되어 있어야 함
아래 코드를 새 파일로 추가하거나, 배포 파이프라인에서 실행되도록 구성하세요.
- 환경변수 ECS_CLUSTER_NAME, ECS_SERVICE_NAME를 배포 파이프라인에서 지정
- 배포 후 이 스크립트를 실행하도록 파이프라인에 추가
- 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
파이프라인 동작
- 배포가 끝나면, 위 파이썬 스크립트가 실행되어
- ECS에서 퍼블릭 IP를 조회하고
- Route53의 youthbot.click A 레코드를 자동으로 최신 IP로 변경합니다.
AWS 콘솔에서 CodeBuild 역할에 위 3가지 권한을 추가하는 방법은 다음과 같습니다.
1. AWS 콘솔 접속 및 IAM 역할 찾기
- AWS Management Console에 로그인
- 상단 검색창에 IAM 입력 후 이동
- 왼쪽 메뉴에서 역할(Roles) 클릭
- CodeBuild에서 사용하는 역할(예: codebuild-ecs-llm-container-service-role)을 클릭
2. 권한 추가
- 역할 상세 페이지에서 권한 추가(Attach policies) 버튼 클릭
- 검색창에 각각 아래 이름을 입력하고 체크박스 선택
- AmazonECSFullAccess
- AmazonEC2ReadOnlyAccess
- AmazonRoute53FullAccess
- 하단의 권한 추가(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을 명시적으로 지정할 수 있습니다.
- CodeBuild 프로젝트 생성 시 또는 액션 설정에서
6) 저장 및 파이프라인 재시작
- 저장(Save) 또는 파이프라인 릴리즈(Release change) 클릭
- 파이프라인이 실행되면,
- 소스 →
- 빌드 →
- ECS 배포 →
- Route53 IP 업데이트(CodeBuild)
순서로 동작합니다.
참고
- 입력 아티팩트는 update_route53_ip.py가 포함된 소스가 전달되어야 하므로,
보통 빌드 단계의 아티팩트를 그대로 사용합니다. - CodeBuild 프로젝트의 buildspec 파일이 루트가 아니라면,
buildspec-route53.yml 경로를 명시해야 합니다.
두 번째 CodeBuild(즉, Route53 업데이트 단계)에서 첫 번째 빌드의 산출물(아티팩트)을 사용하려면, CodePipeline에서 아티팩트 전달 설정이 반드시 필요합니다.
확인해야 할 사항
- 첫 번째 CodeBuild(빌드 단계)에서 산출물(아티팩트)을 생성해야 합니다.
- 예: imagedefinitions.json, 소스 코드 등
- 두 번째 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.py, buildspec-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. 사용자는 새 버전의 웹서비스에 접속
'SK네트웍스 Family AI캠프 10기' 카테고리의 다른 글
SK네트웍스 AI캠프 120일차 - 최종프로젝트(청년정책 상담 챗봇) (0) | 2025.07.07 |
---|---|
SK네트웍스 AI캠프 117일차 - 랭스튜디오 챗봇 (1) | 2025.07.02 |
SK네트웍스 AI캠프 115~116일차 - DNS설정(route53)__AWS-CICD(청년정책 상담 챗봇) (3) | 2025.06.30 |
SK네트웍스 AI캠프 114일차 - ECS오류해결_AWS-CICD(청년정책 상담 챗봇) (0) | 2025.06.27 |
SK네트웍스 AI캠프 111~113일차 - 네이버로그인&ECS&파이프라인_AWS-CICD(청년정책 상담 챗봇) (0) | 2025.06.24 |