본문 바로가기
서버 인프라, 백엔드/아마존 (AWS)

AWS : EC2 User Data를 이용하여 인스턴스 재시작시 원하는 Script 실행시키기

by 번데기 개발자 2023. 10. 27.
반응형

EC2 시작(Launch) 시 사용자 데이터(User Data)를 이용하여 Script 실행

 

EC2에서 맨 처음 생성되었을때 수행할 동작을 사용자 데이터(User Data) 에 정의할수 있는데요, 원하는 스크립트를 기입하면 EC2가 맨 처음 Launch 된 직후에 기입한 명령어들이 수행됩니다. 

 

#!/bin/bash

# Node.js 설치
curl -sL https://deb.nodesource.com/setup_14.x | sudo -E bash -
sudo apt-get install -y nodejs

# pm2 설치
sudo npm install -g pm2

# Git 설치 (필요한 경우)
sudo apt-get install -y git

# 애플리케이션 코드 클론
git clone https://github.com/test/app /var/www/app

# 애플리케이션 코드 디렉토리로 이동
cd /var/www/app

# 애플리케이션 종속성 설치 (package.json에 정의된 종속성)
npm install

# app.js 파일 실행
pm2 start app.js

 

위와 같이 필요한 패키지들과 소스코드를 Clone후에 PM2를 실행시키는 간단한 스크립트를 작성할 수 있습니다.

 

사용자 데이터는 기본적으로 root 권한으로 실행되며 맨 처음 Launch 될때만 수행됩니다. 

 

따라서 EC2가 재부팅되었을때는 사용자 데이터가 적용되지 않습니다.

 

 

EC2 중지(stop) 이후 사용자 데이터 수정하기 

 

 

위와 같이 인스턴스를 중지시키고 EC2의 사용자 데이터(User Data) 를 변경할 수도 있는데요, 이때 인스턴스를 중지시켰다가 다시 시작 시킬때 사용자 데이터가 실행되도록 하려면 추가적인 작업이 필요합니다. 

 

 

EC2가 재시작(reload) 될때 사용자 데이터(User Data) 실행되도록 구성하기

 

EC2 인스턴스가 초기 설정을 할 때 cloud-init 이라는 오픈소스를 패키지를 통해 수행되는데요, cloud-init 기본 설정에서 사용자 데이터는 기본적으로 EC2 인스턴스가 맨 처음 수행될때만 수행되도록 선언되어 있습니다. 아래 경로를 확인해보면 config_scripts_user.once 파일이 기본적으로 구성되어있는것을 확인할 수 있습니다.

 

/var/lib/cloud/sem/config_scripts_user.once

 

 

아래 스크립트를 User Data에 입력하여 EC2 재시작시 사용자 데이터가 수행되도록 설정할 수 있습니다.

 

Content-Type: multipart/mixed; boundary="//"
MIME-Version: 1.0

--//                                       ##--------------- ①
Content-Type: text/cloud-config; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: attachment; filename="cloud-config.txt"

#cloud-config
cloud_final_modules:
- [scripts-user, always]

--//                                       ##--------------- ②                                     
Content-Type: text/x-shellscript; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: attachment; filename="userdata.txt"

#!/bin/bash
/bin/echo "Hello World" >> /tmp/testfile.txt
--//--                                     ##--------------- final

 

  • multipart/mixed : 파일과 텍스트가 혼합되어 있는 형태.
  • boundary : multipart의 구분을 '//' 를 통해 수행
    (즉, --// 첫 부분은 멀티 파트 1번 --// 두번째 부분은 멀티 파트 2번 --//-- 은 끝남을 의미)
  • cloud_final_modules : 여기서 always 로 설정하여 재부팅시에도 User Data를 실행 할 수 있음.
  • #!/bin/bash : 이후에 실행될 스크립트를 입력

 

 

 

EC2가 재시작(reload) 될때 사용자 데이터(User Data) 다시 한번만 수행되도록 돌려놓기

 

만약 원래대로 EC2에 한번만 User Data를 동작하고 싶도록 하려면, EC2에 접속하여 아래와 같이 명령어를 입력하여 user-data.txt와 cloud-config.txt를 초기화하고, config_scripts_user.once 파일을 삭제하고 UserData도 원래대로 돌려놓으면 됩니다.

 

# cat /dev/null > /var/lib/cloud/instances/i-*/user-data.txt
# cat /dev/null > /var/lib/cloud/instances/i-*/cloud-config.txt
# rm -rf /var/lib/cloud/sem/config_scripts_user.once

 

 

 

 

마치며

 

이번에는 사용자 데이터를 통해 EC2의 시작시에 원하는 스크립트를 동작시키는 법을 알아보았습니다. 사용자 데이터는 추후에 Auto-Scaling Group과 같은 AWS의 강력한 기능을 사용할때에도 꼭 필요한 개념이기 때문에 미리 정리를 한번 해보았습니다.

 

앞으로 기회가 되면 ASG 구성 및 Launch Template과 같은 기능도 한번 스터디하여 포스팅해보도록 하겠습니다.

 

감사합니다. 

 

 

 

참고

 

EC2시작할-때-스크립트-자동실행하여-서버-배포하기feat.-pm2

 

https://blog.naver.com/mogulist/221661370156

 

https://repost.aws/ko/knowledge-center/execute-user-data-ec2


https://kim-dragon.tistory.com/2

반응형