AWS 에서 무료로 제공하는 리소스를 이용하여 인프라를 구성해보자.
ec2를 포함한 모든 리소스는 서울 리전에 생성한다.
ec2 사양은 다음과 같다.
리소스 | 종류 | 비고 |
---|---|---|
AMI | Amazon Linux2 | |
CPU/Memory | t2.micro | vCPU 1Core, 메모리 1GB 사양 (보통 vCPU는 물리 CPU 사양의 절반 정도의 성능을 가짐) |
VPC/서브넷(네트워크) | 기본값 | |
스토리지 | 30GB | 30GB까지 프리티어로 사용 가능 |
보안 그룹(인바운드) | 22,8080,443 | |
보안 그룹(아웃바운드) | 기본값 |
인스턴스 ssh key인 pem 파일은 다운로드 받아서 저장하자.
ssh 접속을 위해 반드시 필요하다.
AWS는 고정 IP를 Elastic IP(EIP, 탄력적 IP)라고 한다.
EIP를 발급 받고, 생성한 EC2와 연결한다.
(주의) EIP는 생성하고 EC2 서버에 연결하지 않으면 비용이 발생한다. 따라서 생성한 EIP는 무조건 EC2에 바로 연결해야 하며 만약 더는 사용할 인스터스가 없을 때도 EIP를 삭제해야 한다.
IntelliJ에서 프로젝트를 java-17로 구성하였다.
서버에서도 어플리케이션이 동작하려면 java-17 버전으로 설치해 주어야 한다.
# 설치 작업전 현재 서버 환경 확인
## 설치된 java 패키지 없음
$ rpm -qa|grep java
## 리포지토리는 구성되어 있음
$ yum repolist
Loaded plugins: extras_suggestions, langpacks, priorities, update-motd
repo id repo name status
!amzn2-core/2/x86_64 Amazon Linux 2 core repository 29,726
amzn2extra-docker/2/x86_64 Amazon Extras repo for docker 75
amzn2extra-kernel-5.10/2/x86_64 Amazon Extras repo for kernel-5.10 236
repolist: 30,037
## 리포지토리에서 설치 가능한 java-17 패키지의 마이너 버전 확인
$ yum list --showduplicates java-17-amazon-corretto
Loaded plugins: extras_suggestions, langpacks, priorities, update-motd
Available Packages
java-17-amazon-corretto.x86_64 1:17.0.1+12-2.amzn2.1 amzn2-core
java-17-amazon-corretto.x86_64 1:17.0.1+12-3.amzn2.1 amzn2-core
java-17-amazon-corretto.x86_64 1:17.0.2+8-1.amzn2.1 amzn2-core
java-17-amazon-corretto.x86_64 1:17.0.3+6-1.amzn2.1 amzn2-core
java-17-amazon-corretto.x86_64 1:17.0.4+8-1.amzn2.1 amzn2-core
java-17-amazon-corretto.x86_64 1:17.0.4+9-1.amzn2.1 amzn2-core
java-17-amazon-corretto.x86_64 1:17.0.5+8-1.amzn2.1 amzn2-core
java-17-amazon-corretto.x86_64 1:17.0.6+10-1.amzn2.1 amzn2-core
# java-17 로 시작하는 패키지명 확인
$ sudo yum list java-17-amazon-corretto*
Loaded plugins: extras_suggestions, langpacks, priorities, update-motd
Available Packages
java-17-amazon-corretto.x86_64 1:17.0.6+10-1.amzn2.1 amzn2-core
java-17-amazon-corretto-devel.x86_64 1:17.0.6+10-1.amzn2.1 amzn2-core
java-17-amazon-corretto-headless.x86_64 1:17.0.6+10-1.amzn2.1 amzn2-core
java-17-amazon-corretto-javadoc.x86_64 1:17.0.6+10-1.amzn2.1 amzn2-core
java-17-amazon-corretto-jmods.x86_64 1:17.0.6+10-1.amzn2.1 amzn2-core
# java 설치
$ sudo yum install java-17-amazon-corretto*
(...생략...)
Installed:
java-17-amazon-corretto.x86_64 1:17.0.6+10-1.amzn2.1
java-17-amazon-corretto-devel.x86_64 1:17.0.6+10-1.amzn2.1
java-17-amazon-corretto-headless.x86_64 1:17.0.6+10-1.amzn2.1
java-17-amazon-corretto-javadoc.x86_64 1:17.0.6+10-1.amzn2.1
java-17-amazon-corretto-jmods.x86_64 1:17.0.6+10-1.amzn2.1
Dependency Installed:
alsa-lib.x86_64 0:1.1.4.1-2.amzn2
dejavu-fonts-common.noarch 0:2.33-6.amzn2
dejavu-sans-fonts.noarch 0:2.33-6.amzn2
dejavu-sans-mono-fonts.noarch 0:2.33-6.amzn2
dejavu-serif-fonts.noarch 0:2.33-6.amzn2
fontconfig.x86_64 0:2.13.0-4.3.amzn2
fontpackages-filesystem.noarch 0:1.44-8.amzn2
giflib.x86_64 0:4.1.6-9.amzn2.0.2
javapackages-tools.noarch 0:3.4.1-11.amzn2
libICE.x86_64 0:1.0.9-9.amzn2.0.2
libSM.x86_64 0:1.2.2-2.amzn2.0.2
libX11.x86_64 0:1.6.7-3.amzn2.0.2
libX11-common.noarch 0:1.6.7-3.amzn2.0.2
libXau.x86_64 0:1.0.8-2.1.amzn2.0.2
libXext.x86_64 0:1.3.3-3.amzn2.0.2
libXi.x86_64 0:1.7.9-1.amzn2.0.2
libXinerama.x86_64 0:1.1.3-2.1.amzn2.0.2
libXrandr.x86_64 0:1.5.1-2.amzn2.0.3
libXrender.x86_64 0:0.9.10-1.amzn2.0.2
libXt.x86_64 0:1.1.5-3.amzn2.0.2
libXtst.x86_64 0:1.2.3-1.amzn2.0.2
libxcb.x86_64 0:1.12-1.amzn2.0.2
libxslt.x86_64 0:1.1.28-6.amzn2
log4j-cve-2021-44228-hotpatch.noarch 0:1.3-7.amzn2
python-javapackages.noarch 0:3.4.1-11.amzn2
python-lxml.x86_64 0:3.2.1-4.amzn2.0.3
Complete!
# 설치된 패키지 확인
$ rpm -qa|grep java-17
java-17-amazon-corretto-jmods-17.0.6+10-1.amzn2.1.x86_64
java-17-amazon-corretto-devel-17.0.6+10-1.amzn2.1.x86_64
java-17-amazon-corretto-17.0.6+10-1.amzn2.1.x86_64
java-17-amazon-corretto-headless-17.0.6+10-1.amzn2.1.x86_64
java-17-amazon-corretto-javadoc-17.0.6+10-1.amzn2.1.x86_64
$ java --version
openjdk 17.0.6 2023-01-17 LTS
OpenJDK Runtime Environment Corretto-17.0.6.10.1 (build 17.0.6+10-LTS)
OpenJDK 64-Bit Server VM Corretto-17.0.6.10.1 (build 17.0.6+10-LTS, mixed mode, sharing)
$ alternatives --config java
There is 1 program that provides 'java'.
Selection Command
-----------------------------------------------
*+ 1 /usr/lib/jvm/java-17-amazon-corretto.x86_64/bin/java
Enter to keep the current selection[+], or type selection number:
failed to create /var/lib/alternatives/java.new: Permission denied
timedatectl 을 이용하여 서버 시간을 설정해보자.
man 문서를 보면 timedatectl list-timezones으로 설정 가능한 타임존 목록을 확인하고, timedatectl set-timezone으로 타임존을 설정할 수 있다.
set-timezone은 /etc/localtime을 심볼릭 링크를 걸어 설정한다고 하니, 설정 전 후에 /etc/localtime 파일의 링크가 어떻게 달라지는지 확인해보자.
$ man timedatectl |grep -A5 set\-timezone
set-timezone [TIMEZONE]
Set the system time zone to the specified value. Available timezones can be listed
with list-timezones. If the RTC is configured to be in the local time, this will
also update the RTC time. This call will alter the /etc/localtime symlink. See
localtime(5) for more information.
# 현재 시간 설정값 확인
$ timedatectl status
Local time: Sun 2023-01-22 12:49:23 UTC
Universal time: Sun 2023-01-22 12:49:23 UTC
RTC time: Sun 2023-01-22 12:49:24
Time zone: n/a (UTC, +0000)
NTP enabled: yes
NTP synchronized: yes
RTC in local TZ: no
DST active: n/a
# 타임존 설정 전 localtime 파일에 아무런 링크가 걸려있지 않음
$ ls -al /etc/localtime
-rw-r--r-- 1 root root 127 Dec 15 21:55 /etc/localtime
# 설정 가능한 타임존 리스트를 확인
$ timedatectl list-timezones |grep -i seoul
Asia/Seoul
# 서울로 타임존 설정
## sudo 권한이 없으면 에러가 남
$ timedatectl set-timezone Asia/Seoul
Failed to set time zone: The name org.freedesktop.PolicyKit1 was not provided by any .service files
## 반드시 sudo 권한 설정해주기
$ sudo timedatectl set-timezone Asia/Seoul
# 타임존이 잘 설정되었는지 확인 > "Time zone" 필드에 Asia/Seoul 로 설정되어 있음
$ timedatectl status
Local time: Sun 2023-01-22 21:50:24 KST
Universal time: Sun 2023-01-22 12:50:24 UTC
RTC time: Sun 2023-01-22 12:50:25
Time zone: Asia/Seoul (KST, +0900)
NTP enabled: yes
NTP synchronized: yes
RTC in local TZ: no
DST active: n/a
# 로컬 시간 확인
$ date
Sun Jan 22 21:55:23 KST 2023
# 설정 후 localtime 파일에도 링크 파일이 설정되어 있음.
$ ls -al /etc/localtime
lrwxrwxrwx 1 root root 32 Jan 22 21:50 /etc/localtime -> ../usr/share/zoneinfo/Asia/Seoul
# hostname 확인
$ hostname
ip-172-31-9-199.ap-northeast-2.compute.internal
# hostname 은 /etc/hostname 파일의 내용을 수정하여 변경 가능
$ cat /etc/hostname
ip-172-31-9-199.ap-northeast-2.compute.internal
# hostnamectl 명령어를 통해서도 변경 가능함
## 파일 보다 명령어를 사용하여 변경하는 것이 더 안전함
## hostnamectl 으로 변경시 sudo 권한 필수
$ sudo hostnamectl set-hostname freelec-springboot2-webservice
## 적용 여부 확인
[ec2-user@ip-*-*-*-* ~]$ cat /etc/hostname
freelec-springboot2-webservice
[ec2-user@ip-*-*-*-* ~]$ hostname
freelec-springboot2-webservice
## $앞에도 hostname이 적용시키려면 세션 재접속하면됨
[ec2-user@ip-*-*-*-* ~]$ exit
logout
Connection to *.*.*.* closed.
pc-local-user $ ssh freelec-springboot2-webservice
Last login: Sun Jan 22 21:33:38 2023 from 118.42.187.187
__| __|_ )
_| ( / Amazon Linux 2 AMI
___|\___|___|
https://aws.amazon.com/amazon-linux-2/
7 package(s) needed for security, out of 8 available
Run "sudo yum update" to apply all updates.
[ec2-user@freelec-springboot2-webservice ~]$
리눅스에서는 호스트 주소를 찾을 때 /etc/hosts 파일을 가장 먼저 검색한다.
다수의 서버로 서비스를 하고 있는 경우, hostname이 hosts 파일에 등록하지 않으면 dns를 검색할 때 시간이 많이 걸려 서비스 지연이나 에러 로그가 발생할 수 있다. (→ [블로그] 우아한 형제들: 빌링 시스템 장애 )
hosts 파일에 현재 서버의 hostname을 등록해주자.
$ cat /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost6 localhost6.localdomain6
127.0.0.1 freelec-springboot2-webservice
$ curl freelec-springboot2-webservice
curl: (7) Failed to connect to freelec-springboot2-webservice port 80 after 0 ms: Connection refused
잘 등록하였다면 다음과 같이 80 포트로 접근이 안된다는 에러가 발생한다.
아직 80포트로 실행된 서비스가 없기 때문에 위와 같이 에러가 발생한다.
curl 호스트 이름으로는 실행이 잘 되었다.
[문서] Amazon Linux2에서 java17 버전 설치 가이드