자꾸 까먹어서 올려놓는 개발 일지

GitHub과 Node.js Express를 이용한 자동배포 환경 만들기(feat. AWS-EC2, AWS CodeDeploy, AWS CodePipeline) 2편 - 까먹는 개발자 본문

개발관련/AWS

GitHub과 Node.js Express를 이용한 자동배포 환경 만들기(feat. AWS-EC2, AWS CodeDeploy, AWS CodePipeline) 2편 - 까먹는 개발자

하루정도 2021. 4. 12. 18:26

2편에서는 AWS EC2에 CodeDeploy를 이용하여 배포하는 방법에 대해 알아보겠습니다.

 

https://aws.amazon.com/ko/

 

클라우드 서비스 | 클라우드 컴퓨팅 솔루션| Amazon Web Services

제조 AWS를 활용한 Siemens의 에너지, 의료 서비스, 제조 분야 혁신 Siemens가 AWS를 사용하여 어떻게 문화를 바꾸고 혁신을 장려하며 비즈니스 성과를 창출했는지 알아보세요. 자세히 알아보기  업종

aws.amazon.com

 

1. EC2 - IAM 역할 생성 및 적용

 

먼저 EC2에서 사용할 IAM 역할을 생성해야합니다. AWS IAM서비스로 이동하여 왼쪽 메뉴트리에 있는 역할 메뉴를 클릭합니다. 그리고 아래 [ 그림 1-1 ]에서 표시되어 있는 <역할 만들기>를 클릭합니다.

 

[ 그림 1-1 ] IAM -> 역할

 

역할만들기의 1페이지에서는 신뢰할 수 있는 유형의 개체 선택에서 default로 선택되어 있는 AWS 서비스가 클릭되어 있는 지 확인하고, 일반 사용 사례에서 EC2 항목을 선택한 후 다음 버튼을 누릅니다.

 

[ 그림 1-2 ] IAM - 역할 만들기 1페이지

 

역할만들기의 2페이지에서는 권한 정책을 검색하여 연결해주어야 합니다. 아래 3가지 항목을 검색해서 체크한 후 다음 버튼을 눌러주세요.

 

•AWSCodeDeployFullAccess

AmazonS3FullAccess

•AWSCodeDeployRole

•CloudWatchLogsFullAccess

 

[ 그림 1-3 ] IAM - 역할 만들기 2페이지 정책 선택

 

역할만들기의 3페이지에서는 사용할 임의의 키와 값을 입력합니다.

 

[그림 1-4 ] IAM - 역할 만들기 3페이지 - 키, 값 입력

 

마지막 역할만들기의 4페이지에서는 역할 이름, 역할 설명 및 2페이지에서 선택한 정책들이 나와있는 지 확인하고 <역할 만들기> 버튼을 눌러 완료하시면 됩니다.

 

[ 그림 1-5 ] IAM - 역할 만들기 4페이지 - 역할 이름 및 설명 정책확인

 

 

이렇게 만들어 둔 EC2에서 사용할 IAM 역할 만들기가 완료되었습니다. 이 역할을 적용하기 위해 EC2 대시보드로 이동합니다.

EC2 리스트가 보이면 해당 인스턴스에서 마우스 우클릭을 하면 다음과 같은 메뉴가 보입니다. <보안 -> IAM 역할 수정> 을 클릭합니다.

 

[ 그림 1-6 ] EC2 대시보드 - IAM 역할 수정

 

IAM 역할 수정 페이지에서 IAM 역할 선택 드롭다운을 누르면 아까 전에 만든 <node-deploy-pipe-ec2-role>이 보입니다. 이것을 선택하고 저장 버튼을 누릅니다.

 

[ 그림 1-7 ] EC2 IAM 역할 수정

 

 

다시 EC2 대시보드 리스트로 돌아와서  해당 인스턴스를 선택하고 아래 보안 탭을 누르면 방금 전 수정한 역할이 반영되어 있는 것을 확인할 수 있습니다.

 

[ 그림 1-8 ] EC2 대시보드 - 보안 탭

 

EC2 역할 지정에 관해서는 최초에 EC2를 생성할 때 지정할 수도 있습니다. 다만 이미 EC2를 먼저 생성한 경우가 대부분이라 생각하기 때문에 이번에는 이미 만들어진 인스턴스의 역할을 수정하는 방식으로 진행했습니다.

 

 

2. CodeDeploy 역할 및 애플리케이션 생성

 

EC2의 역할은 이미 적용했으니 CodeDeploy에 적용할 역할도 만들어야 합니다. 다시 IAM 서비스 페이지로 이동해서 역할 만들기 버튼을 누릅니다.

 

[ 그림 2-1 ] IAM -> 역할

 

 

역할 만들기 1페이지에서 AWS 서비스, 일반 사용 사례에서 CodeDeploy, 아래 쪽 사용 사례 선택에서 CodeDeploy를 선택하고 다음 버튼을 누릅니다.

 

[ 그림 2-2 ] IAM - 역할 만들기 1페이지

 

역할 만들기 2페이지에서는 따로 검색하지 않고 default로 선택되어 있는 AWSCodeDeployRole을 확인할 수 있습니다. 다음 버튼을 누릅니다.

 

[ 그림 2-3 ] IAM - 역할 만들기 2페이지

 

 

역할 만들기 3페이지에서는 사용할 임의의 키와 갑을 입력하고 다음 버튼을 누릅니다.

 

[ 그림 2-4 ] IAM - 역할 만들기 3페이지

 

역할 만들기 4페이지에서는 역할 이름, 역할 설명 및 정책에 <AWSCodeDeployRole>이 선택되어 있는 지 확인 후 완료 버튼을 누릅니다.

 

[ 그림 2-5 ] IAM - 역할 만들기 4페이지

 

이렇게 CodeDeploy 배포 생성 시 사용할 역할 만드는 것을 완료했습니다. 이제 AWS 서비스의 CodeDeploy로 들어갑니다.

왼쪽 메뉴 트리에 있는 배포 > 시작하기 > 애플리케이션 생성 버튼을 누릅니다.

 

[ 그림 2-6 ] CodeDeploy - 배포 생성

 

 

사용할 애플리케이션 이름 입력 및 컴퓨팅 플랫폼 - EC2/온프레미스를 선택한 후 <애플리케이션 생성> 버튼을 눌러 완료합니다.

 

[ 그림 2-7 ] CodeDeploy - 애플리케이션 생성

 

 

애플리케이션이 생성되면 다음과 같은 페이지로 이동합니다.

 

[ 그림 2-8 ] CodeDeploy - 배포 > 애플리케이션 세부정보

 

CodeDeploy 애플리케이션 생성이 완료되었습니다.

 

 

3. CodeDeploy Agent 사용자 추가 및 설치

 

1, 2번 항목에서는 EC2와 CodeDeploy 각각의 항목에 대해서만 설정 및 생성을 했습니다. 이번에는 CodeDeploy에서 발생한 이벤트를 EC2가 수신할 수 있도록 CodeDeploy Agent를 설치합니다.

 

우선 사용자 추가를 위해 IAM 서비스의 그룹 페이지로 이동해서 <새로운 그룹 생성> 버튼을 누릅니다.

 

[ 그림 3-1 ] IAM - 그룹

 


그룹 이름을 입력하고 다음 버튼을 누릅니다.

[그림 3-2 ] IAM - 그룹 생성 단계 1

 

 

정책 연결에서는 아무것도 선택하지 않습니다. 추가로 인라인 정책을 입력하여 진행하겠습니다.

 

[ 그림 3-3 ] IAM - 그룹 생성 단계 2

 

마지막 검토 화면에서 입력한 정보들을 확인 후 그룹 생성 버튼을 눌러 완료합니다.

 

[ 그림 3-4 ] IAM - 그룹 생성 단계 3

 

단계 2 - 정책 연결을 생략했기 때문에 생성한 그룹을 클릭하여 권한 - 인라인 정책 생성을 클릭합니다.

 

[ 그림 3-5 ] IAM - 선택 그룹 세부정보

 

그룹 권한 설정에서 사용자 지정 정책 라디오 버튼을 선택하고 우측에 <선택> 버튼을 누릅니다.

 

[ 그림 3-6 ] IAM - 그룹 권한 설정

 

<선택> 버튼을 누르면 정책 검토 편집기가 나옵니다. 여기서 사용할 임의의 정책 이름을 입력하고, 정책 문서에 다음 코드를 복사하여 붙여넣은 후 <정책 적용> 버튼을 눌러 완료합니다.

 

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "autoscaling:*",
                "codedeploy:*",
                "ec2:*",
                "lambda:*",
                "elasticloadbalancing:*",
                "s3:*",
                "cloudwatch:*",
                "logs:*",
                "sns:*"
            ],
            "Resource": "*"
        }
    ]
}

 

[ 그림 3-7 ] IAM - 정책 검토

 

정상적으로 정책이 적용되었다면 아래와 같이 권한 탭에 방금 생성한 정책 이름이 추가된 것을 확인할 수 있습니다.

 

[ 그림 3-8 ] IAM - 그룹 세부정보 > 권한 탭

 

 

다음 단계로 방금 생성한 <node-deploy-pipe-group> 그룹에 사용자를 추가해야 합니다. 아직 사용자를 만들지 않았기 때문에 먼저 왼쪽 메뉴트리의 사용자를 클릭하고 <사용자 추가> 버튼을 누릅니다.

 

[ 그림 3-9 ] IAM - 사용자 추가

 

 

사용자 추가 단계 1에서는 사용자 이름과 AWS 액세스 유형을 선택합니다.

 

[ 그림 3-10 ] IAM - 사용자 추가 단계 1

 

 

사용자 추가 단계 2에서는 그룹에 사용자 추가를 클릭하고 위에서 생성한 <node-deploy-pipe-group>를 선택합니다.

 

[ 그림 3-10 ] IAM - 사용자 추가 단계 2

 

 

사용자 추가 단계 3에서는 사용할 임의의 키와 값을 입력합니다.

[ 그림 3-11 ] IAM - 사용자 추가 단계 3

 

사용자 추가 단계 4에서 앞서 입력한 정보들이 제대로 되었는 지 확인 후 생성 버튼을 누릅니다.

[ 그림 3-12 ] IAM 사용자 추가 단계 4

 

 

생성이 완료되면 액세스 키 ID 및 비밀 액세스 키가 표시되고, 이 정보들을 .csv파일로 다운로드 받을 수 있는 화면이 나옵니다. 이 화면은 다시 나오지 않기 때문에 반드시 .csv을 다운로드 받아두시길 바랍니다.

 

이렇게 정상적으로 CodeDeploy에서 사용할 사용자 생성이 완료되었습니다.

 

 

이제 EC2에 원격 접속하여 CodeDeploy Agent를 설치해보겠습니다.

 

•awscli 설치

sudo apt install awscli

 

•aws configure 설정

sudo aws configure

AWS Access Key ID [None]: 다운로드 받은 .csv파일에서 Access key ID 항목 입력

AWS Secret Access Key [None]: 다운로드 받은 .csv파일에서 Secret access key 항목 입력

Default region name [None]: ap-northeast-2

Default output foramt [None]: json

 

•agent 설치파일 다운로드

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

 

•agent 설치파일 권한 추가

chmod +x ./install

 

•ruby 설치 ( agent 설치에는 ruby가 필요합니다)

sudo apt-get install ruby

 

•agent 설치

sudo ./install auto

 

• agent 설치확인

sudo service codedeploy-agent status

 

[ 그림 3-13 ] codedeploy-agent 실행중

•인스턴스 부팅 시 codedeploy-agent 자동시작

sudo vim /etc/init.d/codedeploy-startup.sh
#!/bin
sudo service codedeploy-agent restart

 

•스트립트 파일 실행권한 추가

sudo chmod +x /etc/init.d/codedeploy-startup.sh

 

이렇게 CodeDeploy Agent 사용자ㅑ 추가 및 설치 작업이 완료되었습니다.

 

 

4. 프로젝트 설정

 

우리는 1편(https://ookm1020.tistory.com/4)에서 이미 프로젝트를 배포한 바 있습니다. 따라서 프로젝트의 설치 과정은 생략합니다.

 

프로젝트의 root 경로에 아래 내용을 포함한 파일을 하나 생성합니다. 저는 이미 1편에서 git pull을 받아 프로젝트를 구성했기 때문에 로컬에서 작업 -> GitHub push -> EC2 pull 형식으로 반영했습니다.

 

•appspec.yml 파일추가

version: 0.0
os: linux
files:
  - source:  /
    destination: /home/ubuntu/build/

 

CodeDeploy가 배포하게 될 위치를 build폴더로 잡아두었기 때문에 해당 경로에 build 폴더를 생성합니다.

 

•build 폴더 생성

mkdir /home/ubuntu/build

 

이것으로 프로젝트 설정은 완료되었습니다.

 

 

5. CodeDeploy 배포 생성

 

EC2 생성 및 설정, CodeDeploy 애플리케이션 생성 및 IAM 설정까지 모든 준비가 완료되었습니다. 남은 작업은 EC2와 CodeDeploy를 연결해주는 일만 남았습니다. 조금만 더 힘내시기 바랍니다.

 

배포 생성에 앞서 기존에 생성한 EC2의 태그를 설정합니다. 이를 설정하는 이유는 배포 생성 시 CodeDeploy가 인스턴스를 식별할 때 이 태그를 이용하기 때문입니다. 물론 인스턴스 생성 시 설정할 수도 있지만, 우리가 진행하는 과정에서는 설정하지 않고 넘어갔기 때문에 지금 설정하는 것입니다.

 

AWS 서비스의 EC2 대시보드로 이동해 해당 인스턴스를 클릭하면 하단에 세부정보가 나오는데 그 중 태그 탭을 누릅니다.

 

[ 그림 5-1 ] EC2 - 대시보드 - 인스턴스 상세정보

 

태그 관리 버튼을 클릭하여 들어가면 태그를 입력할 수 있는 창이 나오고 사용할 임의의 키와 값을 입력한 후 저장하면 됩니다.

 

 

[ 그림 5-2 ] EC2 - 인스턴스 태그 관리

 

 

태그 설정이 끝났다면 다시 AWS 서비스의 CodeDeploy 페이지로 이동합니다.

 

CodeDeploy 애플리케이션은 이미 생성해두었습니다. 리스트에서 클릭합니다.

 

[ 그림 5-3 ] CodeDeploy - 애플리케이션 목록

 

 

애플리케이션의 상세화면에서 배포 그룹 생성을 클릭합니다.

 

[ 그림 5-4 ] CodeDeploy - 애플리케이션 상세정보

 

배포 생성화면에는 다양한 설정들이 있습니다. 우리는 기초적으로 필수적인 부분만 변경하도록 하겠습니다.

 

배포 그룹 이름과, 서비스 역할을 선택합니다. 서비스 역할은 앞서 IAM 서비스에서 CodeDeploy용으로 만들었는데 해당 태그 값이 리스트를 클릭하면 노출됩니다.

[ 그림 5-5 ] CodeDeploy - 배포 그룹 생성

 

배포유형은 Default 그대로 현재 위치를 선택합니다.

[ 그림 5-6 ] CodeDeploy - 배포 그룹 생성

 

환경 구성은 Amazon EC2 인스턴스를 체크하고, 위에서 EC2 인스턴스의 태그 값을 입력해놓았기 때문에 입력창을 클릭하면 리스트로 해당 인스턴스의 태그 값이 노출됩니다. 만약 리스트에 보이지 않는다면 다시 한 번 EC2 인스턴스의 태그 값을 확인하시길 바랍니다.

[ 그림 5-7 ] CodeDeploy - 배포 그룹 생성

 

로드 밸런서는 필수 값은 아니지만, 저는 일부러 비활성화를 해둔 상태입니다.

[ 그림 5-8 ] CodeDeploy - 배포 그룹 생성

 

 

배포 그룹 설정을 다 했다면 생성 버튼을 눌러 완료합니다.

완료했다면 다음과 같은 화면이 나올텐데 여기서 배포 생성 버튼을 누릅니다.

 

[ 그림 5-9 ] CodeDeploy - 애플리케이션 상세정보

 

 

배포 설정에서는 <애플리케이션을 GitHub에 저장> 항목을 선택합니다.

선택 후에는 GItHub과 계정을 연결해야 하는데, 미리 연결해둔 GitHub의 계정이 리스트에 노출됩니다.

처음 하시는 거라면 <GitHub 토큰 이름> 항목 아래에 있는 설명처럼 계정을 입력하면 <GitHub에 연결> 버튼이 활성화 되는데 이를 눌러 OAuth2 인증 절차를 거치면 연동이 됩니다.

 

그 다음 연동할 저장소의 이름을 입력하고 배포를 하고 싶은 커밋 ID를 입력하시면 됩니다.

[ 그림 5-10 ] CodeDeploy - 배포 설정

 

 

추가 배포 동작 설정에서는 배포 실패를 선택한 후 배포만들기를 눌러 완료하시면 됩니다.

[ 그림 5-11 ] CodeDeploy - 배포 설정

 

 

배포가 정상적으로 이루어지면 다음과 같이 화면에서 배포 성공이라는 문구를 확인할 수 있습니다.

 

[ 그림 5-12 ] CodeDeploy - 배포 성공

 

원격 접속을 하면 appspec.yml에서 지정한 경로에 성공적으로 배포가 되었음을 확인할 수 있습니다.

 

build 폴더로 이동해서 프로젝트를 실행하겠습니다.

 

cd build

npm install

npm start

 

브라우저를 통해 인스턴스의 IP 및 DNS로 접속을 하면 성공적으로 프로젝트가 실행됐음을 확인할 수 있습니다.

 

고생하셨습니다. 👏👏 👏 

 

하지만 여기까지 한 것만으로는 저장소가 업데이트 되었을 때, 자동적으로 CodeDeploy가 EC2에 코드를 업데이트 해주지 않습니다. 이것을 하기 위해서는 CodePipeline을 이용해서 해결이 가능합니다.

 

CodePipeline은 3편에서 이어서 설명하도록 하겠습니다. 긴글 읽어주셔서 정말 감사합니다.

 

이 글은 jojoldu.tistory.com/281?category=777282 을 참고하여 작성되었습니다 :)

 

1) AWS로 배포하기 시리즈 - 1. Code Deploy 사용하기

AWS로 전체 시스템 구축해야 할 일이 생겨 AWS 배포 환경 시리즈를 시작합니다. 시리즈 과정은 CodeDeploy -> Code Pipeline -> ELB & Auto Scaling Group -> Beanstalk 으로 진행될 예정입니다. 저는 아래와 같은..

jojoldu.tistory.com

Comments