AWS에 배포하기

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를 점유하고 있으면 추가적인 요금이 발생하는것 같다.
심심해서넣은이미지2


인스턴스 자동중지/실행 #

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


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 시간을 생각하면 된다. 심심해서넣은이미지4

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 달러씩 청구된다.
2주간의 비용

comments powered by Disqus