[EC2] 서버 환경 구성하기

Kaite.Kang·2023년 1월 23일
0
post-thumbnail

* 목표

  • AWS 로 인프라를 구성하기.
  • 프로젝트를 올릴 수 있도록 Linux 설정을 하기.

1. AWS 환경 설정

AWS 에서 무료로 제공하는 리소스를 이용하여 인프라를 구성해보자.

1) ec2 인스턴스 생성

ec2를 포함한 모든 리소스는 서울 리전에 생성한다.

ec2 사양은 다음과 같다.

  • ec2 리소스 사양
리소스종류비고
AMIAmazon Linux2
CPU/Memoryt2.microvCPU 1Core, 메모리 1GB 사양
(보통 vCPU는 물리 CPU 사양의 절반 정도의 성능을 가짐)
VPC/서브넷(네트워크)기본값
스토리지30GB30GB까지 프리티어로 사용 가능
보안 그룹(인바운드)22,8080,443
보안 그룹(아웃바운드)기본값

인스턴스 ssh key인 pem 파일은 다운로드 받아서 저장하자.
ssh 접속을 위해 반드시 필요하다.

  • 생성된 ec2 인스턴스 확인

2) EIP 할당

AWS는 고정 IP를 Elastic IP(EIP, 탄력적 IP)라고 한다.

EIP를 발급 받고, 생성한 EC2와 연결한다.

  • EIP에 EC2 연결하는 방법
    • 리소스 EIP 리스트 > 작업 > 탄력적 IP 주소 연결
  • 연결할 인스턴스 설정
  • 리소스 인스턴스 목록에서 EIP 가 연결되었는지 확인

(주의) EIP는 생성하고 EC2 서버에 연결하지 않으면 비용이 발생한다. 따라서 생성한 EIP는 무조건 EC2에 바로 연결해야 하며 만약 더는 사용할 인스터스가 없을 때도 EIP를 삭제해야 한다.

2. Amazon Linux2 설정

1) java 패키지 설치

IntelliJ에서 프로젝트를 java-17로 구성하였다.

  • IntelliJ에서 프로젝트 java 버전 확인 하는 방법
    • IntelliJ > 파일 > 프로젝트 구조 > 플렛폼 설정 > SDK 에서 프로젝트의 java 버전 확인 가능

서버에서도 어플리케이션이 동작하려면 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

2) 서버 시간 설정

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

3) HostName 변경


# 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 ~]$

4) hosts 에 등록

리눅스에서는 호스트 주소를 찾을 때 /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 호스트 이름으로는 실행이 잘 되었다.

Reference

[문서] Amazon Linux2에서 java17 버전 설치 가이드

[블로그] 우아한 형제들: 빌링 시스템 장애

참고

도서 - 스프링 부트와 AWS로 혼자 구현하는 웹 서비스

0개의 댓글