본문으로 건너뛰기

EC2 부팅시 Shell실행

EC2인스턴스를 부팅, 혹은 재부팅 할때 실행시키고 싶은 쉘, 혹은 프로그램이 있다면 이렇게 설정하자
rc.d부분을 만지는 방법 / systemctl 의 serviced 를 만지는 방법등이 있는데 idc센터 같은곳에서 사용하는 방법이다.
AWS 인스턴스 같은 경우는 AWS에서 안내하는 방법대로 하는것이 맞다.


링크 : 공홈(user-date-cloud-init)
링크 : 공홈(사용자 데이터를 활용하여 Amazon EC2 Linux 인스턴스를 다시 시작할 때마다 스크립트를 자동으로 실행하려면 어떻게 해야 하나요?)
링크 : 클래스메서드

기본 사용에 관하여

  1. 인스턴스를 중지 해야만 사용자 데이터 편집이 가능하다. 인스턴스를 잠시 중시하자
  2. 인스턴스 오른쪽 클릭 -> 인스턴스 설정 -> 사용자 데이터 편집 을 누른다.
  3. 밑의 내용처럼 작성해서 복붙하자 #!/bin/bash 부분이 기동할 때 내가 실행시키고 싶은 쉘 스크립트 이다.

    참고로, 프로그램 상에서 로그출력 디렉토리를 상대 디렉토리로 했다면, cd / (최상위 루트 디렉토리)에 로그파일이 저장된다. 프로그램 내부에서 절대 경로로 바꿔주자.
    왜냐면, 이 기동 쉘스크립트 실행의 경우는 루트 디렉토리를 기준으로 실행하기 때문이다

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
/usr/bin/nohup python3 /home/ec2-user/laboratory/while_error.py > /dev/null &
--//--

이런식으로 확인이 가능하다고 한다

$ pwd
/var/lib/cloud/instances/i-06bd137d0b020fae3

$ ls -F1
cloud-config.txt
datasource
handlers/
obj.pkl
scripts/
sem/
user-data.txt
user-data.txt.i
vendor-data.txt
vendor-data.txt.i

$ cat user-data.txt
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
--//--

$ cat cloud-config.txt
#cloud-config

# from 1 files
# cloud-config.txt

---
cloud_final_modules:
- - scripts-user
- always
...

$ cat scripts/userdata.txt
#!/bin/bash
/bin/echo "Hello World" >> /tmp/testfile.txt

/var/lib/cloud/instances/까지 가면 instance id 가 나와있는 링크가 있는데, 그 경로를 복붙해서 cd /var/lib/cloud/instances/idfdf 이런식으로 하면 해당 user데이터 파일이 있는곳으로 갈 수 있다


경험했던 문제

부팅시의 쉘 스크립트 실행은 루트 유저로 진행되기 때문에 루트 유저로 의존성 라이브러리를 미리 설치해둬야 한다.

sudo pip3 install requests
sudo pip3 install bs4
sudo pip3 install pybit
.
.

만약 유저데이터 mime타입으로 설정해놨는데도 불구하고 실행이 안되거나 동작하지 않는다면 로그를 확인하자

로그 기록은 이쪽이다

/var/log/cloud-init-output.log

이런식으로 문제발생 원인을 확인 하는것이 가능했다

Traceback (most recent call last):
File "/home/ec2-user/test/Bybit_TradingBot_Test_XRPUSDT.py", line 5, in <module>
import requests
ModuleNotFoundError: No module named 'requests'

루트 유저로써의 실행이기 때문에 루트 유저로써의 환경변수가 필요하다.

유저 데이터 쉘 스크립트 적는곳에 환경변수를 적어주자
복수의 쉘 스크립트를 실행하든, 한줄에 &연산자로 연결해서 실행하든 상관없다.
쉘에서 쉘을 불러도 상관없다.

실제로 정상작동하는 example

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
export AWS_MONGO_DB_URL=11.11.11.11
export AWS_MONGO_DB_PORT=17017
/usr/bin/nohup /home/ec2-user/check_bot.sh > /home/ec2-user/prod/check_bot.log &
/usr/bin/nohup python3 /home/ec2-user/test/Bybit_TradingBot_Test.py > /dev/null &
--//--

부팅시의 쉘 스크립트 실행은 cloud-init 쪽과 관련이 있다.
여러가지 설정이나 커스터마이징 같은것을 하게 된다면 이쪽을 참고하는것도 좋다.
링크 : 공홈 cloud-init


이거는 박아놓자

sudo yum update -y

가끔 업데이트 하라고 하는데, 재부팅 할때마다 자동으로 하게 해놓는거니 편해진다