ysuekkom의 IT study note

[AWS Cloud] EC2 자동 빌드/배포하기-Code Deploy CI/CD 따라하기 본문

Cloud Service/AWS

[AWS Cloud] EC2 자동 빌드/배포하기-Code Deploy CI/CD 따라하기

ysuekkom 2023. 5. 14. 18:30

 

EC2나 온프레미스 서비스에서 AWS CodeDeploy를 사용하려면, Code Deploy Agent 설치가 필요하다. 즉 관리형 컨테이너 서비스인 AWS ECS나 Lambda를 사용하여 배포할 경우, 에이전트는 필요하지 않다. 

에이전트를 설치하면 구성파일은 EC2에서 에이전트 작동 방식을 지정하는데 사용되며, Code Deploy에서 사용할 디렉터리 및 기타 설정을 지정한다.  CodeDeploy Agent 지원 운영체제와 설치될 파일에 대한 정보는 공식 문서에서 확인 가능하다. 

 

에이전트 설치는 두 가지 방법이 있다. 

1. AWS System Manager를 사용하여 CodeDeploy Agent설치

2. 명령줄을 사용하여 설치

 

 에이전트의 설치 및 업데이트를 위해 권장되는 방법은 AWS System Manager를 사용하여 설치하는 것이다. 하지만 본 포스팅에서는 명령줄로 간단하게 설치해 보도록 하겠다. AWS System Manager를 사용하여 설치하는 방법은 이곳을 참조하면 된다.

아래에서 수행할 실습 내용은 Amazon Linux에 에이전트를 설치하는 방법으로 진행되며, OS별 Code Deploy Agent설치 방법은 공식문서 사용설명서에서 본인의 OS에 맞는 설치방법을 참조해서 진행하면 된다.

 

실습은 다음단계로 진행된다.

1. 기본환경 셋팅하기(IAM 역할 생성-EC2용, 어플리케이션 그룹용

2. EC2 생성하기(IAM 역할 연결하기) - CodeDeployAgent 설치하기

3. 사용자 추가하기(배포용)

4. CodeDeploy를 사용하여 어플리케이션 생성 후, S3 버킷 생성하여 push하기

5. 배포 그룹 생성하여 연결 후, 배포 생성하기

6. CodeDeploy 배포 테스트 

 

 

실습 할 내용을 간단하게 도식화하면 아래와 같다. 로컬에서 소스코드를 수정하여 배포하는 사용자(aws_cd_user)가 배포용 EC2에 접근하여 S3로 파일을 push한다. AWS CodeDeploy에서 배포그룹과 배포 생성을 통해 해당 S3에서 appsepc.yml과 index.html을 참조하여 배포를 진행한다. 완전한 배포 자동화 파이프라인 구축 실습은 추후 진행하고, 본 포스팅에서는 CodeDeploy를 활용한 배포 실습을 진행한다. 

 

 


 

1. 기본 환경 세팅하기 -IAM role(EC2, 애플리케이션 그룹용) 생성하기

로컬에서 개발 및 작업 후, EC2-S3를 통해 새로운 버전의 코드를 배포하기 위한 사용자 추가 작업(user IAM 정책 부여하기)

 

>>EC2용 IAM role 생성하기

IAM > 역할 > 역할생성 > AWS 서비스 > 사용사례 EC2 > 생성 및 정책 연결하기

role name: aws_code_deploy_role

policy: AWSCodeDeployFullAccess, AmazonS3FullAccess

>>EC2용 IAM role 생성 결과 확인

 

 

>>Application group용 IAM role 생성하기

IAM > 역할 > 역할생성 > AWS서비스 > 다른 AWS 서비스 사용사례: CodeDeploy > CodeDeploy 선택 > 생성 및 정책 연결하기

role name: codedeployROLE

policy: AWSCodeDeployRole

>>애플리케이션 그룹용 IAM role 생성 결과 확인

 

>>IAM 역할 생성 결과

 

 

 

 

2. EC2 생성 후 IAM role 연결하기 -CodeDeployAgent 설치

name & tag: aws_cd/ key(AppName), Value(awsApp)

키 페어 이름: aws_code_deploy

vpc생성(서브넷 설정 없음)

EIP 활성화

inbound rule: ssh/port22/사용자지정 0.0.0.0, http/port80/사용자지정 0.0.0.0, ::/0

IAM 인스턴스 프로파일: aws_code_deploy_role(위에서 만들었던 EC2용 IAM 인스턴스 파일 설정)

 

>>EC2로 접속하기

yum update
yum install ruby
yum install wget

 

>>wget을 이용하여 CodeDeployAgent 설치하기

wget https://aws-codedeploy-ap-northeast-2.s3.amazonaws.com/latest/install

다운로드한 파일의 실행권한 부여하기 

chmod +x install

인스톨 파일 실행하기

sudo ./install auto

CodeDeployAgent 설치 완료 후, 확인하기

sudo service codedeploy-agent status

이로써 기본 환경 세팅 끝!

 

 

 

 

3. [사용자 추가히기] 로컬 머신에서 개발 후, S3로 업로드 > CodeDeploy가 배포할 수 있는 환경 만들기

 

>>사용자 추가하기

IAM > user > User Create 

user name: aws_cd_user

권한 옵션: 기존 정책 직접 연결> AWSCodeDeployFullAccess, S3FullAccess 2개 부여

>>액세스키 생성(tag: aws_cd_user) 후 ec2 터미널에서 aws configure 작업 수행

 

**Code Deploy와 AppSpec 파일

 애플리케이션 사양 파일(AppSpec file)은 CodeDeploy에서 배포를 관리하는 데 사용하는 yaml or json형식의 파일이다.

 일련의 수명 주기 이벤트 hook으로 각 배포를 담당하는 단계에서 사용된다. 애플리케이션이 EC2/온프레미스 컴퓨팅 플랫폼을 사용하는 경우 appspec file의 이름은 appspec.yml 또는 appspec.yaml이다.  이때, 애플리케이션 소스 코드 디렉터리 구조의 루트에 배치해야 한다. 그렇지 않으면 배포에 실패하게 된다.

 

 >AppSpec 파일의 예

version: 0.0
os: linux
files:
  - source: /index.html
    destination: /var/www/html
hooks:
  BeforeInstall:
    - location: scripts/install_dependencies.sh
      timeout: 300
      runas: root
  AfterInstall:
    - location: scripts/start_server.sh
      timeout: 300
      runas: root
  /*
  ApplicationStart:
    - location: scripts/start_server.sh
    - location: scripts/create_test_db.sh
      timeout: 300
      runas: root
  */
  ApplicationStop:
    - location: scripts/stop_server.sh
      timeout: 300
      runas: root

>files: 인스턴스 내에서 특정 파일을 어디에 복사할지 경로 설정

>hooks: 각 단계별 수행할 쉘 스크립트 지정

자세한 Appspec 파일 구조에 대한 설명은 공식문서를 참고하면 된다. 각 배포 방법 별 섹션에 대한 설명까지 확인할 수 있다.

 

 

 

 

4. 애플리케이션 생성 및 S3 버킷 만들기(애플리케이션 버전별 업로드 할) 

bucket name: aws-codedeploybucket

 

>>터미널 접속

codedeploy를 사용해서 애플리케이션 생성하기

aws deploy create-application --application-name mywebapp

어플리케이션 이름 명시(mywebapp), 해당파일을 내가 지정한 S3 버킷에 올리기(push): 압축해제 후, 해당 경로에서 명령어 수행

aws deploy push --application-name mywebapp --s3-location s3://aws-codedeploybucket/webapp.zip --ignore-hidden-files

매니지먼트 콘솔에서 S3 버킷(aws-codedeploybucket)에 push 내용 확인

 

>>CodeDeploy 애플리케이션으로 이동하여 mywebapp 애플리케이션이 잘 생성됐는지 확인하기

aws deploy create-application --application-name mywebapp 결과 확인

>>S3 bucket과 CodeDeploy 연결, S3 bucket에 업로드되는 파일을 배포할 수 있는 기능 구현 완료

 

 

 

 

5. 배포 생성하기(배포 그룹 생성 > 배포 생성)

>>배포그룹 생성하기(배포 전 반드시 선행되어야 하는 단계로 Host를 생성하여 CodeDeploy에 배포할 수 있는 역할을 담당하는 매개체) 

개발자도구 > CodeDeploy > 애플리케이션 > 생성한 어플리케이션 선택 > 배포그룹 생성하기

 

배포 그룹 이름: aws_deploy_group

서비스 역할: 애플리케이션 그룹용 역할로 생성했던 CodeDeploy IAM role(IAM role name: codedeployROLE) 연결해 주기.

배포 유형: 현재 위치 or 블루/그린 배포 중 선택

(현재 실습에서는 첫 배포이고, 인스턴스가 1개이기 때문에 현재 위치로 선택

블루/그린 배포의 경우 새로운 환경에서 새로운 버전을 적용 후, 문제없을 때 기존 버전을 지우는 형식으로 안정성을 더 가져갈 수 있음)

환경 구성 선택

태그 그룹: 정의했던 Key와 Value 선택(AppName/awsApp)(EC2 인스턴스 정보 내 태그 확인)

AWS Systems Manager를 사용한 에이전트 구성: 이미 설치된 상태이고, 업데이트 일정을 예약할 필요 없는 상태(여러 개 사용할 경우, 지금 업데이트 및 업데이트 일정 예약 선택 권장)

배포 설정: HaltAtATime 혹은 OneAtATime이 권장되지만 본 실습에서는 한 번에(AllAtOnce) 배포하는 것으로 구성

로드밸런서 설정 선택: 권장은 활성화지만 현 실습에서는 비활성화 무방

고급선택 사항에서 트리거, 경보, 롤백, 배포 그룹 태그 설정 가능

 

 

>>배포그룹 생성 완료

 

>>배포 생성하기

CodeDeploy > 배포 > 애플리케이션 > 설정 > 배포 그룹선택 > 배포 생성

배포설정이 잘 되어있는지 확인

배포 그룹: aws_deploy_group

컴퓨팅 플랫폼: EC2/온프레미스

배포 유형: 현재 위치

개정 위치: 지정한 S3인지 확인(aws-codedeploybucket)

추가 배포동작: 배포 도중 같은 이름의 파일이 있을 때 동작 설정 세팅(현 실습에서는 디폴트로 둠)

 

>배포 생성 결과: 성공 

 

 

>>EC2 인스턴스 EIP로 접속 시 웹페이지 확인 가능

 

 

 

 

6. CodeDeploy 배포 테스트하기 

appspec.yml 파일/ index.html 파일 수정하여 S3에 업로드 후 CodeDeploy를 활용하여 자동 배포하기.

index.html 파일 수 정 후, S3로 push하기

aws deploy push --application-name mywebapp --s3-location s3://aws-codedeploybucket/webapp.zip --ignore-hidden-files

 

>>S3 버킷에 업데이트 확인

 

 

>>CodeDeploy로 가서 배포 생성하기

>개발자 도구 > CodeDeploy > 애플리케이션 > mywebapp > aws_deploy_group > 배포 생성 > 개정위치 S3 버킷 업데이트된 S3 선택하고 배포 만들기 > EC2 EIP로 주소창 접속 시, 업데이트 된 결과 확인 가능

 

>>html파일 수정 반영된 배포 결과 확인 

 

 

이로써 AWS CodeDeploy를 통해 배포하는 실습을 완료하였다. 

간단한 실습이지만 처음 진행할 경우, 헷갈릴 수 있으니 전체적인 순서를 리마인드 후 필요한 세팅을 진행하여 따라해보자.

다음 실습은 CodePipeLine을 만들어 실질적인 배포'자동화'를 진행해보겠다.

 

 

 

https://docs.aws.amazon.com/ko_kr/codedeploy/latest/userguide/codedeploy-agent-operations-install-linux.html

https://be-developer.tistory.com/51

https://docs.aws.amazon.com/ko_kr/codedeploy/latest/userguide/reference-appspec-file.html#appspec-reference-server

https://docs.aws.amazon.com/ko_kr/codedeploy/latest/userguide/codedeploy-agent-operations-install-linux.html