본문 바로가기

Github Actions AWS EC2 Code Deploy 예제 1 (이전 완료)

github actions를 사용하여 EC2 인스턴스에 자동으로 배포 하게되는 플로우 입니다.

 

전체 진행은 다음과 같습니다.

  1. github actions는 이벤트(Pull Request, Push 등) 를 통해 workflow를 실행
  2. workflow는 EC2로 배포된 파일을 S3로 저장합니다.
  3. workflow는 CodeDeploy를 통해 2. 에서 저장한 파일을 EC2로 배포합니다.
  4. (선택) CodeDeploy는 배포가 완료된 이후 스크립트를 실행합니다.

 

이 포스팅 에서는 AWS에서 해줘야 하는 세팅에 대해 다룹니다.

 

1. IAM 설정

IAM이란 리소스의 액세스를 제어해주기 위한 서비스로써, 리소스에게 권한을 주어 해당 리소스가 접근할 수 있는 다른 리소스들을 제어할 수 있게 합니다.

What is IAM

 

IAM이란 무엇입니까? - AWS Identity and Access Management

이 페이지에 작업이 필요하다는 점을 알려 주셔서 감사합니다. 실망시켜 드려 죄송합니다. 잠깐 시간을 내어 설명서를 향상시킬 수 있는 방법에 대해 말씀해 주십시오.

docs.aws.amazon.com

이번 튜토리얼에서는 사용자, 그룹, 역할을 사용하게 됩니다.

 

1.1 사용자

IAM 사용자는 AWS 자원에 접근할 수 있는 사용자로써 자신에게 주어진 권한 만큼의 자원만 접근할 수 있습니다. 

ex) S3에 대한 읽기권한만 주어진 사용자는 S3에 대해 읽기 권한만 가지게 되고, S3에 대한 쓰기와 EC2에 대한 접근은 할 수 없습니다.

 

1.2 그룹

사용자들의 권한을 그룹핑 하기 위한 컬렉션으로써, 해당 그룹에 소속된 사용자는 해당 그룹의 권한을 가지게 됩니다.

 

1.3 역할

역할은 자원끼리 권한이 필요한 경우 사용하게 되는 서비스 입니다.

EC2가 S3에 접근하기 위해선 EC2는 S3에 접근할 수 있는 권한이 필요하게 되며 이때 EC2에 S3로 접근이 가능한 역할을 부여하게 해주면 EC2는 S3에 접근이 가능해지게 됩니다.

 

1.4 정책

일종의 권한 집합 입니다. S3에대한 접근과, CodeDeploy에 대한 접근이 필요한 경우 두 권한을 묶은 정책 하나를 만들어 사용할 수 있습니다.

 


2. IAM 역할 만들기

2.1 EC2 역할 생성

이번 튜토리얼에서는 AWS EC2가 S3에 접근해야 하므로, EC2는 S3에 접근할 수 있는 권한을 부여해 줘야 합니다.

 

대시보드의 IAM설정 페이지로가, 역할만들기를 통해 역할을 만들어줍니다.

IAM 역할 만들기
IAM 역할 만들기

이후 S3FullAccess 정책을 연결해 줍니다.

S3FullAccess 정책 연결

이후 이름등을 설정하면 EC2를 위한 역할이 완성되게 됩니다.

 

EC2 S3 접근 역할

 

 

2.2 CodeDeploy 역할 생성

CodeDeploy가 사용할 역할또한 생성해 줍니다.

사용사례 : CodeDeploy

CodeDeploy로 역할을 만들게 되면 정책이 지정되어 있어 그대로 생성하면 됩니다.

Default 정책 사용

이후 이름을 설정 후 역할 생성을 마무리 합니다.

 

CodeDeploy Role


3. IAM 사용자 만들기

EC2에 코드를 배포할 ec2 사용자를 만듭니다.

해당 사용자는 code deploy agent를 사용하기 위해 만듭니다.

 

IAM의 사용자탭으로 가서 사용자 추가를 해줍니다.

IAM 사용자 추가

이후 다음 권한들을 연결해 줍니다.

  • AmazonEC2FullAccess
  • AmazonS3FullAccess
  • AWSCodeDeployFullAccess
  • AWSCodeDeployRole

권한을 연결해 주었으면 내용을 확인하고 사용자를 생성합니다

사용자 추가 검토

 

이후 생성된 사용자의 정보가 담긴 csv파일을 반드시 다운로드 합니다.

IAM  사용자의 csv 파일


4. EC2 인스턴스 생성

이제 해당 역할을 가지는 인스턴스를 만들어 보겠습니다.

EC2 탭에 가서 새로운 인스턴스를 만듭니다.

4.1 AMI 선택 

사용할 이미지를 선택합니다.

QuickStart -> Ubuntu -> Ubuntu20.04 선택

ubuntu 20.04 이미지 선택

 

 

4.2 인스턴스 유형

인스턴스 유형으로는 프리티어 사용가능한 t2.micro로 선택합니다.

t2.micro 선택

 

4.3 키페어 생성

인스턴스에 접근할 키페어를 선택합니다. 

ssh로 접근하기 위해 pem키를 생성후, 키 정보를 다운로드 합니다.

키페어 생성
다운로드한 pem키

 

4.4 IAM 역할 설정

2.1 에서 만든 ec2 역할을 인스턴스 프로파일로 설정합니다.

인스턴스 프로파일 설정

4.5 태그 설정

다음과 같이 쉽게 알아볼 수 있는 태그를 붙여줍니다.

name : deploy-target으로 태그 생성

 

4.6 인스턴스 내에서 작업. 

인스턴스 생성이 완료되었고, 이후 인스턴스 내에서 배포를 위한 작업을 실행합니다.

우선 인스턴스로 접근하기 위해 방금 만든 키를 사용합니다.

이때 키에 접근 권한이 높다면, permission 에러가 나므로 키의 접근 권한을 read권한까지만 부여해준후 다시 시도합니다.

4.6.1 read권한만 부여 

chmod 400 {다운로드한키.pem}
 

4.6.2 ssh 접속 

ssh -i {다운로드한키.pem} ubuntu@{hostIP}
접속 후 다음 접속을 위해  자신의 로컬 컴퓨터의 pub키를 등록합니다.
 

4.6.3 aws congifure

code deploy agent를 설치하기 위한 configure를 진행합니다.
우선 aws-cli를 설치합니다.

설치 가이드

curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip"
unzip awscliv2.zip
sudo ./aws/install

이후 aws configure를 진행합니다.

aws configure

 

Access Key ID와 Secret Access Key는 3. 에서 다운로드 받은 .csv에 있는 정보를 사용합니다.

 

4.6.4 code deploy agent 설치

설치 가이드

 

Ubuntu Server용 CodeDeploy 에이전트 설치 - AWS CodeDeploy

출력을 임시 로그 파일에 쓰는 것은 Ubuntu 20.04에서 install 스크립트를 사용하여 알려진 버그를 해결하는 동안 사용해야 하는 해결 방법입니다.

docs.aws.amazon.com

sudo apt-get update
sudo apt-get install wget ruby -y
wget https://aws-codedeploy-ap-northeast-2.s3.amazonaws.com/latest/install
chmod +x ./install
sudo ./install auto
sudo service codedeploy-agent status //상태 확인

 

 


5. S3, CodeDeploy 생성

 

workflow에서 배포되는 파일은 S3를 거쳐 CodeDeploy를 통해 EC2에 배포됩니다.

 

5.1 S3 생성

S3 생성

S3의 이름을 설정하고, 나머지 설정은 default로 둔채로 S3를 생성합니다.

 

5.2 Code Deploy

5.2.1 Code Deploy 애플리케이션 생성

Code Deploy 애플리케이션으로가 새 애플리케이션을 생성합니다.

컴퓨팅 플랫폼은 EC2/온프레미스로 설정합니다.

 

5.2.2 배포그룹 생성

생성한 애플리케이션으로가 새로운 배포그룹을 만듭니다.

 

새로운 배포그룹의 이름을 설정하고, 서비스 역할은 2.2 에서 생성한 역할을 사용합니다.

배포그룹 생성1

 

배포가 이루어지게 될 그룹을 설정하는 곳으로써, 4.5 에서 만든 태그를 사용하여 그룹을 지정합니다.

위 사진과 같이 "1개의 일치하는 고유한 인스턴스" 라는 문구가 나오게 됩니다.

배포그룹 환경 구성

 

 

배포 설정과 로드밸런서 설정은 다음과 같이 진행합니다.

배포설정

 

이후 배포 그룹을 생성합니다.

 

여기까지가 AWS 상에서의 설정입니다. 다음은 GitHub 설정을 알아보겠습니다.