Script/Bash

EC2의 user data를 사용해 Init Script 작성

jih0ssang 2024. 2. 9. 13:31

참고 블로그: https://velog.io/@_woogie/EC2%EC%8B%9C%EC%9E%91%ED%95%A0-%EB%95%8C-%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8-%EC%9E%90%EB%8F%99%EC%8B%A4%ED%96%89%ED%95%98%EC%97%AC-%EC%84%9C%EB%B2%84-%EB%B0%B0%ED%8F%AC%ED%95%98%EA%B8%B0feat.-pm2

 

https://docs.aws.amazon.com/ko_kr/AWSEC2/latest/UserGuide/user-data.html

서버 재부팅시 자동으로 서비스 올라가는 스크립트를 작성할 것이다.

 

ssh password 로그인 활성화

#!/bin/bash
sudo -i
sed -i 's/PasswordAuthentication no/PasswordAuthentication yes/' /etc/ssh/sshd_config
systemctl restart sshd.service

# Create group 'user01'
groupadd user01

# Create user 'user01' with password '1234'
useradd -g user01 -G wheel -u 1002 user01
echo '1234' | passwd --stdin user01

echo 'user01 ALL=NOPASSWD:ALL' >> /etc/sudoers

 

 

Cloud-init

먼저 cloud-init이 ec2에 설치되어야 한다. Amazon-linux2 기준으로 yum list installed | grep cloud-init 명령어로 패키지가 설치되어있는지 확인한다.

 

EC2의 User data 주의사항

1. sudo 기준이다.
2. root폴더 기준이다. (ec2에 연결하면 home/user01/ 이기 때문에 너무도 당연히 user01 폴더가 기준인줄 알았다.)

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
su - user01 -c "cd /var/www/app/; pm2 start app.js"
--//--

 

 

스크립트 누적 폴더( /var/lib/cloud/instances/instance-id/ )

사용자 데이터 스크립트는 처리 시 /var/lib/cloud/instances/instance-id/에서 복사 및 실행됩니다. 스크립트는 실행 후에는 삭제가 되지 않습니다.

즉, EC2의 User Data는 콘솔상에서 지우거나 변경해도 완전히 삭제된 것이 아니라는 것이다.

 

user01@ip-10-0-10-10 ] $ cd /var/lib/cloud/instances
user01@ip-10-0-10-10 instances] $ ls
i-1111111111111	  i-22222222222222

user01@ip-10-0-10-10 instances] $ cd i-22222222222222 
user01@ip-10-0-10-10 i-22222222222222] $ ls
cloud-config.txt	handlers	scripts	 user-data.txt

user01@ip-10-0-10-10 instances] $ cd scripts
user01@ip-10-0-10-10scripts] $ ls
first_script.txt

 

서버상에서 캐싱이 되어 있으므로 스크립트를 지우거나 변경할 경우, 서버단에서 직접 접속해서 캐싱을 지워야 한다.

 /var/lib/cloud/instances/instance-id/ 경로에 있는 first_script.txt를 반드시 지워야한다.

안그러면 구 버전과 신 버전 스크립트가 동시에 돌아가는 일이 발생한다 ㅠ.ㅠ