AWS EC2와 Github Actions로 프론트엔드 배포해보기 (2)

윤상준·2022년 11월 23일
1

AWS

목록 보기
2/3
post-thumbnail

5. S3 생성

이제 S3를 생성할 차례이다.

S3는 Simple Storage Service 에서 S가 3개라서 S3로 불린다. Bucket이라는 이름을 사용하는데 이름에서도 알 수 있듯 파일을 저장할 수 있는 파일 서버 역할의 서비스이다. 어디서나 쉽게 데이터를 저장하고 불러올 수 있으며 파일 크기는 5TB까지 지원한다. 저장 공간은 무제한이다.

우리는 S3에 프로젝트 파일들을 저장해놓고 이걸 EC2라는 컴퓨터에서 실행시킬 것이다. 이때 S3에 있는 파일들을 EC2로 옮겨서 실행시키는 역할을 Code Deploy가 수행한다.

5-1. S3 생성

S3를 검색해서 들어가자.

버킷 만들기를 눌러서 S3 버킷을 생성한다.

이름, 지역 (리전), 소유권 설정

버킷 이름을 만들 때 주의할 점은 전역에서 고유해야 한다 는 것이다.
즉, 전 세계에서 유일한 이름이어야만 한다는 것이다.
나는 내 닉네임을 붙여서 작성했다.

리전은 필요한 곳으로 선택하자. 나는 서울로 했다.

객체 소유권은 권장 사항을 따라가자.

퍼블릭 액세스 설정

퍼블릭 액세스 차단 여부는 프로젝트 성격에 따라 다르다.

퍼블릭으로 오픈해놓으면 모든 사람이 이 S3 버킷 자체에 접근할 수 있다. 우리 S3에 저장된 파일 URL를 주소창에 입력하기만 하면 해당 파일에 접근이 가능하다는 것.

악의적으로 대량의 다운로드를 유도하여 비용을 발생시키는 등의 문제가 생길 수 있다.

이렇게 퍼블릭 액세스를 차단해놓으면 URL로 접근하려고 했을 때 이런 식으로 차단된다.

액세스 권한은 4개의 세부 조건이 있으니 각자 상황에 맞게 설정해주면 될 것 같다.

그 외 설정

버전 관리는 따로 하지 않겠다.

태그는 이전에 말했듯이 혹시 모르니까 하나 설정해주자.

암호화는 보안을 위해 설정해주는 것이 좋다.
다음과 같이 설정해주자.

이제 버킷 만들기를 눌러서 버킷을 생성하자.

잘 생성됐다.

들어가서 살펴보면 이렇게 생겼다.
업로드 버튼을 눌러서 파일 또는 폴더를 저장 할 수 있다.
그리고 이 S3에 접근해서 그 파일 또는 폴더를 다운로드 받을 수도 있다.

6. Code Deploy 생성

그 다음은 Code Deploy를 생성할 차례이다.
이 Code Deploy가 S3에 있는 파일들을 EC2로 옮겨서 실행시켜줄 것이다.

6-1. 애플리케이션 생성

Code Deploy를 찾아 들어가자.

그리고 왼쪽 패널에서 배포 -> 시작하기를 눌러서 들어간다.

그리고나서 애플리케이션 생성을 눌러 생성 화면으로 들어간다.

애플리케이션 이름은 임의로 설정하고, 컴퓨팅 플랫폼은 EC2/온프레미스로 선택한다.

6-2. 배포 그룹 생성

이제 우리가 만든 어플리케이션에서 배포 그룹을 생성해야 한다.

배포 그룹에서 이 Code Deploy가 S3에서 가져온 파일을 배포할 대상을 정할 수 있다. 지금 우리로 치면 아까 생성한 EC2가 그 대상이다.

따라서 여기다가 우리가 만든 EC2를 설정해주어야 한다.

다시 왼쪽 패널에서 애플리케이션을 찾아 들어간다.

여기서 배포 그룹 생성을 눌러서 생성 화면으로 들어간다.

그룹 이름 및 서비스 역할 설정

그룹 이름은 임의로 설정하자.

서비스 역할에서 우리가 1편에서 만들었던 Code Deploy용 IAM을 선택한다.

환경 구성

이제 우리의 EC2를 배포 그룹에 연결해야한다.

Amazon EC2 인스턴스를 선택하자.

태그를 통해서 연결해야 한다. (그래서 이전에 태그를 만들었던 것이다.)
키를 Name으로 하고 값을 눌러서 메뉴를 보면 EC2 인스턴스 목록이 뜰 것이다.

여기서 우리 EC2를 선택해주면 된다.
꼭 확인해야 할 것은 1개의 일치하는 고유한 인스턴스 이다.
우리가 배포하고 싶은 1개 이상의 인스턴스들이 전부 선택되었는지 확인하자.

그 외 설정

에이전트 구성은 설명에서 알 수 있듯 Code Deploy 에이전트를 정해진 빈도에 따라 업데이트하는 설정이다.

기본 세팅으로 하고 넘기자.

배포 설정은 이 Code Deploy 어플리케이션이 배포를 하는 방식에 대한 설정이다.

총 3개의 선택지가 있으며 필요에 따라 선택할 수 있다.

  • CodeDeployDefault.AllAtOnce : 한 번에 가급적 많은 수의 인스턴스에 배포
  • CodeDeployDefault.HalfAtATime : 최대 절반의 인스턴스 (분수는 반내림) 에 한번에 배포
  • CodeDeployDefault.OneAtATime : 한 번에 한 인스턴스에만 배포

나는 AllAtOnce로 했다.

로드 밸런서는 설명에서 알 수 있듯이 배포가 진행되는 동안 트래픽을 차단했다가 배포 후 트래픽을 허용하여 트래픽의 균형을 맞추는 작업이다.

지금은 필요하지 않을 것 같아 비활성화했다.

그리고나서 배포 그룹 생성을 눌러서 설정을 완료한다.

잘 생성되었다.

이제 필요한 AWS 기능들은 전부 세팅했고 본격적인 CI/CD 세팅을 해야한다.

7. 레포지토리에 시크릿 키 등록

Github Actions가 우리 프로젝트와 AWS에 접근해야하는데 이 때 이전에 만들었던 사용자의 Access Key와 Secret Access Key가 있어야 접근할 수 있다.

Github Actions를 설정하기 위해서는 관련 스크립트 파일을 만들어서 레포지토리에 올려놓아야하는데 여기 스크립트에 우리 키가 그대로 노출되면 큰일나기 때문에, 레포지토리에다가 시크릿 키로 등록해놓아야 한다. (.env 환경 변수와 비슷한 개념.)

먼저 우리 레포지토리에 들어가서 설정 탭에 들어가자.

왼쪽 아래에 Secrets 항목에서 Actions로 들어가자.

여기서 시크릿 키를 등록할 수 있다.

맨 처음에 생성했던 IAM 사용자의 Access Key와 Secret Access Key를 등록하자. (나는 혹시 모르니까 리전까지 등록했다.)

8. EC2 인스턴스 접속 및 설정

8-1. 키 페어 등록

EC2 인스턴스 생성 과정에서 만들었던 .pem 파일을 우리 프로젝트에 넣자.

2편에서 설명했듯이 이 .pem 파일은 꼭 .gitignore에 추가하자.

8-2. EC2 인스턴스 접속

이제 우리의 EC2 인스턴스에 접속해서 필요한 세팅을 해야한다.

인스턴스에 들어가서 연결 버튼을 클릭한다.

여기서 우리는 SSH 클라이언트를 통해 접속할 것이다.
아까 포함한 pem 키 페어가 포함된 접속 코드가 이미 준비되어 있으므로 이걸 복붙하면 된다.

맨 밑에 있는 예: ssh -i "test-iam.pem" ... 코드를 복사하자.

이제 우리 컴퓨터 터미널을 통해 우리 프로젝트에 접속하자.
나는 VSCode에 있는 터미널에서 Git Bash를 사용했다.

아까 복사한 접속 코드를 붙여넣고 엔터를 누르자.

첫 접속이라 이런 내용이 뜨는 것 같다.
yes 입력하고 다음으로 넘어가자.

이렇게 Permission denied가 뜰 수 있다.

나는 구글링 한 결과 컴퓨터에 C:\Users\Administrator.ssh 를 비워서 아예 known hosts를 초기화해서 해결했다.

다음과 같은 화면이 뜨면 성공적으로 인스턴스에 접속한 것이다.

8-3. AWS-cli 설치

우리 EC2 인스턴스에서 AWS 관련 서비스를 사용하려면 AWS-cli를 설치해야 한다.
그리고 IAM에서 만든 사용자의 Access Key와 Secret Access Key를 등록해야 한다.

sudo apt install awscli

170MB 용량이 사용될 것이라고 나온다.
쿨하게 Y 치고 넘어가자.

그러면 우리 Access Key, Secret Access Key, Default Region을 등록하라고 나올 것이다.

IAM 사용자의 Access Key, Secret Access Key를 등록하자.
Default Region은 ap-northeast-2 로 등록한다.

8-4. Code Deploy Agent 설치

EC2 인스턴스에서 Code Deploy를 사용하려면 Code Deploy Agent를 설치해야 한다.
일단 다음과 같은 명령어를 순차적으로 입력하자.

Ubuntu 환경에서 Code Deploy를 설치하는 방법은 공식 문서 설치 가이드에 잘 나와있다.

주의할 점은 이런 식으로 버전 별로 명령어가 다르기 때문에 잘 구분해서 해야한다.
나는 처음에 바보같이 이걸 자세히 안보고 막 쳤다가 낭패를 본 적이 있었다.

  • sudo apt update : 설치 가능한 패키지 리스트를 최신화.
  • sudo apt install ruby-full : Code Deploy Agent 설치를 위한 ruby 설치.
  • sudo apt install wget : Wget 설치.
    • wget은 :HTTP 통신 또는 FTP 통신을 사용해 서버에서 파일 또는 콘텐츠를 다운로드할 때 사용하는 소프트웨어.
sudo apt update
sudo apt install ruby-full
sudo apt install wget
cd /home/ubuntu
wget https://aws-codedeploy-ap-northeast-2.s3.ap-northeast-2.amazonaws.com/latest/install
chmod +x ./install
sudo ./install auto > /tmp/logfile

위 명령어 중에서 wget https://aws-codedeploy-ap-northeast-2.s3.ap-northeast-2.amazonaws.com/latest/install에 대한 설명은 다음과 같다.

bucket-name (위 코드에서 aws-codedeploy-ap-northeast-2)은 해당 리전의 CodeDeploy 리소스 키트 파일이 포함되어 있는 Amazon S3 버킷의 이름입니다. region-identifier (위 코드에서 ap-northeast-2)는 리전의 식별자입니다. 예를 들어, 미국 동부(오하이오) 리전의 경우 bucket-name을 aws-codedeploy-us-east-2로 바꾸고 region-identifier를 us-east-2로 바꿉니다. 버킷 이름 및 리전 식별자 목록은 리전별 리소스 키트 버킷 이름 단원을 참조하세요.

우리는 계속 서울 리전 (ap-northeast-2) 에서만 설정해왔기 때문에 큰 고민 없이 ap-northeast-2로 설정하면 될 것 같다.

다음과 같은 화면이 뜨면 잘 된 것이다.

이제 진짜 Code Deploy Agent를 설치해야 한다.

먼저 현재 설치 가능한 Code Deploy Agent 목록을 살펴보자.

aws s3 ls s3://aws-codedeploy-ap-northeast-2/releases/ | grep '\.deb$'

가장 최신 버전을 선택해서 설치하자.

sudo ./install auto -v releases/codedeploy-agent_1.4.1-2244_all.deb > /tmp/logfile

설치가 완료되었으면 Code Deploy Agent가 잘 돌아가는지 확인해보자.

sudo service codedeploy-agent status

다음과 같이 뜨면 잘 돌아가고 있는 것이다.

혹시 잘 실행되지 않는다면 임의로 실행시켜보자.

sudo service codedeploy-agent start
sudo service codedeploy-agent status

이렇게해서 EC2 인스턴스에 Code Deploy 관련 설정을 마쳤다.
이제 우리 프로젝트를 EC2에서 실행시키기 위해 node, npm 등등을 설치할 차례이다.

profile
하고싶은건 많은데 시간이 없다!

0개의 댓글