시작 시 Linux 인스턴스에서 명령 실행
Amazon EC2에서 인스턴스를 시작할 때 사용자 데이터를 인스턴스에 전달하여 일반적인 구성 작업을 자동으로 수행하는 데 사용하도록 할 수 있고, 인스턴스가 시작된 후에 스크립트를 실행할 수도 있습니다. Amazon EC2에 shell 스크립트 및 cloud-init 명령이라는 두 가지 유형의 사용자 데이터를 전달할 수 있습니다. 인스턴스 시작 마법사에 이 데이터를 일반 텍스트, 파일(명령줄 도구를 사용하여 인스턴스를 시작하는 데 유용) 또는 base64 인코딩 텍스트(API 호출용)로 전달할 수도 있습니다.
더욱 복잡한 자동화 시나리오를 원하는 경우 AWS CloudFormation 또는 AWS OpsWorks를 고려할 수 있습니다. 자세한 내용은 다음 자료를 참조하세요.
-
AWS CloudFormation 사용 설명서의 AWS CloudFormation을 사용하여 Amazon EC2에 애플리케이션 배포.
시작 시 Windows 인스턴스에서 명령을 실행하는 방법은 Windows 인스턴스용 Amazon EC2 사용 설명서에서 시작 시 Windows 인스턴스에서 명령 실행 및 Windows 인스턴스 구성 관리를 참조하세요.
다음 예제에서는 Amazon Linux 2에 LAMP 웹 서버 설치의 명령을 인스턴스 시작 시 실행되는 shell 스크립트 및 cloud-init 명령 세트로 변환합니다. 각 예제에서는 사용자 데이터에 따라 다음 태스크를 수행합니다.
-
배포 소프트웨어 패키지를 업데이트합니다.
-
필요한 웹 서버,
php
및mariadb
패키지를 설치합니다. -
httpd
서비스를 시작하고 systemctl를 통해 활성화합니다. -
apache 그룹에
ec2-user
가 추가됩니다. -
웹 디렉터리 및 해당 디렉터리에 들어 있는 파일에 적절한 소유권과 파일 권한을 설정합니다.
-
간단한 웹 페이지를 생성하여 웹 서버 및 PHP 엔진을 테스트합니다.
목차
필수 조건
이 주제의 예에서는 다음과 같이 가정합니다.
-
사용자 인스턴스에 인터넷에서 접속 가능한 퍼블릭 DNS 이름이 있습니다. 자세한 정보는 네트워크 설정 섹션의 퍼블릭 IP 자동 할당 및 보안 그룹 생성 섹션을 참조하세요.
-
인스턴스와 연결된 보안 그룹은 SSH(포트 22) 트래픽을 허용하도록 구성되어 있으므로 인스턴스에 연결하여 출력 로그 파일을 볼 수 있습니다. 자세한 내용은 보안 그룹 생성 섹션을 참조하세요.
-
인스턴스는 Amazon Linux 2 AMI를 사용하여 시작됩니다. 이러한 명령은 Amazon Linux 2에서만 사용해야 합니다. 다른 Linux 배포에서는 명령이 작동하지 않을 수 있습니다. 다른 배포에 대한 cloud-init 지원 등의 자세한 내용은 해당 설명서를 참조하세요.
사용자 데이터 및 shell 스크립트
shell 스크립트에 익숙한 경우 이 방법은 인스턴스 시작 시 명령을 전송하는 가장 쉽고 완벽한 방법입니다. 부팅 시에 이러한 작업을 추가하면 인스턴스 부팅에 걸리는 시간이 그만큼 늘어납니다. 사용자 스크립트가 성공적으로 완료되었는지 테스트하려면 우선 작업이 완료될 수 있도록 몇 분의 여유 시간을 두어야 합니다.
중요
기본적으로 사용자 데이터 스크립트 및 cloud-init 명령은 최초로 인스턴스를 시작할 때만 실행됩니다. 인스턴스를 재시작할 때마다 사용자 데이터 스크립트 및 cloud-init 명령이 실행되도록 구성을 업데이트할 수 있습니다. 자세한 내용은 AWS 지식 센터에서 사용자 데이터를 활용하여 Amazon EC2 Linux 인스턴스를 다시 시작할 때마다 스크립트를 자동으로 실행하려면 어떻게 해야 하나요?
사용자 데이터 셸 스크립트는 #!
문자 및 스크립트를 읽으려는 인터프리터의 경로(일반적으로 /bin/bash))로 시작되어야 합니다. 셸 스크립팅에 대한 소개는 Linux Documentation Project(tldp.org
사용자 데이터로 입력된 스크립트는 루트 사용자 권한으로 실행되므로 스크립트에 sudo 명령을 사용하지 마세요. 생성하는 모든 파일의 소유권은 루트 사용자에게 있습니다. 루트 이외의 사용자에게 파일 액세스를 허용하려면 스크립트에서 권한을 적절히 수정해야 합니다. 또한 스크립트는 대화형으로 실행되지 않으므로 사용자의 입력이 필요한 명령(예: yum update 플래그 없는 -y
)은 포함할 수 없습니다.
사용자 데이터 스크립트에서 AWS CLI를 포함한 AWS API를 사용하는 경우 인스턴스를 시작할 때 인스턴스 프로파일을 사용해야 합니다. 인스턴스 프로필은 사용자 데이터 스크립트에서 API 호출을 실행하는 데 필요한 적절한 AWS 자격 증명을 제공합니다. 자세한 내용은 IAM 사용 설명서의 인스턴스 프로파일 사용을 참조하세요. IAM 역할에 할당하는 권한은 API를 사용하여 호출하는 서비스에 따라 다릅니다. 자세한 내용은 Amazon EC2의 IAM 역할을 참조하세요.
cloud-init 출력 로그 파일이 콘솔 출력을 캡처하므로 시작 후 인스턴스가 의도한 대로 동작하지 않더라도 스크립트를 손쉽게 디버깅할 수 있습니다. 로그 파일을 보려면 인스턴스에 연결하여 /var/log/cloud-init-output.log
를 엽니다.
사용자 데이터 스크립트는 처리 시 /var/lib/cloud/instances/
에서 복사 및 실행됩니다. 스크립트는 실행 후에는 삭제가 되지 않습니다. instance-id
//var/lib/cloud/instances/
사용자 데이터를 파싱할 수 있는 스크립트가 AMI 인스턴스에 필요하다고 언급했습니다. 그렇지 않은 경우, 스크립트는 AMI에서 시작된 어떤 인스턴스에서든 이 디렉터리에 존재합니다.instance-id
/
사용자 데이터 및 콘솔
인스턴스를 시작할 때 인스턴스 사용자 데이터를 지정할 수 있습니다. 인스턴스의 루트 볼륨이 EBS 볼륨이면 인스턴스를 중지하고 사용자 데이터를 업데이트할 수도 있습니다.
시작 시 인스턴스 사용자 데이터 지정
인스턴스 시작 절차를 따릅니다. 사용자 데이터(User data) 필드는 인스턴스 시작 마법사의 고급 세부 정보 섹션에 있습니다. 사용자 데이터(User data) 필드에 쉘 스크립트를 입력한 다음 인스턴스 시작 절차를 완료합니다.
아래 예제 스크립트에서는 스크립트를 통해 웹 서버를 생성하고 구성합니다.
#!/bin/bash yum update -y amazon-linux-extras install -y lamp-mariadb10.2-php7.2 php7.2 yum install -y httpd mariadb-server systemctl start httpd systemctl enable httpd usermod -a -G apache ec2-user chown -R ec2-user:apache /var/www chmod 2775 /var/www find /var/www -type d -exec chmod 2775 {} \; find /var/www -type f -exec chmod 0664 {} \; echo "<?php phpinfo(); ?>" > /var/www/html/phpinfo.php
인스턴스가 시작되고 스크립트의 명령이 실행되도록 충분한 시간을 허용한 후 스크립트에서 의도된 태스크를 완료했는지 확인합니다.
이 예제의 경우 스크립트가 생성한 PHP 테스트 파일의 URL을 웹 브라우저에 입력합니다. 이 URL은 인스턴스의 퍼블릭 DNS 주소에 슬래시(/)와 파일 이름이 추가된 형태입니다.
http://my.public.dns.amazonaws.com
/phpinfo.php
PHP 정보 페이지가 표시되어야 합니다. PHP 정보 페이지가 표시되지 않는 경우 사용하고 있는 보안 그룹이 HTTP(포트 80) 트래픽을 허용하는 규칙을 포함하고 있는지 확인하세요. 자세한 내용은 보안 그룹에 규칙 추가 섹션을 참조하세요.
(선택 사항) 스크립트에서 의도한 작업을 완료하지 못했거나 스크립트가 오류 없이 완료되었는지 여부를 확인하려는 경우 인스턴스에 연결하여 cloud-init 출력 로그 파일(/var/log/cloud-init-output.log
)을 조사하고 출력에서 오류 메시지를 찾아 봅니다.
다음 명령을 사용하여 cloud-init 데이터 섹션을 포함하는 Mime 멀티파트 아카이브를 생성하면 자세한 디버깅 정보를 확인할 수 있습니다.
output : { all : '| tee -a /var/log/cloud-init-output.log' }
이 명령은 스크립트의 명령 출력을 /var/log/cloud-init-output.log
로 전송합니다. cloud-init 데이터 형식 및 Mime 멀티파트 아카이브를 생성하는 방법에 대한 자세한 내용은 cloud-init 형식
인스턴스 사용자 데이터 보기 및 업데이트
인스턴스 사용자 데이터를 업데이트하려면 먼저 인스턴스를 중단해야 합니다. 인스턴스가 실행 중인 경우 사용자 데이터를 볼 수 있지만 수정할 수는 없습니다.
주의
인스턴스를 중지하면 인스턴스 스토어 볼륨의 데이터가 삭제됩니다. 인스턴스 스토어 볼륨의 데이터를 유지하려면 영구 스토리지에 백업하세요.
인스턴스 사용자 데이터를 수정하려면
https://console.aws.amazon.com/ec2/
에서 Amazon EC2 콘솔을 엽니다. -
탐색 창에서 인스턴스(Instances)를 선택합니다.
-
인스턴스를 선택하고 인스턴스 상태, 인스턴스 중지를 차례로 선택합니다. 이 옵션이 비활성화되어 있으면 해당 인스턴스가 이미 중지되었거나 해당 루트 디바이스가 인스턴스 스토어 볼륨인 것입니다.
-
확인 메시지가 표시되면 [Stop]을 선택합니다. 인스턴스가 중지하는 데 몇 분 정도 걸릴 수 있습니다.
-
인스턴스가 선택된 상태에서 작업(Actions), 인스턴스 설정(Instance settings), 사용자 데이터 편집(Edit user data)을 차례로 선택합니다.
-
필요에 따라 사용자 데이터를 수정한 다음 저장(Save)을 선택합니다.
-
인스턴스를 시작합니다. 새 사용자 데이터는 인스턴스를 시작한 후에 인스턴스에 표시되지만 사용자 데이터 스크립트가 실행되지는 않습니다.
사용자 데이터 및 cloud-init 명령
cloud-init 패키지는 새 Amazon Linux 인스턴스가 시작될 때의 특정 측면을 구성합니다. 가장 널리 사용되는 기능은 사용자가 자신의 프라이빗 키로 로그인할 수 있도록 ec2-user의 .ssh/authorized_keys
파일을 구성하는 것입니다. cloud-init 패키지가 Amazon Linux 인스턴스에 대해 수행하는 구성 태스크에 대한 자세한 내용은 cloud-init 섹션을 참조하세요.
cloud-init 사용자 명령을 인스턴스 시작 시에 전달하는 방법은 스크립트를 전달하는 방법과 동일하지만 구문은 서로 다릅니다. cloud-init에 대한 자세한 내용은 http://cloudinit.readthedocs.org/en/latest/index.html
중요
기본적으로 사용자 데이터 스크립트 및 cloud-init 명령은 최초로 인스턴스를 시작할 때만 실행됩니다. 인스턴스를 재시작할 때마다 사용자 데이터 스크립트 및 cloud-init 명령이 실행되도록 구성을 업데이트할 수 있습니다. 자세한 내용은 AWS 지식 센터에서 사용자 데이터를 활용하여 Amazon EC2 Linux 인스턴스를 다시 시작할 때마다 스크립트를 자동으로 실행하려면 어떻게 해야 하나요?
부팅 시에 이러한 작업을 추가하면 인스턴스 부팅에 걸리는 시간이 그만큼 늘어납니다. 사용자 데이터 명령이 완료되었는지 테스트하려면 우선 작업이 완료될 수 있도록 몇 분의 여유 시간을 두어야 합니다.
인스턴스에 사용자 데이터로 cloud-init 명령을 전달하려면 다음을 수행합니다.
-
인스턴스 시작 절차를 따릅니다. 사용자 데이터(User data) 필드는 인스턴스 시작 마법사의 고급 세부 정보 섹션에 있습니다. 사용자 데이터(User data) 필드에 cloud-init 지시문 텍스트를 입력한 다음 인스턴스 시작 절차를 완료합니다.
아래 예제에서는 명령을 통해 Amazon Linux 2에서 웹 서버를 생성하고 구성합니다. 명령을 cloud-init 명령으로 식별하려면 상단에
#cloud-config
행을 추가해야 합니다.#cloud-config repo_update: true repo_upgrade: all packages: - httpd - mariadb-server runcmd: - [ sh, -c, "amazon-linux-extras install -y lamp-mariadb10.2-php7.2 php7.2" ] - systemctl start httpd - sudo systemctl enable httpd - [ sh, -c, "usermod -a -G apache ec2-user" ] - [ sh, -c, "chown -R ec2-user:apache /var/www" ] - chmod 2775 /var/www - [ find, /var/www, -type, d, -exec, chmod, 2775, {}, \; ] - [ find, /var/www, -type, f, -exec, chmod, 0664, {}, \; ] - [ sh, -c, 'echo "<?php phpinfo(); ?>" > /var/www/html/phpinfo.php' ]
-
인스턴스가 시작되고 사용자 데이터의 명령이 실행되도록 충분한 시간을 허용한 후 명령에서 의도된 태스크를 완료했는지 확인합니다.
이 예제의 경우 명령에서 생성한 PHP 테스트 파일의 URL을 웹 브라우저에 입력합니다. 이 URL은 인스턴스의 퍼블릭 DNS 주소에 슬래시(/)와 파일 이름이 추가된 형태입니다.
http://
my.public.dns.amazonaws.com
/phpinfo.phpPHP 정보 페이지가 표시되어야 합니다. PHP 정보 페이지가 표시되지 않는 경우 사용하고 있는 보안 그룹이 HTTP(포트 80) 트래픽을 허용하는 규칙을 포함하고 있는지 확인하세요. 자세한 내용은 보안 그룹에 규칙 추가 섹션을 참조하세요.
-
(선택 사항) 명령에서 의도한 작업을 완료하지 못했거나 명령이 오류 없이 완료되었는지 여부를 확인하려는 경우 인스턴스에 연결하여 출력 로그 파일(
/var/log/cloud-init-output.log
)을 조사하고 출력에서 오류 메시지를 찾아 봅니다. 명령에 다음 줄을 추가하면 자세한 디버깅 정보를 확인할 수 있습니다.output : { all : '| tee -a /var/log/cloud-init-output.log' }
이 명령은 runcmd 출력을
/var/log/cloud-init-output.log
로 전송합니다.
사용자 데이터 및 AWS CLI
AWS CLI를 사용하여 인스턴스의 사용자 데이터를 지정, 수정 및 확인할 수 있습니다. 인스턴스 메타데이터를 사용하여 인스턴스의 사용자 데이터를 보는 방법에 대한 자세한 내용은 인스턴스 사용자 데이터 검색 섹션을 참조하세요.
Windows에서 AWS Tools for Windows PowerShell를 사용하는 대신 AWS CLI을 사용할 수 있습니다. 자세한 내용은 Windows 인스턴스용 Amazon EC2 사용 설명서의 사용자 데이터 및 Tools for Windows PowerShell을 참조하세요.
예: 시작 시 사용자 데이터 지정
인스턴스를 시작할 때 사용자 데이터를 지정하려면 run-instances 명령을 --user-data
파라미터와 함께 사용합니다. run-instances를 사용하면 AWS CLI에서는 사용자 데이터의 base64 인코딩을 수행합니다.
다음 예에서는 스크립트를 명령줄에서 문자열로 지정하는 방법을 보여줍니다.
aws ec2 run-instances --image-id ami-
abcd1234
--count1
--instance-typem3.medium
\ --key-namemy-key-pair
--subnet-id subnet-abcd1234
--security-group-ids sg-abcd1234
\ --user-dataecho user data
다음 예에서는 텍스트 파일을 사용하여 스크립트를 지정하는 방법을 보여줍니다. file://
접두사를 사용하여 파일을 지정해야 합니다.
aws ec2 run-instances --image-id ami-
abcd1234
--count1
--instance-typem3.medium
\ --key-namemy-key-pair
--subnet-id subnet-abcd1234
--security-group-ids sg-abcd1234
\ --user-data file://my_script.txt
다음은 shell 스크립트가 포함된 텍스트 파일의 예입니다.
#!/bin/bash yum update -y service httpd start chkconfig httpd on
예: 중지된 인스턴스의 사용자 데이터 수정
modify-instance-attribute 명령을 사용하여 중지된 인스턴스의 사용자 데이터를 수정할 수 있습니다. modify-instance-attribute를 사용하여 AWS CLI는 사용자 데이터의 base64 인코딩을 수행하지 않습니다.
-
Linux 컴퓨터에서 base64 명령을 사용하여 사용자 데이터를 인코딩합니다.
base64 my_script.txt >my_script_base64.txt
-
Windows 컴퓨터에서 certutil 명령을 사용하여 사용자 데이터를 인코딩합니다. AWS CLI에서 이 파일을 사용하기 전에 첫 번째(인증서 시작) 줄과 마지막(인증서 종료) 줄을 제거해야 합니다.
certutil -encode my_script.txt my_script_base64.txt notepad my_script_base64.txt
--attribute
및 --value
파라미터를 사용하여 인코딩된 텍스트 파일로 사용자 데이터를 지정합니다. file://
접두사를 사용하여 파일을 지정해야 합니다.
aws ec2 modify-instance-attribute --instance-id
i-1234567890abcdef0
--attribute userData --value file://my_script_base64.txt
예: 중지된 인스턴스의 사용자 데이터 삭제
기존 사용자 데이터를 삭제하려면 다음과 같이 modify-instance-attribute 명령을 사용합니다.
aws ec2 modify-instance-attribute --instance-id
i-1234567890abcdef0
--user-data Value=
예: 사용자 데이터 보기
인스턴스의 사용자 데이터를 가져오려면 describe-instance-attribute 명령을 사용합니다. describe-instance-attribute를 사용하여 AWS CLI는 사용자 데이터의 base64 디코딩을 수행하지 않습니다.
aws ec2 describe-instance-attribute --instance-id
i-1234567890abcdef0
--attribute userData
다음은 사용자 데이터 base64가 인코딩된 출력의 예입니다.
{
"UserData": {
"Value": "IyEvYmluL2Jhc2gKeXVtIHVwZGF0ZSAteQpzZXJ2aWNlIGh0dHBkIHN0YXJ0CmNoa2NvbmZpZyBodHRwZCBvbg=="
},
"InstanceId": "i-1234567890abcdef0"
}
-
Linux 컴퓨터에서
--query
옵션을 사용하여 인코딩된 사용자 데이터를 가져오고, base64 명령을 사용하여 이를 디코딩합니다.aws ec2 describe-instance-attribute --instance-id
i-1234567890abcdef0
--attribute userData --output text --query "UserData.Value" | base64 --decode -
Windows 컴퓨터에서
--query
옵션을 사용하여 코딩된 사용자 데이터를 가져오고, certutil 명령을 사용하여 이를 디코딩합니다. 인코딩된 출력과 디코딩된 출력은 각각 다른 파일에 저장됩니다.aws ec2 describe-instance-attribute --instance-id
i-1234567890abcdef0
--attribute userData --output text --query "UserData.Value" >my_output.txt certutil -decode my_output.txt my_output_decoded.txt type my_output_decoded.txt
다음은 예시 출력입니다.
#!/bin/bash
yum update -y
service httpd start
chkconfig httpd on
셸 스크립트와 cloud-init 지시문 결합
기본적으로 사용자 데이터에는 한 번에 하나의 콘텐츠 유형만 포함할 수 있습니다. 그러나 MIME 멀티 파트 파일에서 text/cloud-config
및 text/x-shellscript
콘텐츠 유형을 사용하여 사용자 데이터에 셸 스크립트와 cloud-init 지시문을 모두 포함할 수 있습니다.
다음은 MIME 멀티 파트 형식을 보여줍니다.
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-init directives
--// Content-Type: text/x-shellscript; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Content-Disposition: attachment; filename="userdata.txt" #!/bin/bashshell script commands
--//--
예를 들어, 다음 사용자 데이터에는 cloud-init 지시문과 bash 셸 스크립트가 포함됩니다. cloud-init 지시문은 파일(/test-cloudinit/cloud-init.txt
)을 생성하고 해당 파일에 Created by cloud-init
를 씁니다. bash 셸 스크립트는 파일(/test-userscript/userscript.txt
)을 생성하고 해당 파일에 Created by bash shell script
를 씁니다.
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 runcmd: - [ mkdir, /test-cloudinit ] write_files: - path: /test-cloudinit/cloud-init.txt content: Created by cloud-init --// Content-Type: text/x-shellscript; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Content-Disposition: attachment; filename="userdata.txt" #!/bin/bash mkdir test-userscript touch /test-userscript/userscript.txt echo "Created by bash shell script" >> /test-userscript/userscript.txt --//--