June/AWS

AWS EC2 인스턴스 종료시 스크립트 수행

개요

가끔 인스턴스를 작업하면서 인스턴스가 종료되기 전 어떤 것이든 동작을 수행해야할 때가 있다.
예를들면 아래의 경우가 그러하다.
- 해당 서버의 로그를 특정 데이터 서버로 업로드할 경우.
앞서서 배포의 방식을 롤링에서 블루그린으로 전환하면서, 기존의 인스턴스들이 삭제되기 시작하였다.
그래서 인스턴스가 지워지기 전 소 중 한 로그 들을 S3에 업로드 하는 스크립트를 제작해 보았다.

환경

환경은 Amazone Linux 2 이다.
Amazone 계열의 리눅스는 RHEL 7환경이 기반이다.
CentOS로 따지면 버전 7 과 동급이기 때문에, 아래의 방법들은 
CentOS7 혹은 Amazone Linux 2 이상의 환경에서만 적용된다.

방법

리눅스의 시스템은 부팅이 시작, 종료, 중지 등
여러 가지 상황이 주어질 때마다 시스템 코드(?) 시스템 시그널을 보낸다.
해당 시그널을 캐치하여, 원하는 동작이 원하는 때에 이뤄지도록 구상한다.

CentOS 7 은,
systemd 로 시스템 명령어를 사용한다.
그 이전버전의 service 명령어를 사용하는 계열들은 다른 방법을 써야 하니 주의하자.
(CentOS6는 init 프로세스를 사용한다)

구현

  • 첫번째로, 원하는 동작을 수행하는 스크립트를 작성한다.
    필자의 경우 S3에 업로드 하는 스크립트를 작성하였다.
    해당 스크립트는 각자의 환경에 맞게 파이썬으로 작성하거나 shell 명령어로 쉽게 만들 수 있다.
    그러므로 생략한다.

  • /usr/local/sbin/~~~.sh 스크립트 생성
    해당 경로에 아래와 같은 스크립트를 생성하여 준다.
#!/bin/bash
REBOOT=$( systemctl list-jobs | egrep -q 'reboot.target.*start' && echo "rebooting" || echo "not_rebooting" )
if [ $REBOOT = "not_rebooting" ]; then
    sh /data/inst/bin/log/logtoS3-shutdown-manager.sh
fi

해당 스크립트는 시스템 시그널을 캐치하는 스크립트이고.
그 아래에는 s3에 업로드할 목적으로 내가 생성한 스크립트를 실행하는 명령어 이다.
if문이 들어간 이유는 shutdown시 발생하는 시그널과 reboot일때 발생하는 시그널을 구분하기 위함이다.

  • chmod 755 uploadLogsOnShutdown.sh
    해당 경로에 가서, 방금 만든 스크립트 파일에 실행권한을 부여한다.
  • /etc/systemd/system/uploadLogsOnShutdown.service 생성
    해당 스크립트는 위에서 만든 스크립트와 동일한 이름에 뒤에 확장자만 .service로 변경해 준다.
[Unit]
Description=upload log files at shutdown
DefaultDependencies=no
Before=shutdown.target halt.target
  
[Service]
Type=oneshot
ExecStart=/usr/local/sbin/uploadLogsOnShutdown.sh
  
[Install]
WantedBy=halt.target shutdown.target

위의 스크립트는 shutdown 시그널을 잡기 위한 시그널이다.
해당 시그널이 캐치 되었을 때, ExecStart가 동작하면서 /urs/local/sbin의 스크립트 파일을 수행하고,
이는 곧 shutdown인지 reboot인지를 판별하여 내가 원하는 동작을 수행하는 원리이다.

  • systemctl enable uploadLogsOnShutdown.service

    위의 명령어로 systemctl 리스트에 항목을 추가해준다.
    (해당 서비스를 list-unit으로 조회하였을때 inactive로 떠야 정상이다.

참조

나도 아래의 링크들을 찾아가며 정리한 것이라서, 추가적인 설명이 필요하다면 참고해보자!

https://medium.com/tensult/automatic-log-pushing-from-ec2-instance-to-s3-bucket-using-lifecycle-hook-9c08fc1ddf2e
https://blog.fourninecloud.com/auto-scaling-lifecycle-hooks-to-export-server-logs-when-instance-terminating-58e06d7c0d6a

https://fitzcarraldoblog.wordpress.com/2018/01/13/running-a-shell-script-at-shutdown-only-not-at-reboot-a-comparison-between-openrc-and-systemd/