[AWS] - ECS로 gin 배포하기

노관옥·2022년 7월 16일
1

aws

목록 보기
1/2
post-thumbnail

Elastic Container Service

AWS에서 제공하는 확장성이 뛰어나고 빠른 컨테이너 관리 서비스입니다

최근 간단하게 컨테이너를 배포해보고 싶어서 ECS를 사용해보게 되었습니다 😀

제가 사랑하는 Go 언어로 웹 애플리케이션을 배포해서 도메인에 연결해보려고 합니다!

웹 어플리케이션 준비하기

저는 gin을 사용해서 테스트를 진행했습니다!

gin 설치 커맨드

go get -u github.com/gin-gonic/gin

main.go

80포트에서 gin 이 돌아가도록 설정했습니다.

package main

import (
	"github.com/gin-gonic/gin"
)

func main() {
	r := gin.Default()
	r.GET("/", func(c *gin.Context) {
		c.JSON(200, gin.H{
			"message": "gin is running",
		})
	})

	r.Run(":80")
}

Dockerfile

이미지 크기를 줄이기 위해 Multi-Stage 빌드를 통해 이미지를 만들었습니다.

FROM golang:1.18-alpine as build

WORKDIR /app

ENV GO111MODULE=on
ENV CGO_ENABLED=0
ENV GOOS=linux
ENV GOARCH=amd64

COPY . .

RUN go build -o main main.go

FROM alpine:3.12
RUN apk --update add ca-certificates

WORKDIR /app

COPY --from=build /app/main .

EXPOSE 80

CMD ["/app/main"]

도커 컨테이너 Push

ECS에서 컨테이너를 띄우려면, 컨테이너 저장소에 등록돼있는 이미지를 가져와야 해요.

AWS의 ECR (Elastic Container Registry) 을 사용할 수도 있지만,

저는 이미지들을 깃허브에서 관리해서, ghcr.io에서 이미지를 가져올 겁니다!

깃허브

이미지를 ghcr.io에 업로드하기 위해 토큰을 생성해줍시다.

https://github.com/settings/tokens/new

write:packages, delete:packages 만 체크해주고

스크롤하여, Generate Token을 눌러줍니다.

방금 생성한 토큰과, 깃허브 유저 아이디를 아래 커맨드에 넣어주고, 실행시켜주면 로그인이 성공했다는 메시지가 나옵니다!

export CR_PAT=생성한_토큰
echo $CR_PAT | docker login ghcr.io -u 깃허브_아이디 --password-stdin

> Login Succeeded

ghcr.io에 업로드할 이미지 빌드

이제 도커파일을 빌드하고, 빌드한 이미지를 깃허브 저장소에 업로드하면 이미지는 준비 끝입니다! 👍

깃허브 아이디와, 이미지 이름을 설정해주고, Dockerfile이 있는 경로에서 아래 명령어를 실행해줍니다.

docker build -t ghcr.io/깃허브_아이디/이미지_이름:latest .
docker push ghcr.io/깃허브_아이디/이미지_이름:latest

ECS 클러스터 만들기

클러스터는 컨테이너를 관리해줄 중앙시스템 같은 건데요,

설정할 것이 딱히 없습니다!

단계 1: 클러스터 템플릿 선택

만약 프리티어중이었다면 ec2를 선택했겠지만, 저는 프리티어가 끝나가지구 😭

그래서 Fargate도 사용해보기 위해 네트워킹 전용을 선택했습니다.

단계 2: 클러스터 구성

이름은 적당한 걸로 입력해주고,

IP (CIDR 블록, 서브넷) 그냥 기본 설정 그대로 놔둬도 상관없습니다!

로드밸런서 만들기

로드밸런서 서울 리전 링크

ECS에 올린 서비스의 IP는 언제든 변할 수 있어서,

제가 연결할 도메인에 IP를 고정으로 설정하는 것보단 로드밸런서를 활용하는 게 좋습니다!

그럼 로드 밸런서 생성 버튼을 클릭해주고,

로드 밸런서 타입 선택

Application Load Balancer 를 선택해줍니다!

Basic configuration

기본 세팅은 이름만 세팅해주겠습니다.

Network mapping

클러스터를 생성할 때 만들었던 vpc를 선택해주고,

선택할 수 있는 가용 구역은 모두 체크해줬습니다.

Security groups

보안그룹은 꼭 생성해줘야 합니다!

기본 그룹을 사용하면 DNS 접속이 안 되더라구요 😅

Create new security group을 눌러서 보안 그룹을 생성해줍시다.

이름과 설명을 넣고, VPC를 선택한 뒤, 인바운드 규칙에 80 포트를 열어서 인터넷에서 접속할 수 있도록 해야 합니다.

아래 이미지와 같이 세팅해주면 됩니다.

꼭! VPC를 눌러서 초반에 만들었던 VPC를(192.168.0.0/16) 선택해야 합니다!

선택 안했더니 생성해도 못 고르더라구요..

생성에 성공했다면, 다시 돌아와서 만들었던 보안그룹을 선택해줍니다. 👍

Listeners and routing

여기선 타겟 그룹을 생성해서 Default action에 넣어줘야 합니다.

생성 안 하면 안 넘어가는데 타겟 그룹이 꼭 필요한 이유가 있습니다.

클러스터를 만들 때 VPC를 192.168.0.0/16 으로 설정했는데,

클러스터에서 돌아가는 컨테이너의 내부 IP는 192.168.0.42, 192.168.1.177 등으로 랜덤한 값으로 설정됩니다.

아무튼 말 그대로 로드밸런서의 타겟을 아까 만들었던 VPC(192.168.0.0/16)로 설정해야 합니다.

그럼 Create target group을 클릭해 타겟 그룹을 생성해줍시다.

타겟 그룹 만들기

Fargate를 사용하기 때문에, IP 주소를 선택해야 합니다.

당연 타겟 그룹 이름도 넣어줘야 하구요.

밑으로 내리면 VPC를 선택하는 곳이 있는데, 초반에 만든 VPC가 맞는지 확인하고,

다른 세팅은 따로 건들지 않고, 다음 단계로 넘어가겠습니다.

여기도 Network만 초반에 만든 VPC가 맞는지 확인하고, 그냥 생성하면 됩니다!

IP를 추가하지 않아도 잘 생성됩니다 👍

로드 밸런서 생성 탭으로 돌아와서 방금 생성한 타겟 그룹을 선택해줍니다.

나머지 세팅은 따로 건들지 않고, Create load balancer를 눌러주겠습니다~ 😆

다시 ECS로

기본적인 준비가 끝났으므로, 이제 gin 애플리케이션을 컨테이너로 띄워보겠습니다!

작업 정의 만들기

새 작업 정의 생성을 눌러줍니다.

시작 유형 호환성 선택

Fargate를 선택하고, 다음 단계를 눌러줍니다.

작업 및 컨테이너 정의 구성

여기선 작업에 대한 정보를 세팅해줘야 하는데요,

태스크 역할은 없음, 운영 체제 패밀리는 Linux를 선택하겠습니다.

작업 실행 IAM 역할은 그냥 기본 세팅대로 두면 될 것 같습니다.

작업 크기 고르기

그리고 밑으로 좀 내리면, 작업 크기가 나오는데요!

저는 돈을 쪼금만 내고 싶어서 둘 다 제일 작은 버전으로 했습니다. 😊

컨테이너 추가

이제 컨테이너 추가 버튼을 눌러서 아까 만든 gin 이미지를 올려주겠습니다!

컨테이너 이름은 그냥 아무거나 해도 되고, 이미지는 이미지 주소를 넣으면 됩니다.

그리고 저는 이미지 만들 때 80포트를 열어둬서 포트 매핑에는 80을 입력해줬습니다.

작업 생성 완료!

서비스 만들기

클러스터로 돌아와서 서비스를 생성하겠습니다.

서비스 탭의 생성 버튼을 눌러주세요.

서비스 구성

시작 유형은 FARGATE를 선택하고, 서비스 이름은 아무거나 입력해줍니다.

전 돈이 별로 없어서 작업 개수는 그냥 1개만 하겠습니다 😅

나머진 무시하고 다음 단계로 넘어가겠습니다!

VPC 및 보안 그룹

서브넷을 모두 선택해주고, 보안 그룹은 80 포트가 기본적으로 오픈돼있습니다.

만약 다른 포트를 사용한다면, 커스텀을 해서 적용해도 됩니다.

IP는 자동할당 ENABLED로 설정하면 됩니다.

로드 밸런싱

아까 만든 로드밸런서를 쓸 시간입니다 🥹

Application Load Balancer를 선택하고, 로드 밸런서를 선택합니다.

그럼 컨테이너 이름: 포트가 선택되는데요, 로드 밸런서에 추가를 눌러줍니다.

대상 그룹 이름만 로드밸런서 만들면서 같이 생성한 타겟 그룹으로 설정하고 넘어갑니다.

아마 실무에선 쓸 수도 있겠지만..?

저는 학생이니, 서비스 개수 조정하지 말라고 하고 다음 단계를 눌러줍니다.

검토

마무리로 검토를 쫙하고 나서 서비스 생성을 눌러주면 끝입니다.

서비스 생성 완료! 🥳

로드 밸런서 화면으로

로드 밸런서 화면으로 가서 상세 정보를 보면, DNS 이름이 있습니다.

이걸 복사해서 인터넷 주소창에 넣고 엔터를 누르면 아마...

이렇게 성공할 수도 있습니다!

Route 53 도메인 연결하기

이 글에서는 도메인을 연결하면 할 일 끝인데요!

Route 53 으로 가서 호스팅 영역 생성을 눌러줍니다.

도메인 이름에는 도메인 주소를 넣어야 합니다.

도메인 주소가 없으면 사야 합니다 🥲

아무튼 도메인 주소를 넣고 호스팅 영역 생성을 눌러줍니다.

Route 53 호스팅 영역 생성 완료

여기서 중요한 값은 NS 유형 옆에 있는 4개의 값/트래픽 라우팅 대상입니다.

이걸 도메인 산 곳의 네임 서버 설정에 들어가서 하나하나 넣어줘야 합니다.

저는 회사에서 사용한다는 이유로 그냥 호스팅케이알로 예시를 들겠습니다.

어느 도메인 사이트 가비아, godaddy, 등은 네임서버 설정하는 탭이 있습니다.

before

after

4개 모두 넣어서 저장해주면 됩니다.

그럼 이제 이 도메인은 AWS 손안에 있습니다.

로드 밸런서에 연결하기

이제 도메인 주소로 접속했을 때, ecs 컨테이너로 들어가기 위한 작업을 할 겁니다.

레코드 생성을 눌러줍니다.

만약 이런 화면이라면?

마법사로 전환을 눌러줍니다.

단순 라우팅을 선택하고, 다음을 눌러줍니다.

단순 레코드 정의를 누르면 아래 이미지 같은 모달? 이 뜹니다.

레코드 이름은 아무거나 넣어도 되고, 안 넣어도 됩니다.

저 같은 경우엔, api로 설정했으니 api.fridays-app.xyz 로 들어가면 gin 애플리케이션이 응답하겠죠!

Application/Classic Load Balancer에 대한 별칭을 선택합니다.

서울을 선택하고,

마지막으로 앞에서 만든 로드밸런서를 선택해서 단순 레코드 정의 버튼을 눌러줍니다.

레코드 생성을 눌러서 결과를 확인해보면

잘 생성된 걸 확인할 수 있습니다.

이제 주소를 크롬에 쳐보면!

성공! 🎉

굿 👍

profile
Go, MLOps를 공부중입니다

0개의 댓글