Amazon Linux 2 로케일과 타임존 변경
이 가이드에서는 Amazon Linux 2 인스턴스의 로케일 & 문자셋과 타임존을 변경하는 방법을 소개합니다.
개요 - 1. timezone 설정
EC2 인스턴스의 표준시를 변경하는 방법을 소개합니다.
종종 EC2 인스턴스의 시간을 한국 표준시로 변경해야하는 경우가 있습니다.
제 최근 사례로는 EC2 인스턴스 로컬에서 돌리는 테스트 코드로 인해 생성되는 로그 시간이 협정 세계시UTC, Universal Time Coordinated가 아닌 한국 표준시KST, Korea Standard Time로 찍히도록 해야하는 상황 등이 있었습니다.
환경
- OS : Amazon Linux 2
- Shell : bash
배경지식
- Amazon Linux 2 인스턴스는 기본적으로 UTC협정 세계시 표준 시간대로 설정됩니다.
- 타임존을 변경하게 되면 인스턴스를 리부팅 해도 타임존 설정은 그대로 유지됩니다.
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로 설정되어 있으면, 한글 연동 시 서버의 문자셋 영향을 받았던 경험이 있었습니다.
인스턴스 환경
- OS : Amazon Linux 2
- CPU 아키텍처 : aarch64 (
t4g.small
) - AMI ID : ami-0ae9ae3937eac86b9
- AMI Name : amzn2-ami-ecs-hvm-2.0.20221213-arm64-ebs
- Shell : bash
해결방안
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
참고자료
타임존 변경
Amazon Linux 2 인스턴스에서 locale 값이 아닌 timezone 변경이 필요한 경우 위 글을 참조합니다.