안녕하세요.
교보DTS 클라우드 기술팀 박지원입니다.
오늘은 Cloud9과 CodePipeline을 활용하여 CloudNative 애플리케이션 CI/CD 환경을 구축해보도록 하겠습니다.
AWS Cloud9 서비스를 사용하여 웹 기반 개발 환경을 배포하여 CI/CD 방식에 집중할 수 있도록하고, CDK(Cloud Development Kit)를 활용해 인프라를 코드 형태로 관리할 것입니다.
마지막으로 AWS CodePipeline을 사용하여 소스 코드부터 배포까지 릴리스 프로세스를 자동화하는 방법을 다뤄보도록 하겠습니다.
최종 아키텍처
목차
- Cloud9 & CDK 환경 세팅
- CodeCommit – Git Repository 생성
- CodeBuild – 지정된 위치에서 소스 코드로 Build & Test
- CodeDeploy – 애플리케이션 및 배포 그룹 생성
- CodePipeline – 릴리스 프로세스 자동화
- 결론
1. Cloud9 & CDK 환경 세팅
Cloud9 이란?
AWS Cloud9은 브라우저만으로 코드를 작성, 실행 및 디버깅할 수 있는 클라우드 기반 통합 개발 환경(IDE)입니다. 여기에는 코드 편집기, 디버거 및 터미널이 포함됩니다. Cloud9에는 널리 사용되는 프로그래밍 언어를 위한 필수 도구와 AWS 명령줄 인터페이스(CLI)가 사전 설치되어 제공되므로 이 워크숍을 위해 파일을 설치하거나 컴퓨터를 구성할 필요가 없습니다. Cloud9 환경은 AWS Management Console에 로그인한 사용자와 동일한 AWS 리소스에 액세스할 수 있습니다.
1-1. Cloud9 생성 전
로컬환경처럼 인터넷통신이 되는 환경을 세팅하기 위해 VPC를 생성하고 Public subnet에 Internet gateway Routing 설정을 해놓아야한다. Cloud9를 생성하면 EC2가 하나 생성되는데 이때, 자동으로 Public IP를 가질 수 있도록 Subnet 설정에서 “Enable auto-assign public IPv4 address” 기능을 켜야 합니다. 해당 실습에서 이 과정은 생략합니다.
1-2. Cloud9 생성
1. AWS Console에서 Cloud9 환경 생성 클릭
2. 이름을 입력하고 선택적으로 설명 입력
3. 환경 타입은 EC2 Instance 선택
4. 테스트환경이므로 “t2.micro” 제일 작은 스펙 선택
5. 나머지는 Default 값 설정
6. Connection – SSM 선택
7. 생성해놓았던 VPC 및 Subnet을 드롭다운하여 선택
8. 생성 클릭
9. 환경을 프로비저닝하고 준비하는데 몇 분 정도 걸립니다.
10. 준비가 되면 IDE에 시작 화면이 열립니다. 그 아래 터미널 창이 나타납니다.
11. 터미널 창에서 AWS CLI 명령을 실행할 수 있는데, 다음을 실행하여 사용자가 로그인했는지 확인합니다.
aws sts get-caller-identity
12. 계정 및 사용자 정보를 나타내는 출력이 아래 예시와 같이 표시됩니다.
{
"Account": "1234567890",
"UserId": "AKIAI44QH8DHBEXAMPLE",
"Arn": "arn:aws:iam::1234567890:user/xxx"
}
1-3. CDK 애플리케이션 소스 다운
이번 실습은 코드형 인프라보다는 개발자 도구에 중점을 두기 때문에 구현 세부 사항에 대해 자세히 알아보기보다는 제공된 CDK 애플리케이션을 실행하기만 하면 됩니다.
1. Cloud9 터미널에서 아래 명령어를 통해 CDK 애플리케이션 소스를 다운하여 개발 환경에 애플리케이션을 추출
1. curl -s https://static.us-east-1.prod.workshops.aws/public/8c4076ba-a416-424d-acc7-06e5cc2de102//static/20-infrastructure/InfrastructureApp.tgz | tar -xzv
2. cd InfrastructureApp
2. CDK 애플리케이션 종속성을 설치하고 CDK 프로젝트를 빌드
1. npm install
2. npm run build
3. CDK를 계정 및 지역으로 배포합니다.
하기 명령어를 통해 AWS 계정과 리전에 필요한 초기 리소스를 설정하여 CDK 애플리케이션을 배포할 수 있도록 설정합니다.
cdk bootstrap
4. 계정과 지역을 부트스트랩했다는 것을 나타내는 메시지가 아래와 같이 표시됩니다.
5. CDK 애플리케이션을 계정 및 지역에 배포
1. cd ~/environment/InfrastructureApp
2. cdk deploy
6. 성공적으로 배포되면 터미널에 아래 값들의 목록이 표시됩니다.
이때 생성된 리소스들은 다음과 같습니다.
– S3
– EC2
– CodeBuild Role
– CodeDeploy Role
2. CodeCommit – Git Repository 생성
인프라가 배포되었으면 이제 CI/CD 파이프라인에 필요한 구성 요소 구축을 시작할 수 있습니다.
소스 코드 Repository를 생성해보겠습니다.
- AWS Console > CodeCommit 으로 이동
- Repository 생성
- Repositroy 이름 “DemoApp” 입력
- 생성 선택
- 생성이되면 HTTPS 복제에서 Repository URL을 복제
6. Cloud9 터미널 창에서 디렉터리를 환경 디렉터리로 변경
7. 방금 복사한 복제 URL로 Git 저장소를 복제
1. cd ~/environment
2. git clone <your repository URL>
빈 Repository를 복제했다는 경고 메세지가 표시됩니다.
8. 빈 Repository에 Java 애플리케이션을 채웁니다.
1. curl -s https://static.us-east-1.prod.workshops.aws/public/8c4076ba-a416-424d-acc7-06e5cc2de102//static/30-source/DemoApp.tgz | tar -xzv
2. cd DemoApp
9. 처음 Commit을 하기 전에 Git 설정을 진행합니다.
1. git config --global user.email "you@example.com"
2. git config --global user.name "Your Name"
10. Git Repository에 Commit하고 Push합니다.
11. CodeCommit Repository에 업로드된 것을 확인할 수 있습니다.
3. CodeBuild – Build & Test
애플리케이션을 배포하기 전에 배포 가능한 아티팩트로 빌드해야 합니다. Java 웹 앱의 경우 해당 아티팩트는 WAR 파일이라고도 하는 웹 애플리케이션 아카이브입니다. AWS CodeBuild는 아티팩트 파일을 저장할 S3 버킷이나 Git 저장소 등을 통해 배포할 수 있습니다. 실습과정에서 이미 아티팩트 파일을 저장하는 S3를 생성했습니다.
3-1. Build Project 생성
- CodeBuild가 빌드를 실행하는데 사용할 Build Project를 생성합니다. 이 Build Project에는 소스 코드를 가져올 위치, 사용할 빌드 환경, 실행할 빌드 명령 등의 정보가 포함됩니다.
- AWS Console > CodeBuild로 이동합니다.
- Build Project를 생성 선택을 합니다.
4. 프로젝트 이름을 “DemoApp”로 설정합니다.
5. Source 공급자를 AWS CodeCommit를 선택합니다.
6. Repository에서 DemoApp을 선택합니다.
7. Reference type을 Branch로 선택합니다.
8. Branch 필드에서 master를 선택합니다.
9. 환경 패널에서 환경 이미지는 관리형으로 선택합니다.
10. 운영 체제는 Ubuntu로 선택합니다.
11. Runtime – Standard 선택
12. Image – Default 옵션
13. Image version – 최신 버전 선택(Default)
14. Service role – 기존 서비스 역할을 선택하고, 실습과정에서 생성된 CodeBuildRole을 선택하세요.
15. Buildspec 패널에서 “Use a Buildspec file” 옵션을 선택
16. 아티팩트 패널 Type에 Amazon S3를 선택합니다.
17. Bucket은 실습과정에서 생성된 S3 버킷을 선택합니다.(InfrastructureStack.BucketName 인 CDK 애플리케이션 배포의 출력에서 버킷 이름을 찾을 수 있습니다.)
18. 이름 필드에 WebAppOutputArtifact.zip를 입력합니다.
19. 아티팩트 패키징 필드에서 Zip을 선택하고 생성합니다.
3-2. BuildSpec 파일 생성
1. Cloud9 환경에서 DemoApp Repository에 buildspec.yml 파일을 생성합니다
2. buildspec.yml 파일에 아래 코드를 넣고 저장합니다.
version: 0.2
phases:
install:
runtime-versions:
java: corretto8
build:
commands:
- mvn install
artifacts:
files:
- target/javawebdemo.war
- appspec.yml
- scripts/**/*
discard-paths: no
3. 변경 사항을 Git Repository에 커밋하고 푸시합니다.
1. cd ~/environment/DemoApp
2. git add .
3. git commit -m "Add buildspec"
4. git push
3-3. Build 확인
1. CodeBuild로 이동하여 DemoApp 프로젝트를 선택합니다.
2. 빌드 시작하여 상태가 진행중에서 성공으로 완료되는지 확인합니다.
4. CodeDeploy
앞서 생성한 WAR 파일을 통해 EC2 인스턴스에 애플리케이션을 배포할 수 있습니다. CodeDeploy는 Amazon EC2 인스턴스, 온프레미스 서버, Lambda 함수 또는 Amazon ECS 등에 애플리케이션 배포를 자동화하는 배포 서비스입니다.
4-1. Application 생성
- AWS Console > CodeDeploy > Application 생성
- 애플리케이션 이름 필드에 “DemoApp” 입력
- Compute platform에서 EC2/On-premises를 선택
- 애플리케이션 생성
4-2. Deployment Group 생성
- 생성한 Application에서 deployment group 생성
- 배포 그룹 이름 필드에 “Development” 입력
- Service Role 필드에 실습과정에서 생성한 Role 선택(InfrastructureStack.DeployRoleArn 을 사용하여 CDK 애플리케이션 배포 출력에서 역할 ARN을 찾을 수 있습니다.)
- 배포 유형은 “In-place 선택”
5. Environment configuration – Amazon EC2 instances 선택
6. Tag Group 1에 Key – App, Value – DemoApp 을 입력합니다.
7. Tag Group 2에 Key – Env, Value – DEV 를 입력합니다.
8. Install AWS CodeDeploy Agent 옵션은 “Now and schedule updates”로 선택합니다.(Default)
9. Deployment settings는 “CodeDeployDefault.AllAtOnce로 선택(Default)
10. 로드밸런서 패널에서 “로드 밸런서 활성화 확인”을 취소합니다.
11. 배포 그룹 생성
4-3. 애플리케이션 사양 추가
1.Cloud9 환경에서 DemoApp Repository에 apppec.yml 파일을 생성하여 아래 코드를 넣습니다.
version: 0.0
os: linux
files:
- source: /target/javawebdemo.war
destination: /tmp/codedeploy-deployment-staging-area/
- source: /scripts/configure_http_port.xsl
destination: /tmp/codedeploy-deployment-staging-area/
hooks:
ApplicationStop:
- location: scripts/stop_application
timeout: 300
BeforeInstall:
- location: scripts/install_dependencies
timeout: 300
ApplicationStart:
- location: scripts/write_codedeploy_config.sh
- location: scripts/start_application
timeout: 300
ValidateService:
- location: scripts/basic_health_check.sh
2. 변경 사항을 로컬 Git Repository에 Commit하고 푸시합니다.
cd ~/environment/DemoApp
git add .
git commit -m "Add appspec"
git push
3. 배포를 테스트할 준비가 되면 S3에 저장된 배포 아티팩트에 appspec.yml 파일이 포함되도록 애플리케이션의 새 빌드를 트리거합니다.
3-1. AWS Console > CodeBuild 선택
3-2. DemoApp 빌드 프로젝트 선택
3-3. 빌드 시작 선택
3-4. 빌드가 성공적으로 되는것을 확인하고 Repository에 appspec.yml 파일이 추가된 것을 확인합니다.
4-4. 배포 확인
1.AWS Console > CodeDeploy를 선택
2. Application > DemoApp > Deployments로 이동
3. Deployment 생성
4. Deployment 설정 패널 > Deployment Group > Deploymeny 선택
5. Revision location > s3://<your bucket name>/WebAppOutputArtifact.zip
필드 에 입력하십세요.(키가 InfrastructureStack.BucketName 인 CDK 애플리케이션 배포의 출력에서 버킷 이름을 찾을 수 있습니다.)
6. 나머지 옵션은 Default로 두고 배포 생성
7. 성공적으로 배포가 되는지 확인하고, 웹 애플리케이션이 잘 배포되었는지 확인합니다.(키 InfrastructureStack.DevLocation 을 사용하여 CDK 애플리케이션 배포 출력에서 개발 서버 아이피를 찾을 수 있습니다.)
5. CodePipeline – 릴리스 프로세스 자동화
이제 빌드 프로젝트와 배포를 빌드하고 확인했으므로 변경 사항을 소스 리포지토리에서 테스트 서버로 이동하는 파이프라인을 구성할 준비가 되었습니다. CodePipeline을 생성해보겠습니다.
1.AWS Console > CodePipeline 생성
2.Pipeline 이름 필드에 “DemoApp”을 입력합니다.
3.Pipeline type은 V2로 설정하고, 실행모드는 대기로 설정합니다.
4. 새 서비스 역할을 선택하고, “AWS Codepipeline이 새로운 파이프라인과 함께 사용할 수 있도록 서비스 역할을 생성하도록 허용” 하도록 합니다.
5. 소스 공급자 필드에서 “AWS CodeCommit”을 선택합니다.
6. Repository 이름 필드에서 “DemoApp”을 선택합니다.
7. Branch name에 “master”를 선택합니다.
8. 변경 감지 옵션에서 “Amazon CloudWatch Events”가 선택되어 있는지 확인합니다.
9. 빌드 공급자는 “AWS CodeBuild”를 선택합니다.
10. 지역은 “Seoul”을 선택합니다.
11. Project 이름은 “DemoApp”을 선택합니다.
12. Deploy 공급자는 “AWS CodeDeploy”를 선택합니다.
13. Region – Seoul
14. Application name – “DemoApp”
15. Deployment group – Deployment
16. 설정 사항 검토 후 Pipeline 생성
17. 파이프라인이 실행되기 시작하고 몇 분 후에 각 단계가 성공하는 것을 볼 수 있습니다.
파이프라인이 잘 동작하는 것을 확인했습니다. 웹 애플리케이션을 변경하고 파이프라인 실행을 트리거하는 방법을 테스트해보겠습니다. Cloud9에서 “DemoApp/src/main/webapp/WEB-INF/pages/index.jsp” 경로의 파일을 수정해보도록 하겠습니다.
제목을 알아볼 수 있는 것으로 변경하고 파일을 저장합니다.
변경 사항을 로컬 Git Repository에 Commit하고 푸시합니다.
cd ~/environment/DemoApp
git add .
git commit -m "Change title"
git push
파이프라인이 변경 사항을 감지하고 파이프라인 단계를 자동으로 실행시킵니다. 배포가 성공하면 서버를 다시 접속하여 업데이트된 제목을 확인합니다.
5. 결론
AWS Cloud9과 CodePipeline을 활용한 CI/CD 파이프라인 구축은 소프트웨어 개발 및 배포 프로세스를 자동화하고 최적화하는데 도움이 됩니다. 이러한 파이프라인은 개발 주기를 단축시키고, 배포 과정을 안정적으로 수행하고 관리할 수 있도록 합니다. Cloud9의 클라우드 기반 IDE 환경과 CodePipeline의 유연한 자동화 워크플로우를 통해 더욱 효율적인 DevOps 작업 환경을 구축하셨으면 좋겠습니다.
과금이 발생하지 않도록 실습 과정에서 생성한 리소스들은 꼭 삭제하시길 바랍니다!