メニュー
Amazon Elastic Compute Cloud
Linux インスタンス用ユーザーガイド

Linux インスタンスでの起動時のコマンドの実行

Amazon EC2 でインスタンスを起動するとき、起動後にそのインスタンスにユーザーデータを渡し、一般的な自動設定タスクを実行したり、スクリプトを実行したりできます。2 つのタイプのユーザーデータを Amazon EC2 に渡すことができます。シェルスクリプトと cloud-init ディレクティブです。また、このデータはプレーンテキスト、ファイル (コマンドラインツールを使用してインスタンスを起動する場合に便利です)、または base64 でエンコードされたテキスト (API コールの場合) として、起動ウィザードに渡すこともできます。

より複雑なオートメーションシナリオに興味がある場合、AWS CloudFormation や AWS OpsWorks のご利用を検討してください。詳細については、AWS CloudFormation ユーザーガイドAWS OpsWorks ユーザーガイド を参照してください。

Windows インスタンスの起動時にコマンドを実行する方法については、Windows インスタンスの Amazon EC2 ユーザーガイド の「ユーザーデータの実行」と「Windows インスタンス設定の管理」を参照してください。

次の例では、Installing a LAMP Web Server tutorial のコマンドが、シェルスクリプトとインスタンスの起動時に実行される一連の cloud-init ディレクティブに変換されています。各例では、次のタスクがユーザーデータにより実行されます。

  • ディストリビューションソフトウェアパッケージが更新されます。

  • 必要なウェブサーバー、phpmysql パッケージがインストールされます。

  • chkconfig を介して httpd サービスが開始され、オンになります。

  • www グループが追加され、ec2-user がそのグループに追加されます。

  • ウェブディレクトリとその中に含まれるファイルに対して、適切な所有権とファイル権限が設定されます。

  • ウェブサーバーと PHP エンジンをテストするために、シンプルなウェブページが作成されます。

デフォルトでは、ユーザーデータおよび cloud-init ディレクティブは、インスタンスを起動するときの初回の起動サイクルでのみ実行されます。ただし、AWS Marketplace ベンダーとサードパーティー AMI の所有者が、スクリプトを実行する方法とタイミングを独自にカスタマイズしている可能性があります。

前提条件

次の例では、インターネットからアクセス可能なパブリック DNS 名がお客様のインスタンスに設定されているものと仮定しています。詳細については、「ステップ 1: インスタンスを起動する」を参照してください。また、SSH(ポート 22)、HTTP(ポート 80)、HTTPS(ポート 443)接続を許可するように、セキュリティグループを設定する必要もあります。前提条件の詳細については、Amazon EC2 でのセットアップ を参照してください。

また、これらの指示は Amazon Linux での使用を意図しています。他の Linux ディストリビューションの場合、コマンドとディレクティブが動作しないことがあります。cloud-init のサポートなど、その他のディストリビューションについての詳細は、該当するディストリビューションの文書を参照してください。

ユーザーデータとシェルスクリプト

シェルスクリプトに詳しい場合、シェルスクリプトが起動時に指示を送る最も簡単で完全な方法となります。 cloud-init 出力ログファイル (/var/log/cloud-init-output.log) にコンソール出力が記録されるので、インスタンスが意図したとおりに動作しない場合、起動後にスクリプトを簡単にデバッグできます。

重要

ユーザーデータのスクリプトおよび cloud-init ディレクティブは、インスタンスを起動するときの初回の起動サイクルでのみ実行されます。

ユーザーデータのシェルスクリプトは、#! の記号と、スクリプトを読み取るインタープリタのパス (通常は /bin/bash) から始める必要があります。シェルスクリプトの概要については、Linux Documentation Project (tldp.org) の BASH Programming HOW-TO を参照してください。

ユーザーデータとして入力されたスクリプトは、root ユーザーとして実行されます。そのため、スクリプトでは sudo コマンドを使用しないでください。作成したファイルはすべてrootルートの所有になることを忘れないでください。非 ユーザーにファイルアクセスを与える場合、スクリプトで権限を適宜変更する必要があります。また、スクリプトはインタラクティブに実行されないため、ユーザーフィードバックを必要とするコマンド (-y フラグのない yum update など) を含めることはできません。

起動時にこれらのタスクを追加すると、インスタンスの起動にかかる時間が増えます。タスクが完了するまでさらに数分待ち、それからユーザースクリプトが正常に完了したことをテストしてください。

To pass a shell script to an instance with user data

  1. Follow the procedure for launching an instance at AMI からのインスタンスの起動, but when you get to ステップ 6, paste the user data script text into the User data field and then complete the launch procedure. For the example below, the script creates and configures our web server.

    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. Allow enough time for the instance to launch and execute the commands in your script, and then check to see that your script has completed the tasks that you intended. For our example, in a web browser, enter the URL of the PHP test file the script created. This URL is the public DNS address of your instance followed by a forward slash and the file name.

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

    You should see the PHP information page. If you are unable to see the PHP information page, check that the security group you are using contains a rule to allow HTTP (port 80) traffic. For more information, see セキュリティグループへのルールの追加.

  3. (Optional) If your script did not accomplish the tasks you were expecting it to, or if you just want to verify that your script completed without errors, examine the cloud-init output log file at /var/log/cloud-init-output.log and look for error messages in the output.

    For additional debugging information, you can create a Mime multipart archive that includes a cloud-init data section with the following directive:

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

    This directive sends command output from your script to /var/log/cloud-init-output.log. For more information about cloud-init data formats and creating Mime multi part archive, see cloud-init Formats.

ユーザーデータと 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 バージョンは、ベースパッケージで利用できるディレクティブの一部をサポートしません。一部のディレクティブは名前が変更されています(例えば、repo_update の代わりに apt-upgrade が使用されています)。

起動時にこれらのタスクを追加すると、インスタンスの起動にかかる時間が増えます。タスクが完了するまでさらに数分待ち、それからユーザーデータディレクティブが完了したことをテストしてください。

To pass cloud-init directives to an instance with user data

  1. Follow the procedure for launching an instance at AMI からのインスタンスの起動, but when you get to ステップ 6, paste your cloud-init directive text into the User data field and then complete the launch procedure. For the example below, the directives create and configure a web server.

    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. Allow enough time for the instance to launch and execute the directives in your user data, and then check to see that your directives have completed the tasks you intended. For our example, in a web browser, enter the URL of the PHP test file the directives created. This URL is the public DNS address of your instance followed by a forward slash and the file name.

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

    You should see the PHP information page. If you are unable to see the PHP information page, check that the security group you are using contains a rule to allow HTTP (port 80) traffic. For more information, see セキュリティグループへのルールの追加.

  3. (Optional) If your directives did not accomplish the tasks you were expecting them to, or if you just want to verify that your directives completed without errors, examine the output log file at /var/log/cloud-init-output.log and look for error messages in the output. For additional debugging information, you can add the following line to your directives:

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

    This directive sends runcmd output to /var/log/cloud-init-output.log.

ユーザーデータと AWS CLI

AWS CLI を使用して、インスタンスのユーザーデータを指定、変更、表示することができます。インスタンスのメタデータを使用して、インスタンスからユーザーデータを表示する方法については、「ユーザーデータの取得」を参照してください。ユーザーデータと AWS Tools for Windows PowerShell については、『Windows インスタンスの Amazon EC2 ユーザーガイド』の「ユーザーデータと Tools for Windows PowerShell」を参照してください。

例: ユーザーデータは、起動時に指定します。

インスタンスの起動時にユーザーデータを指定するには、run-instances コマンドを使用します。AWS CLI は、ユーザーデータの base64 エンコードを実行します。

スクリプトをテキストファイルに渡すには、--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

シェルスクリプトを使用したテキストファイルの例を次に示します。

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

例: 停止しているインスタンスのユーザーデータを変更します。

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 コマンドを使用します。

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

出力例を次に示します。ユーザーデータはエンコードされていることに注意してください。

{
    "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