문제
매번 EC2 인스턴스를 만들 때마다 패키지 목록 업데이트와, 시간대 설정과, 스왑 메모리 설정을 해주는 반복 작업이 귀찮다.
해결
AWS EC2 에서는 고급 설정에서 사용자 데이터 라는 항목을 통해 인스턴스 실행 시 지정한 스크립트를 실행해주는 기능을 제공하고 있다.
1. EC2 생성
예시를 들기 위해 EC2 생성 클릭 후 이름을 입력 해주고,
Ubuntu 24.04 버전으로 선택 후, 왼쪽 아래 아키텍처를 t4g.micro 를 선택하기 위해 64비트(Arm) 을 선택해준다.
오른쪽 아래 변경 확인을 눌러주면 된다.
그리고 테스트를 위해 t4g.nano를 선택해준다.
t4g.nano는 AWS Graviton 을 사용하는데, ARM 기반 프로세서라서 위에서 아키텍처로 Arm을 선택해주었다.
t4g.nano를 선택한 이유는 제일 저렴해서이다. 750시간 기준 약 5천원 정도밖에 과금이 안 된다.
그 뒤에 키 페어는 각자 생성한 것으로 선택해준다.
이후 보안그룹은 각자에 맞게 선택을 하고, 스토리지도 기본값인 8기가를 그대로 두었다.
2. 사용자 데이터 설정
그 뒤에 맨 아래에 보면 고급 세부 정보 탭이 있는데 이를 클릭 후 제일 아래로 내리면
사용자 데이터 부분이 있다.
파일로 넣어도 되고, 나는 직접 스크립트를 입력해주었다.
#!/bin/bash
apt update -y # 패키지툴의 버전정보 갱신. -y 로 확인 입력을 받지 않고 바로 실행
timedatectl set-timezone Asia/Seoul # 시간대를 Asia/Seoul (KST)로 설정
# swap 메모리 설정
# 기본 제공 메모리의 2배로 설정하는 것이 적정함
# t4g.nano의 경우 0.5GB를 제공하므로, 128M * 8 = 1GB로 설정함.
dd if=/dev/zero of=/swapfile bs=128M count=8
chmod 600 /swapfile
mkswap /swapfile
swapon /swapfile
echo '/swapfile swap swap defaults 0 0' | tee -a /etc/fstab
# 패키지 설치의 경우 시간이 오래 걸림.
# apt install mysql-server -y # mysql-server 패키지 설치. (필요 시 # 제거 후 사용)
# apt install openjdk-17-jdk -y # jdk17 설치.
이 공식 문서를 참고했다.
- 기본적으로 사용자 데이터 스크립트는 최초로 인스턴스를 시작할 때만 실행이 되므로, 재시작할 때마다 실행하려면 따로 구성을 해주어야 한다.
- shell 스크립트는 #! 문자와, 스크립트를 읽을 경로인 /bin/bash 를 포함해야 한다. (스크립트 최상단에 적혀있음)
- 사용자 데이터로 입력된 스크립트는 루트 사용자 권한으로 실행되므로 sudo 명령을 사용하지 않아도 된다.
- 또한 스크립트는 대화형으로 실행되지 않으므로 사용자의 입력이 필요한 명령은 포함할 수 없다. (그래서 -y 를 넣어주었다.)
- 스크립트는 처리 시 /var/lib/cloud/instances/<instance-id> 에서 복사 및 실행이 되고, 실행 후 삭제되지 않는다.
- 그리고 인스턴스가 생성되고 스크립트가 실행 중에 인스턴스에 접속이 되면, 실행 중인 스크립트가 취소가 되는 것 같다. 그래서 처리가 오래 걸리거나 덜 중요한 스크립트를 아래로 빼주었다. 접속도 여유를 두고 접속하는 것이 좋을 것 같다.
3. 인스턴스 실행
그러면 위의 스크립트로 EC2 인스턴스를 만들어보면,
우선 시간대 설정이 KST로 잘 된 것을 볼 수 있다.
swap 메모리 설정도 Swap 부분을 보면, 지정했던 1.0Gi (128M * 8) 로 잘 설정된 것을 볼 수 있다.
위에서 말했던 사용자 데이터 스크립트도 지정된 위치에 저장이 된 것을 볼 수 있다.
도커 추가 버전
다른 분들의 TIL 및 도커 공식 문서를 보고 도커까지 추가하는 스크립트를 작성해보았다. 그 분 TIL 에서는 도커 컴포즈까지 있는데, 내가 해보기론 안 되어서 일단 뺐다. 직접 접속해서도 설치가 안 되서 나중에 공부하고 다시 추가해둘 예정.
참고 링크
#!/bin/bash
# Update apt
apt update -y
# Set timezone
timedatectl set-timezone Asia/Seoul
# Set swap memory
dd if=/dev/zero of=/swapfile bs=128M count=8
chmod 600 /swapfile
mkswap /swapfile
swapon /swapfile
echo '/swapfile swap swap defaults 0 0' | tee -a /etc/fstab
# Install Docker
# Add Docker's official GPG key:
apt-get update
apt-get install ca-certificates curl
install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
chmod a+r /etc/apt/keyrings/docker.asc
# Add the repository to Apt sources:
echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu \
$(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \
tee /etc/apt/sources.list.d/docker.list > /dev/null
apt-get update
'TIL ✍️' 카테고리의 다른 글
24/08/02(금) 91번째 TIL : EC2 Ubuntu 포트포워딩 (0) | 2024.08.02 |
---|---|
24/08/01(목) 90번째 TIL : AWS Amazon VPC CIDR 범위 (1) | 2024.08.01 |
24/07/30(화) 88번째 TIL : Access token & Refresh token 요청/응답 방식과 양식 (1) | 2024.07.30 |
24/07/29(월) 87번째 TIL : 어노테이션으로 AOP 적용하기 (0) | 2024.07.29 |
24년 6월 24일(월요일) - 86번째 TIL : Querydsl 일대다 조회 시 중복 요소 처리 (0) | 2024.06.24 |