AWS에 배포하기
2023년 6월 4일
konobangumiwa 서비스를 배포까지 할까말까 고민했던건데 깃허브에서 바로 접속 가능한 URL이 있는것도 좋을것같아 진행했다.
엘라스틱서치를 도커로 돌려보니 너무 많은 메모리를 잡아먹었고, 그 외의 서버까지 포함하면 8GB 정도가 필요했지만 1GB만 쓸수있는 프리티어로는 부족해 42서울 월렛마켓에서 50만원 크래딧을 구매해 사용하기로 했다.
대략적인 순서 #
1️⃣ 42서울에서 크래딧 구매
2️⃣ 인스턴스 생성
3️⃣ 인바운드 규칙 80, 443 포트 오픈
4️⃣ 탄력적 IP 주소 설정
5️⃣ google API를 위한 env 파일 수정 및 키 재 생성
6️⃣ 릴리즈버전 docker-compose로 실행시키기
7️⃣ 시간에 맞춰 시작-종료 타이머 설정
8️⃣ 인스턴스 시작시 자동 docker-compose 실행
9️⃣ 도메인 연결
인스턴스 설정 #
3️⃣ 방화벽 인바운드 규칙 수정 #
인스턴스를 만들고나면 방화벽에서 기본적으로 22번 포트를 제외한 나머지 포트는 열려있지 않게된다
모든 IP 대상(소스: 0.0.0.0)으로 들어오는 패킷에 대해 80번과 443 포트를 열어주는 인바운드 규칙을 추가하면 된다.

4️⃣ 탄력적 IP 주소 설정 #
안그래도 유료 인스턴스인데(시간당 200원), 인스턴스를 하루종일 켜두면 온디맨드 요금이 너무 비싸게 청구되기 때문에 9시~21시 까지만 켜두기로 결정했다.
인스턴스가 중지(+종료)되면 AWS에 퍼블릭 아이피를 반납하게되는데, 탄력적 IP 주소를 생성하고 인스턴스와 연결하면 인스턴스가 중지돼도 IP를 반납하지 않게된다.
⏰ AWS의 공개 IP 풀은 한정된 자원이라 연결하지 않은 IP를 점유하고 있으면 추가적인 요금이 발생하는것 같다.

인스턴스 자동중지/실행 #
7️⃣ Lambda (실행스크립트) #
AWS에서는 서버 없이 코드를 실행할 수 있는 Lambda 서비스를 지원한다.
기본적으로 인스턴스에 대한 실행 권한이 없으며, 아래의 작업을 통해 인스턴스 실행, 중지 권한을 획득해야한다.
1. 정책 생성
IAM > 정책 에서 모든 ec2 인스턴스의 Start, Stop 작업을 허용하는 정책을 생성한다.
메뉴를 찾기 힘들면 검색을 활용하자.
아래의 정책을 JSON 형식으로 생성한다.
1{
2 "Version": "2012-10-17",
3 "Statement": [
4 {
5 "Effect": "Allow",
6 "Action": [
7 "logs:CreateLogGroup",
8 "logs:CreateLogStream",
9 "logs:PutLogEvents"
10 ],
11 "Resource": "arn:aws:logs:*:*:*"
12 },
13 {
14 "Effect": "Allow",
15 "Action": [
16 "ec2:StartInstance",
17 "ec2:StopInstance"
18 ],
19 "Resource": "*"
20 }
21 ]
22}
2. 역할생성
IAM > 역할 에서 Lambda 서비스에 위에서 만든 권한을 할당해준다.

3. Lambda 생성
위에서 만든 역할을 사용해서 함수를 생성한다.
함수는 lambda_handler가 호출되면 인스턴스를 획득 후 실행시키는 간단한 코드이다.
1# EC2_AUTO_RUN_START
2import boto3
3
4region = 'ap-northeast-2'
5instances = ['i-0426a0c1ecbe79c90']
6ec2 = boto3.client('ec2', region_name=region)
7
8def lambda_handler(event, context):
9 ec2.start_instances(InstanceIds=instances)
10 print('start your instances: ' + str(instances))
같은 코드에서 start를 stop으로만 변경해서 STOP 코드를 작성한다.
7️⃣ Cloud Watch (람다함수 트리거) #
생성한 Lambda 함수를 호출해줘야하는데, Cloud Watch 는 리눅스의 cron 작업으로 lambda를 호출해준다고 생각하면된다.
이벤트 규칙생성
어떤 상황에서 lambda 함수를 호출하는 이벤트를 발생시킬지 지정한다.
규칙은 0(분) 0(시) *(일) *(월) ?(요일) *(년도) 인데, 매일 0시에 START 스크립트가 실행돼야 하기 때문에 요일은 ?로 지정하지 않았다.
트리거되는 날짜가 표시되며, GMT 기준이라 적혀있으니 +9 시간을 생각하면 된다.

STOP 이벤트도 작성하면 끝이다.
docker-compose 자동 실행 #
인스턴스가 실행될때 자동으로 docker-compose 가 실행되도록 설정해야한다.
8️⃣ init에 스크립트 등록 #
1. 환경 세팅
자동으로 실행시키기 전에 미리 환경을 세팅한다.
user data로 설정해도 되지만, 이미 인스턴스를 생성했기 떄문에 ssh로 접속 후 세팅한다.
.env 파일도 생성해둬야 한다.
1$ sudo apt-get update
2$ sudo apt-get install git
3$ sudo apt-get install docker.io
4$ sudo apt-get install docker-compose
5
6$ sudo usermod -aG docker ubuntu # ubuntu = 기본계정
7
8$ git clone https://github.com/min-96/_konobangumiwa.git
9$ chmod 777 _konobangumiwa/backend/entrypoint.sh
2. 부팅시 자동실행
서비스 생성
1# /etc/systemd/system/konobangumiwa.service
2[Unit]
3Description=Knobangumiwa Service
4
5[Service]
6User=ubuntu
7ExecStart=/usr/bin/docker-compose -f /home/ubuntu/_konobangumiwa/docker-compose.yml up
8ExecStop=/usr/bin/docker-compose -f /home/ubuntu/_konobangumiwa/docker-compose.yml down
9WorkingDirectory=/home/ubuntu/_konobangumiwa/
10Restart=always
11
12[Install]
13WantedBy=default.target # 부팅 시 자동실행
부팅시 자동실행되도록 enable 처리
1sudo systemctl enable konobangumiwa
2sudo systemctl start konobangumiwa
시스템 파일 수정된 경우 daemon-reload
1sudo systemctl daemon-reload
완성 #
09시 ~ 21시 사이에만 AWS에서 서비스하기 시작했다. 트래픽이 없어서인 이유도 있겠지만 비용은 하루에 2.8~9 달러씩 청구된다.
