안녕하세요 👻
이번 Hands On Lab 에서는 CodePipeline을 이용하여 ElasticBeanstalk에 배포해보도록 하겠습니다.
일단 한번 쉽게 사용해볼 수 있도록 준비했고, 모두 AWS에서 제공하는 Sample Code로 진행합니다. :)
AWS에서 제공하는 기본 HandsOnLab을 해보셔도 좋습니다.
아래 각 스텝에서 더보기를 클릭하여 자세한 내용을 확인하세요!!
시작하겠습니다!
● Hands On Lab 시나리오
아래 더보기를 활성화 하여 내용을 확인하세요 😎
1. 개발자가 코드를 커밋하면 AWS Code Commit 레포지토리에 코드가 저장됩니다.
2. AWS Code Commit 레포지토리에 새로운 버전의 코드가 커밋되면,
자동으로 ElasticBeanstalk의 BetaEnvironment에 EC2가 배포됩니다.
3. 관리자는 수동 승인절차를 통해 Beta Environment를 검토하고 최종 배포를 "승인" 합니다.
4. 관리자의 승인으로 인해 Production Envirenment에 EC2가 배포됩니다.
● 개발 환경 구성 - Cloud9
아래 더보기를 활성화 하여 내용을 확인하세요 😎
이 실습에서는 Cloud9을 사용합니다.
만약, AWS에 대해 이미 잘 알고있고, IAM 서비스 등을 잘 이해하고 있다면 Cloud9 사용하지 않고 로컬 컴퓨터에서 실습을 진행하셔도 무방합니다 :)
AWS 콘솔 로그인 후, Cloud9을 검색하여 클릭합니다.
"Create environment"를 클릭하여 새로운 환경을 생성합니다.
첫번째 스탭, 환경이름을 작성한 후에 Next Step을 클릭합니다.
두번째 스탭, 환경의 구성을 세팅합니다. 아래와 같이 입력하고 "Next Step"을 클릭합니다.
* 네트워크 VPC 설정의경우, 잘 모른다면, Default로 두고 시작하세요!
세번째 스탭, 잘 설정 되었는지 확인합니다. 이후 "Create envirenment"를 클릭하여 환경을 생성합니다.
Cloud9 환경이 정상적으로 배포되고 나면, 이렇게 뜹니다 :)
아래와 같은 화면이 나왔다면 이제 다음단계로 넘어갑니다.
● Elastic Beanstalk 어플리케이션 및 환경 생성
아래 더보기를 활성화 하여 내용을 확인하세요 😎
AWS ElasticBeanstalk 콘솔에 접속하고, "Create Application"을 선택합니다. :)
아래와 같이 설정한 후, "어플리케이션 생성"을 클릭합니다.
- 어플리케이션 이름: hol-myweb
- 플랫폼 (php 7.3 running on 64 bit Amazon Linux 2.9.11)
생성이 완료되면 아래와 같은 화면이 보입니다.
이제, Beta 환경과 Production 환경을 별도로 생성합니다. :)
이렇게 이름을 별도로 지정해주는 이유는 실습 진행 중 헷갈리지 않게 하기 위해서 입니다.
왼쪽 네비게이션바에서 "애플리케이션"을 클릭한 후에 "hol-myweb"을 클릭합니다.
이 애플리케이션에다가 "Beta", "Production" 환경 두개를 더 생성하겠습니다 :)
오른쪽 상단의 "새 환경 생성"을 클릭합니다.
웹서버환경 선택된것 그대로 둔 후, "선택"을 클릭합니다.
아래와 같이 환경 이름을 작성하고, 플랫폼을 선택한 후 "환경생성"을 클릭합니다.
- 환경 이름 : holMyweb-Beta
- 플랫폼 : php 7.3 running on 64 bit Amazon Linux 2.9.11
자, 이렇게 환경 생성이 시작되었습니다.
우리는 이 사이에 하나의 환경(Production)을 더 만들겠습니다.
왼쪽 네비게이션바에서 "애플리케이션"을 클릭하고, hol-myweb을 한번 더 클릭합니다.
자, 한번 더 웹서버 환경을 선택한 후 "선택"을 클릭합니다.
아래와 같이 환경 이름을 작성하고, 플랫폼을 선택한 후 "환경생성"을 클릭합니다.
- 환경 이름 : holMyweb-Production
- 플랫폼 : php 7.3 running on 64 bit Amazon Linux 2.9.11
자, 두개의 환경을 더 생성하고 나면 아래 사진과 같이 하나의 어플리케이션에 3개의 환경이 동작중인 상태가 됩니다.
여기까지가 이번 단계입니다. :)
● 관리자 e-mail , SNS에 등록
아래 더보기를 활성화 하여 내용을 확인하세요 😎
이번에는 Simple Notification Service 서비스 콘솔에 접속합니다.
SNS 서비스에 이메일을 등록하는 이유는, 코드 파이프라인의 수동승인절차 때문입니다.
여기로 등록한 이메일로 승인가능한 이메일이 발송됩니다 :)
AWS Simple Notification Service 콘솔에 접속합니다.
왼쪽 네비게이션바의 "주제"를 클릭하고, 왼쪽의 새로운 "주제생성"을 클릭합니다.
저는 예전에 생성해놓은 주제가 있어서 가려놨습니다!
이제, "주제생성" 을 클릭하고 아래의 사진처럼 이름과 표시이름만 작성한 후 구독을 생성합니다.
자, 이렇게 주제가 생성되었습니다.
스크롤 다운하여 "구독생성"을 클릭하겠습니다.
이메일을 여러개 등록할 수으나, 저는 하나만 등록하겠습니다 :)
아래 사진처럼 작성 후 "구독생성"을 클릭합니다.
- 프로토콜: 이메일
- 엔드포인트 : 메일주소
구독을 생성하고나면, 이메일 주소로 인증메일이 옵니다. 인증을 완료해 주시면 아래와 같은 화면을 확인하실 수 있습니다.
여기까지 이번 단계가 완료되었습니다 :)
이번 단계에서 주제를 만들고 주제에 구독(이메일)을 연결하였습니다!
다음단계로 넘어가세요!!
● Code Commit 구성
아래 더보기를 활성화 하여 내용을 확인하세요 😎
이번 단계에서는 먼저 Codecommit 리포지토리를 생성하고, Cloud9을 이용해 코드를 Push합니다.
먼저, CodeCommit 콘솔로 이동합니다.
이제, "리포지토리 생성"을 클릭합니다.
리포지토리 생성 단계에서는 리포지토리의 이름만 넣고 "생성"버튼을 누르면 됩니다.
- 리포지토리 이름 : hol-myweb
리포지토리가 생성 완료된 페이지입니다.
오른쪽 상단의 URL복제를 클릭한 후 HTTPS URL을 복제합니다. (나중에 쓰니까 복사해서 어디 적어놓으세요)
리포지토리 생성이 완료되었습니다.
이제 Cloud9 콘솔로 접속합니다. 이번 단계에서는 Cloud9에 폴더를 생성하고, 코드를 다운받겠습니다 :)
아래 명령어 그대로 사용하실 수 있습니다.
# CodeCommit 리포지토리 복사
ec2-user:~/environment $ git clone https://git-codecommit.ap-northeast-2.amazonaws.com/v1/repos/hol-myweb
# 소스코드 다운로드
ec2-user:~/environment $ wget github.com/aws-samples/aws-codepipeline-s3-codedeploy-linux/raw/master/dist/aws-codepipeline-s3-aws-codedeploy_linux.zip
# 리포지토리 경로로 압축 해제
ec2-user:~/environment $ unzip aws-codepipeline-s3-aws-codedeploy_linux.zip ./hol-myweb/
# 로컬리포지토리 경로로 이동
ec2-user:~/environment $ cd hol-myweb/
# 변경된 파일 추가
ec2-user:~/environment/hol-myweb (master) $ git add *
# 변경된 파일 커밋
ec2-user:~/environment/hol-myweb (master) $ git commit -m "First Commit"
# 오리진 저장소로 코드 Push
ec2-user:~/environment/hol-myweb (master) $ git push -u origin master
여기까지 완료 되었다면, Code Commit 리포지토리에서 코드를 확인하실 수 있습니다 :)
이번 단계도 마무리 되었습니다. :-)
다음단계로 넘어가세요~!
● Code Pipeline 구성
아래 더보기를 활성화 하여 내용을 확인하세요 😎
이번 단계에서는 Code Pipeline을 구성하도록 하겠습니다 :)
먼저, CodePipeline 콘솔 접속 후 "파이프라인 생성"을 클릭합니다.
Pipeline 설정을 순서대로 해보겠습니다.
step.1 파이프라인 설정을 선택합니다. 여기에서는 이름만 설정해주고 나머지는 다 기본값으로 두고 넘어갑니다.
- 파이프라인 이름: hol-myweb
- 나머지 모두 Default!
Step2. 소스 스테이지, 소스 공급자를 선택합니다. 위에서 설정한 CodeCommit 리포지토리를 소스로 설정합니다.
- 소스공급자: AWS Code Commit
- 리포지토리 이름: hol-myweb
- 브랜치 이름: master
Step.3 빌드 스테이지 추가, 이 부분에서는 "빌드 스테이지 건너뛰기"를 클릭하여 다음으로 넘어갑니다.
"파이프라인에 빌드 스테이지가 포함되지 않습니다. 이 스테이지를 건너뛰시겠습니까?" 팝업창이 뜨면 "건너뛰기"를 클릭합니다.
Step4. 배포스테이지 추가, 이 단계에서는 배포 대상을 설정합니다.
- 배포공급자: AWS Elastic Beanstalk
- 리전: 아시아태평양(서울)
- 애플리케이션이름: hol-myweb
- 환경이름: HolMyweb-Beta
Step5. 검토단계입니다. :) 올바르게 정보가 들어갔는지 한번 더 검토 후 "파이프라인생성"을 클릭합니다.
파이프라인을 생성하면, 기본적으로 파이프라인이 동작합니다.
성공적으로 동작하면 아래와 같이 보입니다.
실제로 배포가 잘 되었는지 확인하겠습니다.
ElasticBeanStalk 콘솔에 접속하여 HoLMyweb-Beta 환경 URL을 클릭합니다.
축하합니다! 아래와 같이 페이지가 보인다면 성공입니다!
자, 이제 수동 승인절차와 승인 후 Production 까지 자동으로 배포되도록 구성해보겠습니다 :)
상단의 "편집" 버튼을 클릭합니다.
맨 아래쪽에 있는 "스테이지 추가"를 클릭합니다.
스테이지 이름을 작성하고 "스테이지 추가"를 클릭합니다.
작업 그룹 추가를 클릭합니다.
작업 이름과 작업내용을 아래와 같이 정의합니다.
- 작업이름: Approval
- 작업공급자: 수동승인
- SNS주제ARN: ~~Approval_Manager (위단계에서 만들었던 SNS주제)
- 검토할 URL: Elastic Beanstalk Beta 환경의 URL
- 설명: Beta Version is now available, please check this version and approve for production deploy.
아래와 같이 수동 승인 절차를 추가했습니다.
이제 마지막으로 Production 환경에 배포하도록 스테이지를 하나 더 추가합니다.
스크롤 다운하여 맨 아래쪽에 있는 "스테이지 추가"를 클릭합니다.
스테이지 이름을 입력하고 "스테이지 추가"를 클릭합니다.
-스테이지 이름: Production_Deploy
이후, "작업 그룹 추가" 를 클릭합니다.
아래와 같이 작성 후 "완료"를 클릭하여, 마지막 단계 설정을 마무리 합니다.
- 작업이름: Production_Deploy
- 작업공급자: AWS Elastic Beanstalk
- 리전: 아시아태평양 (서울)
- 입력 아티펙트: SourceArtifact
- 애플리케이션 이름: hol-myweb
- 환경이름: HolMyWeb-Production
오른쪽 위의 "저장"버튼을 눌러 변경사항을 저장합니다.
"저장"을 클릭합니다.
아래의 사진과 같이 4개의 단계로 파이프라인이 정의되었습니다. :)
이번 단계는 마무리 되었습니다. 다음단계를 진행해주세요!
● 배포 테스트 :)
아래 더보기를 활성화 하여 내용을 확인하세요 😎
드디어! 마지막 테스트 단계입니다!!!
이번 단계에서는 Cloud9에서 코드를 변경하고 CodeCommit 레포지토리에 Push하여 배포 파이프라인이 정상적으로 동작하는지 확인합니다.
먼저 Cloud9 콘솔에 접속합니다. hol-myweb/hol-myweb/index.html 파일을 더블클릭하고, 30번째 줄에 추가합니다;)
이후 ctrl+s 눌러 변경사항을 꼭 저장해주세요!
<h1>Congratulations!</h1>
<!-- Version 2 추가합니다! -->
<h1> Version 2 </h1>
<h2>You have successfully created a pipeline that retrieved this source application from an Amazon S3 bucket and deployed it
to three Amazon EC2 instances using AWS CodeDeploy.</h2>
index.html을 정상적으로 변경하셨다면 지금부터는 변경된 코드를 확인하고 Code Commit 리포지토리에 업로드 해보겠습니다!
# 로컬 리포지토리로 경로 변경
ec2-user:~/environment $ cd hol-myweb/
# 깃 상태 확인
ec2-user:~/environment/hol-myweb (master) $ git status
# 깃 변경사항 추가
ec2-user:~/environment/hol-myweb (master) $ git add index.html
# 깃 변경사항 커밋
ec2-user:~/environment/hol-myweb (master) $ git commit -m "version2"
# Code Commit 리포지토리로 Push
ec2-user:~/environment/hol-myweb (master) $ git push -u origin master
이제 Code Commit 콘솔로 이동해 리포지토리에 커밋되었는지 확인해봅니다.
Code Commit 콘솔로 이동 후 왼쪽 네비게이션바의 "커밋"을 클릭합니다.
version2가 정상적으로 커밋되었습니다.
이제, CodePipeline으로 이동하여 동작여부를 확인합니다.
아래 그림과 Version2 로 표기된 소스가 Deploy 되었고, 승인 대기중인 상태입니다.
이 상태가 되면, 아까 SNS에 등록되었던 이메일로 승인요청 이메일이 발송되어있습니다.
이메일을 확인해봅니다!
리뷰 페이지도 확인해봅니다! 정상적으로 Version2가 보입니다!!
저는 브라우저 캐싱때문에 시크릿창 하나 더 열어서 URL 테스트 했습니다 :)
혹시 정상적으로 Version2가 보이지 않는다면 브라우저 캐싱이 되지 않는 시크릿모드로 실행시켜봅시다!
Beta 버전이 정상적으로 업데이트 된것을 확인했으니, 이제 승인합니다.
이제 Production 에도 Deploy를 시작합니다.
조금 기다리면 Production_Deploy가 완료됩니다.
이제 Production 환경의 URL을 통해 정상적으로 완료 되었는지 확인합니다.
이제 모든 실습을 마무리 했습니다 :)
이 실습 뒤에도 ElasticBeanStalk 자체에 대한 실습이나 (ebextentions), CICD Pipeline에 대해 더 공부하시면 좋겠습니다 :)
수고하셨습니다!