일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
- consumer
- kafka
- transactionaleventlistener
- QueryDSL
- topic생성
- producer
- CI
- spring kafka
- Streams
- spring
- Entity
- centos7
- ECS
- CodePipeline
- Spring Data JPA
- AWS
- offsetdatetime
- PAGING
- cd
- git
- Spring JPA
- mysql
- Kubernetes
- bean
- mirror maker2
- API
- entity graph
- JPA
- Kotlin
- K8s
- Today
- Total
Yebali
AWS CodePipeline으로 ECS 배포하기 본문
AWS ECS 구축하기 (근데 이제 ALB를 곁드린...)
세상에는 서버를 배포하는 많은 방법이 존재합니다.FTP로 수정된 파일을 서버에 직접 올리고 stop.sh, start.sh으로 Tomcat을 끄고키는 방법부터k8s 환경에서 argocd를 사용하는 방법까지 다양합니다. 이
yebali.tistory.com
앞선 포스트에서 ECS를 구축하는 간단한 방법을 설명했습니다.
이번 포스트에서는 코드가 수정되었을 때 ECS에 자동으로 배포할 수 있게
AWS CodePipeline을 사용해 CI/CD를 구축하는 방법을 알아보겠습니다.
CodePipeline 구성
CodePipeline
AWS 콘솔에서 CodePipeline 생성을 해줍니다.
template를 사용하지 않고 custom pipeline을 선택합니다.
파이프라인 설정에서 서비스의 역할은 새로 만들어서 이후 생성하는 파이프라인에서 함께 사용하는 것이 편합니다.
왜냐하면 아래의 수많은 권한들을 모두 필요로 하기 때문입니다.
Source Stage
배포할 코드의 소스를 설정하는 과정입니다.
예시에 사용된 코드는 제 Github에 있기 때문에 소스 공급자는 GitHub를 선택했습니다.
그리고 기본 브랜치는 main으로 설정해 주었습니다.
트리거는 Pipeline을 시작시키는 이벤트를 말합니다.
main 브랜치에 코드가 푸시되었을 때, pipeline이 동작하도록 설정해 주었습니다.
Build Stage
빌드 공급자로 AWS CodeBuild를 선택했습니다. '프로젝트 이름'에는 알맞은 CodeBuild를 설정하면 됩니다.
만약 생성된 CodeBuild 프로젝트가 없다면 아래와 같이 만들면 됩니다.
CodeBuild 생성
JDK 버전마다 런타임이나 이미지가 달라질 수 있기 때문에 알맞은 버전을 잘 찾아 설정해야 합니다.
여기서도 '서비스 역할'은 자동으로 생성했습니다.
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"ecr:GetAuthorizationToken",
"ecr:BatchCheckLayerAvailability",
"ecr:CompleteLayerUpload",
"ecr:InitiateLayerUpload",
"ecr:PutImage",
"ecr:UploadLayerPart"
],
"Resource": "*"
}
]
}
그리고 생성된 역할에 ECR에서 이미지를 가져오기 위해 위와 같은 권한을 추가해야 합니다.
Buildspec란 코드를 어떻게 빌드할 것인가에 대한 정의입니다.
여기서는 buildspec 파일을 사용하는 방법을 선택했고 소스 코드에 aws/buildspec.yml 파일을 다음과 같이 추가했습니다.
// buildspec.yml
version: 0.2
env:
variables:
REPOSITORY_URI: "354918373096.dkr.ecr.ap-northeast-2.amazonaws.com/ecs-example"
TAGS: "latest"
phases:
pre_build:
commands:
- echo Logging in to Amazon ECR...
- aws sts get-caller-identity
build:
commands:
- echo Building and pushing the image with Jib using Gradle...
- ./gradlew clean jib --image=$REPOSITORY_URI:$TAGS
post_build:
commands:
- echo Build completed on `date`
- printf '[{"name":"ecs-example","imageUri":"%s"}]' $REPOSITORY_URL:$TAGS > imagedefinitions.json
artifacts:
files:
- imagedefinitions.json
// build.gradle.kts
pinlugs {
id("com.google.cloud.tools.jib") version "3.4.4"
}
jib {
from {
image = "amazoncorretto:21"
}
}
앞선 포스트에서 설정했던 'jib {}' 블록에서 buildspec에 중복되는 부분이 있어 수정해 주었습니다.
artifacts 부분에서 'imagedefinitions.json'을 파일로 만드는 것을 볼 수 있는데 해당 파일은
다음 단계인 CodeDeploy에서 어떤 이미지를 배포할지에 대한 정보를 전달하는 파일입니다.
artifacts에 명시된 파일은 S3에 업로드되고 CodeDeploy가 해당 artifacts를 찾아서 배포할 때 사용합니다.
Deploy Stage
배포 공급자로 Amazon ECS를 선택하고 생성해 둔 ECS Cluster를 선택합니다.
'이미지 정의 파일'은 위의 CodeBuild에서 정의한 'imagedefinitions.json'을 입력합니다.
결과
AWS CodePipeline 생성이 완료되면 자동적으로 Pipeline이 실행됩니다.
실제로 코드가 변경되었을 때, CI/CD가 잘 이루어지는지 확인하기 위해 '/hello2' API를 만들고 코드를 푸시했습니다.
코드를 푸시하면 위처럼 자동으로 Pipeline이 실행되는 것을 확인할 수 있습니다.
마지막으로 /hello2 API를 호출하면 정상적인 응답을 받는 것을 확인할 수 있습니다.
소스코드가 필요하시다면 아래 Github을 참고해주세요.
GitHub - yebali/ecs-cluster-example
Contribute to yebali/ecs-cluster-example development by creating an account on GitHub.
github.com
'AWS' 카테고리의 다른 글
AWS ECS 구축하기 (근데 이제 ALB를 곁드린...) (0) | 2024.11.04 |
---|---|
EC2 Linux Java 11 설치하기 (0) | 2022.01.31 |
EC2 인스턴스 가상메모리 추가하기 (0) | 2022.01.31 |