오늘은 EC2 최초 실행시에 사용할 Shell Script의 사용방법에 대해서 정리해 보겠습니다.

새로 부팅할 서버를 만들 때 마다,

서버에 접속해서 서버실행 명령어를 내리는 것은 비효율적일 수 있습니다.

이럴 때, Shell Script를 사용해 주어서 자동으로 필요한 패키지 설치등이나,

웹서버 실행을 해 주면 되는데요.

오늘은 이것에 대해서 정리해 보도록 하겠습니다.

 

본격적으로 Script를 작성하기 전에,

EC2인스턴스의 이미지를 생성해서,

EC2이미지로부터 생성할 때 스크립트를 적용하는 것에 대해서 정리해 보겠습니다.

참고로 EC2를 생성하는 구체적인 방법에 대해서는 아래글을 참조해 주세요.

>> AWS EC2 서버 론칭하는 방법 정리

 

1. Image 생성 및 EC2 론칭

먼저 EC2 > Inastances 화면에서 아래와 같이,

이미지를 만들 EC2 Instance에서 우측 마우스 버튼으로 Image> Create Image를 선택하거나,

Actions드롭다운 메뉴에서 Create Image를 선택해 줍니다.

 

이제 아래와 같이 이름을 작성해주고 "Create Image"를 클릭 해 주면 됩니다.

 

 

이제 아래와 같이, EC2의 좌측 메뉴에서 Images> AMIs 메뉴를 누르면 Image가 생성된 것을 알 수 있습니다.

선택한 Image를 시작하기 위해서, 상단의 Launch버튼을 눌러 줍니다.

 

 

 

이제 일반적인 EC2 생성과정과 비슷한데요.

서버종류를 설정한 다음, Next를 누르면, 아래와 같이 Instance Detail을 설정하는 부분이 나옵니다.

다른 부분은 평소 EC2 설정에 따라 하면 되는데요.

저희가 주목할 부분은 User data부분입니다.

여기가 저희 Script가 들어갈 부분이기 때문이지요.

이제 Script를 준비해 보겠습니다.

 

 

2. Shell Script 작성 방법

위의 User data부분에 script를 넣어주면 부팅되고 나서,Script가 실행되도록 할 수 있습니다.

물론 UI에 나오는 것처럼 file로도 가능합니다.

 

한가지 알고 있어야 할 것은, 이 script를 실행하는 유저는 root입니다.

따라서 sudo를 굳이 앞에 붙일 필요가 없구요.

또한, 패키지 설치를 할 때 반드시 -y같은 옵션을 붙여주어서,

설치중 yes/no를 물어보아서 process가 멈추는 일이 없도록 해 주어야 합니다.

 

부팅될 Script를 작성하는 방법은 Bash Shell의 Script를 사용할 수도 있구요.

Cloud-init타입으로 작성할 수도 있습니다.

저는 개인적으로 Bash Shell Script를 이용하지만,

Cloud-init타입으로 작성하셔도 문제는 전혀 없습니다.

2-1. Bash Shell Script사용하기

bash shell에서 실행될 수 있도록 하기 위해서,

첫줄은 #!/bin/bash 로 시작해야 하는데요.

이것은 주석이 아니므로 꼭 포함 시켜주어야 합니다.

 

한가지 주의할 것은, 위에서 언급한대로 이 script를 실행하는 주체는 root유저가 되는데요.

보통 AWS에서는 EC2에 접근할 때, ubuntu라는 유저명으로 로그인하도록 하고 있는데요.

이 유저로 만든 디렉토리나 파일에 접근하게 하려면

해당 유저의 홈 디렉토리에서 접근하게 해 주어야 합니다.

 

아래 Script의 세번재 줄을 보면, "/home/ubuntu/test-server"라고 되어 있는데요.

이는 ubuntu유저의 홈 디렉토리 중 "test-server"로 변경하라는 뜻 이지요.

굳이 이렇게 접근하고 싶지 않다면,

#!/bin/bash
echo preparaing docker-compose to dock
cd /home/ubuntu/test-server || exit
docker-compose up -d

 

 

위와 같은 script를 vim이나 nano를 이용해서 shell스크립트를 작성한 후에,

미리 EC2에서 정상적으로 동작하는지 테스트를 해 보는 방법도 좋겠지요.

물론 이렇게 테스트를 할 때에도, Root계정으로 들어가서 Root의 홈 디렉토리에서,

직접 실행해야 실제 환경과 같은 환경에서 테스트 할 수 있겠지요.

 

Bash Shell에서 사용할 명령어들에 대해서는 아래 사이트를 참조하면 도움을 받을 수 있습니다.

http://tldp.org/HOWTO/Bash-Prog-Intro-HOWTO.html

 

2-2. Cloud-init 타입으로 작성

여기에 들어가는 코드는, yaml타입으로 작성할 수 있는데요.

한가지 주의할 점은, 첫줄에 "#cloud-config"는 주석이 아니라,

cloud-init 명령어를 사용하겠다는 의미입니다.

User data는 cloud-init의 Cloud Config 문법을 사용할 수 있습니다.

나머지는 보통 저희가 필요로 하는 방법을 이용해 주면 됩니다.

 

실행시킬 명령어가 있는 곳이 바로,

runcmd의 value부분인데요.

yaml의 array타입으로 아래와 같이 작성해 줄 수 있습니다.

#cloud-config
package_update: true
package_upgrade: true

runcmd:
 - [ sh, -c, "sudo docker-compose up" ]

 

참고로 Cloud-init에 관한 문서는 아래링크를 참조해 주세요.

https://cloudinit.readthedocs.io/en/latest/index.html

 

Bash Shell의 Script타입으로 작성하건, Cloud-init타입으로 작성하였던,

코드를 User Data에 넣어주고 나서,

나머지 EC2를 실행시키는 방법을 기존과 같이 해주면 서버가 생성 되겠지요.

이제는 서버가 시작될 때, 위에서 작성한 코드들이 먼저 실행되게 됩니다.

대신 서버 시작시간은 조금 더 걸리겠지요.

 

3. 실행 Log 보기

만약 원하는 대로 동작하지 않는다면, Log를 볼 필요가 있는데요.

아래 위치의 파일을 보면 해당 로그를 볼 수 있습니다.

빠르게 보고 싶다면, linux의 "cat" 명령어를 이용해 주면 되겠네요.

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

 

4. 주의할 점

위에서 정리한 방법을 이용하면, EC2가 최초에 부팅될 때 실행되도록 할 수는 있지만,

stop시킨 Instance를 재시작할 경우에는 동작하지 않는다는 점에 주의를 해 주어야 합니다.

이러한 경우에 대해서는 아직 명확하게 가이드가 나와 있지는 않는 것으로 알고 있습니다.

 

이상으로 EC2에서 Shell Script 또는 Cloud-init을 이용해서 최초 부팅시 사용할 명령어를 정해주는 방법에 대해서 정리해 보았습니다.

더욱 좋은 내용이 있다면 이 글을 통해서 업데이트 하도록 하겠습니다.

 

728x90

+ Recent posts