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

윤상준·2022년 11월 23일
6

AWS

목록 보기
1/3
post-thumbnail

개인 프로젝트를 진행하면서 AWS와 Github Actions를 사용하여 배포 및 CI/CD를 구축해보았다. 처음이었던 만큼 공식 문서와 구글링 자료들을 많이 참고했는데, 띄엄띄엄 나와있는 구글링 자료들 덕에 꽤나 고생을 했었다. 따라서 복기도 할 겸 정리해보려고 한다.

1. 프로젝트 생성

먼저 프로젝트를 생성하자. 나는 Next.js로 진행했기 때문에 예시로 Create-Next-App 을 사용하려고 한다. 어차피 배포가 중요한 것이기 때문에 React를 쓰거나 다른 것을 써도 상관 없다.

yarn create next-app cicd-test --typescript

다 만들었으면 깃허브 레포지토리에 올리자.

2. AWS IAM 세팅

먼저 IAM에서 사용자를 생성해야 한다.
IAM은 AWS의 특정 기능을 사용할 수 있는 권한을 부여받은 사용자를 생성할 수 있는 기능이다.
생성하면 Access Key와 Secret Access Key를 부여받는데, 이를 통해 권한을 부여 받은 AWS 서비스를 사용할 수 있다.

2-1. 사용자 생성

먼저 AWS에서 IAM을 찾아 들어가자.

화면 왼쪽 패널에서 사용자를 클릭하여 들어간다.

사용자 추가를 누른다.

이름 및 액세스 유형 선택

사용자 이름은 임의로 정하면 된다. 나는 test-iam으로 했다.
또한 AWS 액세스 유형 선택은 액세스 키 - 프로그래밍 방식 액세스 로 선택하자.

권한 설정

권한은 기존 정책 직접 연결을 선택하고 EC2, S3, CodeDeploy 에 대한 권한을 부여한다.
이 때 FullAccess로 선택한다.

회사에서 사용할 경우 조직 내부 규칙에 따라 세부적인 기능을 나눠서 줄 수도 있겠다.
하지만 지금 프로젝트에서는 굳이 그렇게까지 할 필요가 없다.

태그 추가

태그는 나중에 사용하지 않을 수 있지만 혹시 모르기 때문에 세팅해두는 편이다.
돈 나가는거 아니니까 추가해두자.

검토 및 생성

액세스 키 저장

생성이 완료되면 액세스 키 (Access Key)비밀 액세스 키 (Secret Access Key) 가 발급된다.

csv 파일로 다운받던지 따로 복붙하던지 해서 꼭 저장해두고, 절대로 외부에 노출하지 말자.

2-2. EC2 역할 생성

역할은 어떤 서비스를 사용할 수 있는지를 설정해놓은 하나의 자격 (Identity) 이다.
사용자와 매우 유사하지만 차이가 있다. 사용자는 AWS 계정 내에서 생성된 특정 사용자에게만 귀속되는 것이라면, 역할은 이 역할을 부여받은 사용자는 모두 해당 서비스에 접근할 수 있다는 차이가 있다.

다시 왼쪽 패널에서 역할을 찾아 들어가자.

여기서 역할 만들기를 클릭한다.

엔터티 유형 선택

EC2와 관련된 역할이기 때문에 엔터티를 다음과 같이 설정한다.
(AWS 서비스 및 EC2)

권한 추가

이번 배포에서 EC2와 관련된 서비스는 S3와 Code Deploy이다. 따라서 이 둘의 권한을 추가해주어야 한다. 추가로 EC2 권한까지 설정해주자.

그 다음 권한 경계 설정과 역할 세부 설정은 지금은 필요 없으니 넘어간다.

태그 추가 및 생성

태그는 혹시 모르니 추가해주고 역할 생성을 누른다.

이렇게 EC2와 관련된 역할을 생성했다.

2-3. Code Deploy 역할 생성

다시 역할 만들기를 눌러서 새로 들어가자.

Code Deploy 선택

엔터티는 그대로 AWS 서비스로 선택한다.
대신에 이번에는 사용 사례에서 codeDeploy를 검색해서 선택하고 다음을 누른다.

권한 정책은 AWSCodeDeployRole로 되어있을 것이다.
그대로 다음으로 넘어가자.

이름 지정 및 생성

이름은 임의로 지정한다.

보통 태그는 다른 서비스에서 지금 이 서비스를 사용해야할 때, 이 서비스를 식별하기 위한 용도로 사용한다.

나중에 사용하지 않을 수도 있지만 돈 드는거 아니니까 하나씩 추가해주는 것이 좋을 것 같다.

사진은 깜빡하기 추가하기 전으로 찍었는데, 하나 추가했다.

이렇게 총 2개의 역할이 만들어졌다.

3. EC2 생성

이제 AWS에서 EC2 인스턴스를 생성하자.

EC2는 쉽게 말해서 AWS에서 제공하는 하나의 컴퓨터이다. EC2를 사용한다는 것은 아마존으로부터 한 대의 컴퓨터를 임대하는 것을 의미한다. 프리 티어를 제공하여 일정 수준까지는 무료로 사용할 수 있고, 그 이후에도 사용하는 만큼만 비용을 지불할 수 있어 경제적이다.

3-1. EC2 인스턴스 생성

인스턴스 생성

EC2를 검색해서 들어간 후 인스턴스 시작을 누른다.

그 후 이름 및 태그를 세팅한다.

AMI 및 인스턴스 유형 설정

AMI는 Ubuntu를 선택한다. 꼭 Ubuntu를 고집할 필요는 없지만 여기 저기 물어보고 또 개인적인 경험상 가장 보편적으로 사용되는 것 같아 선택했다.

그 다음 Ubuntu의 버전을 선택할 수 있는데 현재 (22년 11월 기준) Ubuntu는 22.04 버전과 20.04 버전이 나와있다.

최신 버전인 22.04 버전을 선택할 수 있겠지만 나는 20.04 버전을 선택했다. 그 이유는 뒤에서 이 Ubuntu 인스턴스에 여러 가지를 설치해야하는데 버전 호환성을 고려해야 하는 경우가 있었다. (추후에 Code Deploy Agent를 설치해야하는데 이를 위해 Ruby의 버전을 신경써서 설치해줘야 하는 등등)

그 다음 인스턴스 유형을 선택해야 한다.
프리티어는 t2.micro 밖에 없으므로 선택하면 된다.

주의할 점은 제공되는 메모리가 1GB 이므로 매우 적다. 따라서 좀 무거운 작업을 하거나 하면 터질 수 있고 또 금방 차서 과금이 발생할 수 있으므로 각별히 신경써야 한다.

하지만 AWS를 사용한다면 과금은 어떻게든 발생할 수 밖에 없는 것 같다.

키 페어 생성

그 다음은 로그인을 위한 키 페어를 생성해야 한다. 이 키 페어를 통해서 EC2 인스턴스에 접속할 수 있다.

키 페어 이름은 임의로 설정한다.
키 페어 유형은 RSA 형식으로 하고, 파일 형식은 .pem으로 설정한다.

Window일 경우 .ppk로 받아서 PuTTY를 통해 인스턴스에 접속할 수도 있는데 개인적으로 복잡한 것 같아 선호하지 않는다. PuTTY도 설치해야하고 키도 등록하고 등등 해야 할 일이 더 많다.

키 페어를 성공적으로 생성하면 다음과 같은 파일이 생길 것이다.

이 키 페어는 정말 중요하고 유출되면 난리가 날 것이다.
AWS를 사용하다가 실수로 해킹 당해서 과금 폭탄을 맞았다는 이야기를 꽤 많이 들어봤을 것이다. 이 키 페어 파일이 노출되면 해커들이 이걸 사용서 SSH를 통해 우리 계정에 접근할 수 있다. 그 다음 일은 굳이 얘기하지 않아도 될 것 같다.

따라서 이 키 페어 파일을 .gitignore에 포함하지 않고 깃허브 레포지토리에 올리는 것은 "날 잡아 먹으세요." 하는 것과 마찬가지이므로 꼭꼭 노출되지 않도록 조심하자.

네트워크 설정

이제 네트워크를 설정해야 한다. 여기서 오른쪽 위에 있는 편집 버튼을 눌러 세부 설정으로 들어가자.

그러면 인바운드 보안 그룹 규칙을 설정할 수 있는데, 여기서 이 EC2 인스턴스에 접속할 수 있는 네트워크 유형을 결정할 수 있다.

ssh는 이 인스턴스의 주인 즉, 우리다. 우리가 키 페어를 통해 인스턴스에 접속할 때 이 ssh를 사용한다. (키 페어가 탈취되면 해커가 ssh를 통해 인스턴스에 접속할 수 있다.)

그 다음 HTTP와 HTTPS까지 설정해주자.

스토리지 구성

그 다음으로 스토리지를 구성해야 한다.
스토리지는 우리 인스턴스의 저장 공간이라고 생각할 수 있다. 평균적으로는 8GB를 설정해주는 것 같지만, 프리티어는 30GB까지의 스토리지를 제공해주기 때문에 나는 30GB까지 설정했다.

검토 및 시작

여기까지 다 했으면 오른쪽에 있는 요약 패널을 보고 최종 검토한 후 인스턴스를 시작한다.

이렇게 인스턴스가 생성되었다. 처음에는 대기 중으로 뜰 것이다.

시간이 좀 지나면 이렇게 실행 중으로 바뀐다.
EC2가 성공적으로 생성되어 돌아가고 있는 것이다.

3-2. EC2에 IAM 역할 연결

아까 만들었던 IAM 역할을 이 EC2에 연결해주어야 한다.

먼저 우리 EC2에서 오른쪽 마우스 버튼을 눌러 보안 탭에서 IAM 역할 수정을 누른다.

수정 페이지로 이동하면 IAM 역할에서 아까 만들었던 역할을 선택한 후 IAM 역할 업데이트 버튼을 누른다.

4. 탄력적 IP 연결 (선택 사항)

EC2 인스턴스는 중지하고 시작할 때마다 IP가 고정되어있지 않고 변경된다.

인스턴스를 중지하고 시작할 때마다 Amazon Elastic Compute Cloud (Amazon EC2) 인스턴스와 연결된 자동 할당된 퍼블릭 IP 주소가 변경됩니다.
-공식문서-

만약 고정된 IP가 필요하다면 탄력적 IP를 발급받아 EC2와 연결해줄 수 있다. 나는 프로젝트 특성 상 고정된 IP가 필요했기 때문에 탄력적 IP를 사용했다.

하지만 탄력적 IP는 유료이기 때문에 이를 감안해야 한다.

나는 이 글을 작성하는 현재까지 이 정도 과금이 발생했다.

4-1. 탄력적 IP 주소 할당

왼쪽 패널에서 탄력적 IP를 찾아 들어가자.

탄력적 IP 주소 할당을 누른다.

크게 어려운 것은 없다.
네트워크 경계 그룹에서 배정해주고 싶은 지역 (Region)을 설정해주면 된다.
그리고 태그는 임의로 설정하면 된다.
다 했으면 할당을 눌러주자.

그러면 이렇게 탄력적 IP 주소가 새로 생겼다.

이게 이 IP 주소를 우리 EC2 인스턴스와 연결할 것이다.
탄력적 IP 주소 연결 버튼을 눌러서 들어가면 다음과 같은 화면이 나올 것이다.

인스턴스는 우리 EC2 인스턴스를 선택해주자.
그 다음 프라이빗 IP 주소에 우리 EC2 인스턴스의 주소가 뜰건데 그거 선택해주면 된다.

그리고나서 연결을 누르면 우리 EC2와 탄력적 IP가 연결되었다.

EC2 인스턴스로 이동해서 살펴보면 탄력적 IP로 IP 주소가 변경된 것을 알 수 있다.

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

1개의 댓글

comment-user-thumbnail
2023년 8월 7일

꼼꼼하게 잘 작성하셨네요 감사합니다!

답글 달기