Amazon Linux 2 로케일과 타임존 변경

 

이 가이드에서는 Amazon Linux 2 인스턴스의 로케일 & 문자셋과 타임존을 변경하는 방법을 소개합니다.

 

개요 - 1. timezone 설정

EC2 인스턴스의 표준시를 변경하는 방법을 소개합니다.

종종 EC2 인스턴스의 시간을 한국 표준시로 변경해야하는 경우가 있습니다.

제 최근 사례로는 EC2 인스턴스 로컬에서 돌리는 테스트 코드로 인해 생성되는 로그 시간이 협정 세계시UTC, Universal Time Coordinated가 아닌 한국 표준시KST, Korea Standard Time로 찍히도록 해야하는 상황 등이 있었습니다.

 

환경

 

배경지식

 

EC2 타임존 설정

인스턴스 접속

타임존을 설정하기 위해 SSH 또는 SSM Session Manager를 이용해 인스턴스에 원격 접속합니다.

현재 ec2-user 계정으로 EC2 인스턴스에 로그인했습니다.

$ id
uid=1000(ec2-user) gid=1000(ec2-user) groups=1000(ec2-user),4(adm),10(wheel),190(systemd-journal)

 

OS 버전 확인

현재 접속한 인스턴스의 운영체제가 Amazon Linux 2 임을 확인합니다.

$ cat /etc/os-release
NAME="Amazon Linux"
VERSION="2"
ID="amzn"
ID_LIKE="centos rhel fedora"
VERSION_ID="2"
PRETTY_NAME="Amazon Linux 2"
...

인스턴스의 OS 버전이 Amazon Linux 2입니다.

 

현재 타임존 확인

$ timedatectl
      Local time: Tue 2022-05-31 08:58:34 UTC
  Universal time: Tue 2022-05-31 08:58:34 UTC
        RTC time: Tue 2022-05-31 08:58:35
       Time zone: n/a (UTC, +0000)
     NTP enabled: yes
NTP synchronized: yes
 RTC in local TZ: no
      DST active: n/a

현재 설정된 Time zone 값이 n/a이면 협정 세계시UTC를 의미합니다.

 

타임존 목록 확인

전체 타임존 목록 중 Seoul로 검색합니다.

$ timedatectl list-timezones | grep -i seoul
Asia/Seoul

이제 인스턴스의 타임존을 서울 Asia/Seoul로 설정하겠습니다.

 

타임존 변경

타임존을 Asia/Seoul로 변경합니다.

$ sudo timedatectl set-timezone Asia/Seoul

 

타임존 설정 재확인

Time zone 값이 n/a (UTC, +0000)에서 Asia/Seoul (KST, +0900)으로 변경되었습니다.

$ timedatectl
      Local time: Tue 2022-05-31 17:58:59 KST
  Universal time: Tue 2022-05-31 08:58:59 UTC
        RTC time: Tue 2022-05-31 08:59:00
       Time zone: Asia/Seoul (KST, +0900)
     NTP enabled: yes
NTP synchronized: yes
 RTC in local TZ: no
      DST active: n/a

 

date 명령어로 현재 시간을 확인합니다.

$ date
Tue May 31 17:59:01 KST 2022

date 결과도 한국 표준시KST로 출력되는 걸 확인할 수 있습니다.

 

타임존 설정의 유지

위 과정에서 조치한 EC2 타임존 설정은 영구적용이기 때문에 EC2 인스턴스가 리부팅된 후에도 계속 유지됩니다.

$ uptime
 19:49:56 up 0 min,  0 users,  load average: 0.13, 0.03, 0.01

현재 EC2 인스턴스의 업타임을 보면 방금 전 리부팅된 상태입니다.

 

리부팅이 완료된 후 타임존을 확인합니다.

$ timedatectl
      Local time: Tue 2022-05-31 19:49:58 KST
  Universal time: Tue 2022-05-31 10:49:58 UTC
        RTC time: Tue 2022-05-31 10:49:59
       Time zone: Asia/Seoul (KST, +0900)
     NTP enabled: yes
NTP synchronized: yes
 RTC in local TZ: no
      DST active: n/a

EC2 인스턴스를 리부팅한 뒤에도 Time zone 값이 그대로 Asia/Seoul (KST, +0900)로 유지되는 걸 확인할 수 있습니다.

 

참고자료

AWS 공식문서
Amazon Linux의 표준 시간대 변경

 


 

개요 - 2. locale과 charset 설정

이제 Amazon Linux 2 인스턴스에서 locale과 문자셋을 변경하는 방법을 소개합니다.
개발자로부터 외부 연동하는 서버와 한글이 euc-kr로 연동되어야 하는데, ksc5601로 encoding하여 페이로드를 보내도 한글이 깨져서 들어오는 문제가 제보되었습니다.

과거에도 EC2 인스턴스의 charset이 euc-kr로 설정되어 있으면, 한글 연동 시 서버의 문자셋 영향을 받았던 경험이 있었습니다.

 

인스턴스 환경

 

해결방안

Amazon Linux 2가 설치된 EC2 인스턴스에서 문자셋을 ko_KR.euckr로 변경하면 됩니다.
Amazon Linux 2의 문자셋 기본값은 en_US.UTF-8입니다.

 

상세 해결방법

조치 전 설정 확인

$ grep PRETTY_NAME /etc/os-release
PRETTY_NAME="Amazon Linux 2"

현재 locale과 charset을 변경할 EC2 인스턴스의 OS는 Amazon Linux 2입니다.

 

현재 Locale 설정을 확인합니다.

$ locale
LANG=en_US.UTF-8
LC_CTYPE="en_US.UTF-8"
LC_NUMERIC="en_US.UTF-8"
LC_TIME="en_US.UTF-8"
LC_COLLATE="en_US.UTF-8"
LC_MONETARY="en_US.UTF-8"
LC_MESSAGES="en_US.UTF-8"
LC_PAPER="en_US.UTF-8"
LC_NAME="en_US.UTF-8"
LC_ADDRESS="en_US.UTF-8"
LC_TELEPHONE="en_US.UTF-8"
LC_MEASUREMENT="en_US.UTF-8"
LC_IDENTIFICATION="en_US.UTF-8"
LC_ALL=

 

환경변수도 같이 확인합니다.

$ echo $LANG
en_US.UTF-8

LANG 환경변수environment variable를 출력해보면 로케일locale과 문자셋character set 방식을 알 수 있습니다.

 

$ cat /etc/locale.conf
# Created by cloud-init v. 19.3-46.amzn2 on Thu, 15 Dec 2022 05:18:25 +0000
LANG=en_US.UTF-8

 

locale 설정변경

locale 환경변수인 LANG을 ko_KR.euckr로 설정합니다.

$ export LANG=ko_KR.euckr

 

EC2에서 사용 가능한 locale 전체 리스트를 확인합니다.

$ locale -a | grep kr
ko_KR.euckr

 

/etc/locale.conf 설정파일에서 LANG 값을 ko_KR.euckr로 변경합니다.

$ cat /etc/locale.conf
# Created by cloud-init v. 19.3-46.amzn2 on Thu, 15 Dec 2022 05:18:25 +0000
# LANG=en_US.UTF-8
LANG=ko_KR.euckr

 

/etc/sysconfig/i18n 설정파일에서도 LANG 값을 ko_KR.euckr로 변경합니다.

$ cat /etc/sysconfig/i18n
LANG="ko_KR.euckr"

 

설정결과 확인

locale 명령어로 현재 인스턴스에 설정된 언어값을 확인합니다.

$ locale
LANG=ko_KR.euckr
LC_CTYPE="ko_KR.euckr"
LC_NUMERIC="ko_KR.euckr"
LC_TIME="ko_KR.euckr"
LC_COLLATE="ko_KR.euckr"
LC_MONETARY="ko_KR.euckr"
LC_MESSAGES="ko_KR.euckr"
LC_PAPER="ko_KR.euckr"
LC_NAME="ko_KR.euckr"
LC_ADDRESS="ko_KR.euckr"
LC_TELEPHONE="ko_KR.euckr"
LC_MEASUREMENT="ko_KR.euckr"
LC_IDENTIFICATION="ko_KR.euckr"
LC_ALL=

LANG 값이 모두 en_US.UTF-8에서 ko_KR.euckr로 변경된 것을 확인할 수 있습니다.

 

$ env | grep LANG
LANG=ko_KR.euckr

 

인스턴스가 리부팅 가능한 상황인 경우, OS 리부팅 후에도 동일한 locale & charset 설정을 그대로 유지하고 있는 지까지 체크하도록 합니다.

# EC2 리부팅 후 아래 명령어로 확인
$ echo $LANG
$ locale
$ cat /etc/sysconfig/i18n

 

참고자료

AWS EC2 Timezone, Locale 변경하기

타임존 변경
Amazon Linux 2 인스턴스에서 locale 값이 아닌 timezone 변경이 필요한 경우 위 글을 참조합니다.