メニュー
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 パッケージがインストールされます。

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

  • 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 の所有になることを忘れないでください。非 root ユーザーにファイルアクセスを与える場合、スクリプトで権限を適宜変更する必要があります。また、スクリプトはインタラクティブに実行されないため、ユーザーフィードバックを必要とするコマンド (-y フラグのない yum update など) を含めることはできません。

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

ユーザーデータでシェルスクリプトをインスタンスに渡すには

  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 アドレスにスラッシュとファイル名を追加したものです。

    Copy
    http://my.public.dns.amazonaws.com/phpinfo.php
    PHP 情報ページが表示されるはずです。

    ヒント

    PHP 情報ページが表示されない場合、使用しているセキュリティグループに HTTP (ポート 80) トラフィックを許可するルールが含まれていることを確認します。HTTP ルールをセキュリティグループに追加する方法については、セキュリティグループへのルールの追加 を参照してください。

  3. (オプション) スクリプトが予定のタスクを完了しなかった場合、あるいはスクリプトがエラーせずにタスクを完了したかを確認するには、cloud-init/var/log/cloud-init-output.log にある 出力ログファイルを調べ、エラーメッセージが出力されていないか探します。

    デバッグの詳細情報を取得するには、ディレクティブ cloud-init を指定して

    Copy
    output : { all : '| tee -a /var/log/cloud-init-output.log' }
    データセクションを含む MIME マルチパートアーカイブを作成します。このディレクティブにより、スクリプトから /var/log/cloud-init-output.log にコマンド出力が送信されます。cloud-init データ形式と MIME マルチパートアーカイブの作成方法の詳細については、「cloud-init Formats」を参照してください。

ユーザーデータと cloud-init ディレクティブ

cloud-init パッケージは、新しい Amazon Linux インスタンスが起動したときに、特定の側面を設定します。具体的には、お客様のプライベートキーでログインできるように、.ssh/authorized_keysec2-user ファイルを設定します。

構文は異なりますが、渡されたスクリプトと同じ方法で cloud-init ユーザーディレクティブを起動時のインスタンスに渡すことができます。cloud-init の詳細については、http://cloudinit.readthedocs.org/en/latest/index.html にアクセスしてください。

重要

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

cloud-init の Amazon Linux バージョンは、ベースパッケージで利用できるディレクティブの一部をサポートしません。一部のディレクティブは名前が変更されています (たとえば、repo_update の代わりに apt-upgrade が使用されています)。

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

ユーザーデータで cloud-init ディレクティブをインスタンスに渡すには

  1. AMI からのインスタンスの起動 でインスタンスを起動するための手順を行いますが、ステップ 6 に到達したら、cloud-init ディレクティブテキストを [User data] フィールドに貼り付けて、起動手順を完了します。下の例では、ディレクティブがウェブサーバーを作成し、設定します。

    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 アドレスにスラッシュとファイル名を追加したものです。

    Copy
    http://my.public.dns.amazonaws.com/phpinfo.php
    PHP 情報ページが表示されるはずです。

    ヒント

    PHP 情報ページが表示されない場合、使用しているセキュリティグループに HTTP (ポート 80) トラフィックを許可するルールが含まれていることを確認します。HTTP ルールをセキュリティグループに追加する方法については、セキュリティグループへのルールの追加 を参照してください。

  3. (オプション) ディレクティブが予定のタスクを完了しなかった場合、あるいはディレクティブがエラーなしでタスクを完了したかを確認するには、cloud-init/var/log/cloud-init-output.log にある 出力ログファイルを調べ、エラーメッセージが出力されていないか探します。デバッグの詳細情報を取得するには、ディレクティブに次の行を追加します:

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

    このディレクティブにより、runcmd 出力が /var/log/cloud-init-output.log に送信されます。

API と CLI の概要

次のコマンドのいずれかを使用して起動時にインスタンスにユーザーデータを渡すことができます。 これらのコマンドラインインターフェイスの詳細については、Amazon EC2 へのアクセス を参照してください。

  • AWS CLI:run-instances コマンドで --user-data を使用します。ファイルからユーザーデータを渡すには、file:// プレフィックスを使用します。

  • AWS Tools for Windows PowerShell:New-EC2Instance コマンドで -UserData を使用します。

  • Amazon EC2 Query API:RunInstances コマンドで UserData を使用します。