메뉴
Amazon Elastic Compute Cloud
User Guide for Linux Instances

시작 시 Linux 인스턴스에서 명령 실행

Amazon EC2에서 인스턴스를 시작할 때 사용자 데이터를 인스턴스에 전달하여 일반적인 구성 작업을 자동으로 수행하는 데 사용하도록 할 수 있고, 인스턴스가 시작된 후에 스크립트를 실행할 수도 있습니다. Amazon EC2에 shell 스크립트 및 cloud-init 명령이라는 두 가지 유형의 사용자 데이터를 전달할 수 있습니다. 시작 마법사에 이 데이터를 일반 텍스트, 파일(명령줄 도구를 사용하여 인스턴스를 시작하는 데 유용) 또는 base64 인코딩 텍스트(API 호출용)로 전달할 수도 있습니다.

더욱 복잡한 자동화 시나리오를 원하는 경우 AWS CloudFormation 또는 AWS OpsWorks를 사용할 수 있습니다. 자세한 내용은 AWS CloudFormation 사용 설명서AWS OpsWorks User Guide 단원을 참조하십시오.

시작 시 Windows 인스턴스에서 명령 실행에 대한 정보는 Windows 인스턴스용 Amazon EC2 사용 설명서에서 사용자 데이터 실행Windows 인스턴스 구성 관리 단원을 참조하십시오.

다음 예제에서는 LAMP 웹 서버 설치 자습서의 명령을 인스턴스 시작 시 실행되는 shell 스크립트 및 cloud-init 명령 세트로 변환합니다. 각 예제에서는 사용자 데이터에 따라 다음 작업을 실행합니다.

  • 배포 소프트웨어 패키지를 업데이트합니다.

  • 필요한 웹 서버, phpmysql 패키지를 설치합니다.

  • httpd 서비스를 시작하고 chkconfig를 통해 활성화합니다.

  • www 그룹을 추가하고 해당 그룹에 ec2-user를 추가합니다.

  • 웹 디렉터리 및 해당 디렉터리에 들어 있는 파일에 적절한 소유권과 파일 권한을 설정합니다.

  • 간단한 웹 페이지를 생성하여 웹 서버 및 PHP 엔진을 테스트합니다.

기본적으로 사용자 데이터 및 cloud-init 명령은 인스턴스 시작 시 최초 부팅 주기에서만 실행됩니다. 그러나 AWS Marketplace 공급업체와 타사 AMI 소유자가 스크립트 실행 방식과 시기를 원하는 대로 사용자 지정했을 수 있습니다.

사전 조건

다음 예제에서는 인터넷에서 접속 가능한 퍼블릭 DNS 이름이 인스턴스에 지정되었다고 가정합니다. 자세한 내용은 1단계: 인스턴스 시작을 참조하십시오. 또한 SSH(포트 22), HTTP(포트 80), HTTPS(포트 443) 연결을 허용하도록 보안 그룹을 구성해야 합니다. 이 사전 요구사항에 대한 자세한 내용은 Amazon EC2로 설정을 참조하십시오.

또한 이러한 명령은 Amazon Linux에만 사용해야 합니다. 다른 Linux 배포에서는 명령이 작동하지 않을 수 있습니다. 다른 배포에 대한 cloud-init 지원 등의 자세한 내용은 해당 설명서를 참조하십시오.

사용자 데이터 및 shell 스크립트

shell 스크립트에 익숙한 경우 이 방법은 인스턴스 시작 시 명령을 전송하는 가장 쉽고 완벽한 방법입니다. cloud-init 출력 로그 파일(/var/log/cloud-init-output.log)이 콘솔 출력을 캡처하므로 시작 후 인스턴스가 의도한 대로 동작하지 않더라도 스크립트를 손쉽게 디버깅할 수 있습니다.

중요

사용자 데이터 스크립트 및 cloud-init 명령은 인스턴스 시작 시 최초 부팅 주기에서만 실행됩니다.

사용자 데이터 shell 스크립트는 #! 문자 및 스크립트를 읽을 인터프리터의 경로(일반적으로 /bin/bash))로 시작되어야 합니다. shell 스크립트에 대한 자세한 소개는 Linux Documentation Project(tldp.org)에서 BASH Programming - Introduction HOW-TO 단원을 참조하십시오.

사용자 데이터로 입력된 스크립트는 root 사용자 권한으로 실행되므로 스크립트에 sudo 명령을 사용하지 마십시오. 생성하는 모든 파일의 소유권은 root에 있습니다. 루트 이외의 사용자에게 파일 액세스를 허용하려면 스크립트에서 권한을 적절히 수정해야 합니다. 또한 스크립트는 대화형으로 실행되지 않으므로 사용자의 입력이 필요한 명령(예: -y 플래그 없는 yum update)은 포함할 수 없습니다.

부팅 시에 이러한 작업을 추가하면 인스턴스 부팅에 걸리는 시간이 그만큼 늘어납니다. 사용자 스크립트가 성공적으로 완료되었는지 테스트하려면 우선 작업이 완료될 수 있도록 몇 분의 여유 시간을 두어야 합니다.

인스턴스에 사용자 데이터로 shell 스크립트를 전달하려면 다음을 수행합니다.

  1. AMI에서 인스턴스 시작의 인스턴스 시작 절차를 따르되, 단계 6까지 진행하고 [User data] 필드에 사용자 데이터 스크립트 텍스트를 붙여넣은 후 시작 절차를 완료합니다. 아래 예제에서는 스크립트가 웹 서버를 생성하고 구성합니다.

    Copy
    #!/bin/bash yum update -y yum install -y httpd24 php56 mysql55-server php56-mysqlnd service httpd start chkconfig httpd on groupadd www usermod -a -G www ec2-user chown -R root:www /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
  2. 인스턴스가 시작되고 스크립트의 명령이 실행되도록 충분한 시간을 허용한 후 스크립트에서 의도된 작업을 완료했는지 확인합니다. 이 예제의 경우 스크립트가 생성한 PHP 테스트 파일의 URL을 웹 브라우저에 입력합니다. 이 URL은 인스턴스의 퍼블릭 DNS 주소에 슬래시(/)와 파일 이름이 추가된 형태입니다.

    http://my.public.dns.amazonaws.com/phpinfo.php

    PHP 정보 페이지가 표시되어야 합니다. PHP 정보 페이지가 표시되지 않는 경우 사용하고 있는 보안 그룹이 HTTP(포트 80) 트래픽을 허용하는 규칙을 포함하고 있는지 확인하십시오. 자세한 내용은 보안 그룹에 규칙 추가 단원을 참조하십시오.

  3. (선택 사항) 스크립트에서 의도한 작업을 완료하지 못했거나 스크립트가 오류 없이 완료되었는지 여부를 확인하려는 경우 /var/log/cloud-init-output.log의 cloud-init 출력 로그 파일을 조사하여 출력에서 오류 메시지를 찾아 봅니다.

    다음 명령을 사용하여 cloud-init 데이터 섹션을 포함하는 Mime 멀티파트 아카이브를 생성하면 자세한 디버깅 정보를 확인할 수 있습니다.

    Copy
    output : { all : '| tee -a /var/log/cloud-init-output.log' }

    이 명령은 스크립트의 명령 출력을 /var/log/cloud-init-output.log로 전송합니다. cloud-init 데이터 형식 및 Mime 멀티파트 아카이브를 생성하는 방법에 대한 자세한 내용은 cloud-init 형식을 참조하십시오.

사용자 데이터 및 cloud-init 명령

cloud-init 패키지는 새 Amazon Linux 인스턴스가 시작될 때의 특정 측면을 구성합니다. 가장 널리 사용되는 기능은 사용자가 자신의 프라이빗 키로 로그인할 수 있도록 ec2-user의 .ssh/authorized_keys 파일을 구성하는 것입니다. 자세한 내용은 cloud-init 단원을 참조하십시오.

cloud-init 사용자 명령을 인스턴스 시작 시에 전달하는 방법은 스크립트를 전달하는 방법과 동일하지만 구문은 서로 다릅니다. cloud-init에 대한 자세한 내용은 http://cloudinit.readthedocs.org/en/latest/index.html을 참조하십시오.

중요

사용자 데이터 스크립트 및 cloud-init 명령은 인스턴스 시작 시 최초 부팅 주기에서만 실행됩니다.

cloud-init의 Amazon Linux 버전은 기본 패키지가 제공하는 명령 중 일부를 지원하지 않으며, 몇 가지 명령의 이름이 바뀌었습니다(예: apt-upgrade 대신 repo_update 사용).

부팅 시에 이러한 작업을 추가하면 인스턴스 부팅에 걸리는 시간이 그만큼 늘어납니다. 사용자 데이터 명령이 완료되었는지 테스트하려면 우선 작업이 완료될 수 있도록 몇 분의 여유 시간을 두어야 합니다.

인스턴스에 사용자 데이터로 cloud-init 명령을 전달하려면 다음을 수행합니다.

  1. AMI에서 인스턴스 시작의 인스턴스 시작 절차를 따르되, 단계 6까지 진행하고 [User data] 필드에 cloud-init 명령 텍스트를 붙여넣은 후 시작 절차를 완료합니다. 아래 예제에서는 명령을 통해 웹 서버를 생성하고 구성합니다.

    Copy
    #cloud-config repo_update: true repo_upgrade: all packages: - httpd24 - php56 - mysql55-server - php56-mysqlnd runcmd: - service httpd start - chkconfig httpd on - groupadd www - [ sh, -c, "usermod -a -G www ec2-user" ] - [ sh, -c, "chown -R root:www /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' ]
  2. 인스턴스가 시작되고 사용자 데이터의 명령이 실행되도록 충분한 시간을 허용한 후 명령에서 의도된 작업을 완료했는지 확인합니다. 이 예제의 경우 명령에서 생성한 PHP 테스트 파일의 URL을 웹 브라우저에 입력합니다. 이 URL은 인스턴스의 퍼블릭 DNS 주소에 슬래시(/)와 파일 이름이 추가된 형태입니다.

    http://my.public.dns.amazonaws.com/phpinfo.php

    PHP 정보 페이지가 표시되어야 합니다. PHP 정보 페이지가 표시되지 않는 경우 사용하고 있는 보안 그룹이 HTTP(포트 80) 트래픽을 허용하는 규칙을 포함하고 있는지 확인하십시오. 자세한 내용은 보안 그룹에 규칙 추가 단원을 참조하십시오.

  3. (선택 사항) 명령에서 의도한 작업을 완료하지 못했거나 명령이 오류 없이 완료되었는지 여부를 확인하려는 경우 /var/log/cloud-init-output.log의 출력 로그 파일을 조사하여 출력에서 오류 메시지를 찾아 봅니다. 명령에 다음 줄을 추가하면 자세한 디버깅 정보를 확인할 수 있습니다.

    Copy
    output : { all : '| tee -a /var/log/cloud-init-output.log' }

    이 명령은 runcmd 출력을 /var/log/cloud-init-output.log로 전송합니다.

사용자 데이터 및 AWS CLI

AWS CLI를 사용하여 인스턴스의 사용자 데이터를 지정, 수정 및 확인할 수 있습니다. 인스턴스 메타데이터를 사용하여 인스턴스의 사용자 데이터를 보는 방법에 대한 자세한 내용은 사용자 데이터 가져오기 단원을 참조하십시오.

Windows에서 AWS CLI를 사용하는 대신 Windows PowerShell용 AWS 도구을 사용할 수 있습니다. 자세한 내용은 Windows 인스턴스용 Amazon EC2 사용 설명서사용자 데이터 및 Windows PowerShell용 도구을 참조하십시오.

예: 시작 시 사용자 데이터 지정

인스턴스를 시작할 때 사용자 데이터를 지정하려면 run-instances 명령을 --user-data 파라미터와 함께 사용합니다. run-instances를 사용하면 AWS CLI에서는 사용자 데이터의 base64 인코딩을 수행합니다.

다음 예에서는 스크립트를 명령줄에서 문자열로 지정하는 방법을 보여줍니다.

Copy
aws ec2 run-instances --image-id ami-abcd1234 --count 1 --instance-type m3.medium \ --key-name my-key-pair --subnet-id subnet-abcd1234 --security-group-ids sg-abcd1234 \ --user-data echo user data

다음 예에서는 텍스트 파일을 사용하여 스크립트를 지정하는 방법을 보여줍니다. file:// 접두사를 사용하여 파일을 지정해야 합니다.

Copy
aws ec2 run-instances --image-id ami-abcd1234 --count 1 --instance-type m3.medium \ --key-name my-key-pair --subnet-id subnet-abcd1234 --security-group-ids sg-abcd1234 \ --user-data file://my_script.txt

다음은 shell 스크립트가 포함된 텍스트 파일의 예입니다.

Copy
#!/bin/bash yum update -y service httpd start chkconfig httpd on

예: 중지된 인스턴스의 사용자 데이터 수정

modify-instance-attribute 명령을 사용하여 중지된 인스턴스의 사용자 데이터를 수정할 수 있습니다. modify-instance-attribute를 사용하면 AWS CLI에서는 사용자 데이터의 base64 인코딩을 수행하지 않습니다.

Linux에서 base64 명령을 사용하여 사용자 데이터를 인코딩합니다.

Copy
base64 my_script.txt >my_script_base64.txt

Windows에서는 certutil 명령을 사용하여 사용자 데이터를 인코딩합니다. AWS CLI에서 이 파일을 사용하기 전에 첫 번째(인증서 시작) 줄과 마지막(인증서 종료) 줄을 제거해야 합니다.

Copy
certutil -encode my_script.txt my_script_base64.txt notepad my_script_base64.txt

--user-data--value 파라미터를 사용하여 인코딩된 텍스트 파일로 사용자 데이터를 지정합니다. file:// 접두사를 사용하여 파일을 지정해야 합니다.

Copy
aws ec2 modify-instance-attribute --instance-id i-1234567890abcdef0 --attribute userData --value file://my_script_base64.txt

예: 사용자 데이터 보기

인스턴스의 사용자 데이터를 가져오려면 describe-instance-attribute 명령을 사용합니다. describe-instance-attribute를 사용하면 AWS CLI에서는 사용자 데이터의 base64 디코딩을 수행하지 않습니다.

Copy
aws ec2 describe-instance-attribute --instance-id i-1234567890abcdef0 --attribute userData

다음은 사용자 데이터 base64가 인코딩된 출력의 예입니다.

{
    "UserData": {
        "Value": "IyEvYmluL2Jhc2gKeXVtIHVwZGF0ZSAteQpzZXJ2aWNlIGh0dHBkIHN0YXJ0CmNoa2NvbmZpZyBodHRwZCBvbg=="
    },
    "InstanceId": "i-1234567890abcdef0"
}

Linux에서는 --query 옵션을 사용하여 인코딩된 사용자 데이터를 가져오고, base64 명령을 사용하여 이를 디코딩합니다.

Copy
aws ec2 describe-instance-attribute --instance-id i-1234567890abcdef0 --attribute userData --output text --query "UserData.Value" | base64 --decode

Windows에서 --query 옵션을 사용하여 코딩된 사용자 데이터를 가져오고, certutil 명령을 사용하여 이를 디코딩합니다. 인코딩된 출력과 디코딩된 출력은 각각 다른 파일에 저장됩니다.

Copy
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