メニュー
Amazon Elastic Container Service
開発者ガイド (API Version 2014-11-13)

Amazon EC2 ユーザーデータを使用してコンテナインスタンスをブートストラップする

Amazon ECS コンテナインスタンスを起動するとき、インスタンスにユーザーデータを渡すオプションがあります。インスタンスの起動時に、データを使って、一般的な自動設定タスクを実行したり、スクリプトを実行したりできます。Amazon ECS では、ユーザーデータの最も一般的なユースケースは、設定情報を Docker デーモンと Amazon ECS コンテナエージェントに渡すことです。

クラウドブートフック、シェルスクリプト、cloud-init ディレクティブなど、複数タイプのユーザーデータを Amazon EC2 に渡すことができます。これらおよびその他の形式の種類の詳細については、「Cloud-Init のドキュメント」を参照してください。

このユーザーデータを「Amazon ECS コンテナインスタンスの起動」の「ステップ 7」の Amazon EC2 起動ウィザードに渡すこともできます。

Amazon ECS コンテナエージェント

Amazon ECS 最適化 AMI は、コンテナエージェントの開始時に /etc/ecs/ecs.config ファイルでエージェント設定データを検索します。Amazon EC2 ユーザーデータを使用して、起動時に、この設定データを指定することができます。使用可能な Amazon ECS コンテナエージェントの設定変数の詳細なリストについては、「Amazon ECS コンテナエージェントの設定」を参照してください。

クラスター名など、単一エージェントの設定変数のみを設定するには、echo を使用して、変数を設定ファイルにコピーします。

#!/bin/bash echo "ECS_CLUSTER=MyCluster" >> /etc/ecs/ecs.config

/etc/ecs/ecs.config に書き込む変数が複数ある場合は、以下の heredoc 形式を使用します。この形式は cat で始まる行と EOF の間のすべてを設定ファイルに書き込みます。

#!/bin/bash cat <<'EOF' >> /etc/ecs/ecs.config ECS_CLUSTER=MyCluster ECS_ENGINE_AUTH_TYPE=docker ECS_ENGINE_AUTH_DATA={"https://index.docker.io/v1/":{"username":"my_name","password":"my_password","email":"email@example.com"}} ECS_LOGLEVEL=debug EOF

Docker デーモン

Amazon EC2 ユーザーデータを使用して Docker デーモンの設定情報を指定できますが、この設定データは Docker デーモンが開始する前に書き込まれる必要があります。cloud-boothook ユーザーデータ形式は、起動プロセスでユーザーデータシェルスクリプトよりも前に実行されます。Docker デーモンの設定オプションの詳細なリストについては、「Docker デーモンのドキュメント」を参照してください。

デフォルトでは、cloud-boothook ユーザーデータは、インスタンス起動のたびに実行されるため、ブートフックが複数回実行されることを防ぐためのメカニズムを作成する必要があります。このようにしてブートフックの頻度を制御するために cloud-init-per ユーティリティが提供されています。詳細については、「cloud-init-per ユーティリティ」を参照してください。

以下の例では、--storage-opt dm.basesize=20G オプションが、Docker デーモン設定ファイル /etc/sysconfig/docker の既存のすべてのオプションに追加されています。

#cloud-boothook cloud-init-per once docker_options echo 'OPTIONS="${OPTIONS} --storage-opt dm.basesize=20G"' >> /etc/sysconfig/docker

複数行をファイルに書き込むには、次の heredoc 形式を使用して同じことを行うこともできます。

#cloud-boothook cloud-init-per instance docker_options cat <<'EOF' >> /etc/sysconfig/docker OPTIONS="${OPTIONS} --storage-opt dm.basesize=20G" HTTP_PROXY=http://proxy.example.com:80/ EOF

cloud-init-per ユーティリティ

cloud-init-per ユーティリティは cloud-init パッケージにより提供され、指定した頻度で実行するインスタンスのブートフックコマンドを作成するために使用できます。

cloud-init-per ユーティリティの構文は次のとおりです。

cloud-init-per frequency name cmd [ arg1 [ arg2 [ ... ] ]
frequency

ブートフックの実行頻度。

  • once を指定すると、再度実行されることはありません。新しいインスタンス ID でも実行されません。

  • instance を指定すると、新しいインスタンスのそれぞれの初回の起動時に実行されます。たとえば、ブートフックの実行後にインスタンスから AMI を作成する場合、その AMI から起動される後続のインスタンスでも、ブートフックは再度実行されます。

  • always を指定すると、起動のたびに実行されます。

name

ブートフックの実行時に書き込まれるセマフォファイルパスに含める名前。セマフォファイルは /var/lib/cloud/instances/instance_id/sem/bootper.name.instance に書き込まれます。

cmd

ブートフックが実行するコマンドと引数。

次の例では、コマンド echo 'OPTIONS="${OPTIONS} --storage-opt dm.basesize=20G"' >> /etc/sysconfig/docker は 1 回のみ実行されます。名前を含むセマフォファイルが書き込まれます。

#cloud-boothook cloud-init-per once docker_options echo 'OPTIONS="${OPTIONS} --storage-opt dm.basesize=20G"' >> /etc/sysconfig/docker

セマフォファイルは、コマンドの終了コードおよび実行時の UNIX のタイムスタンプを記録します。

[ec2-user ~]$ cat /var/lib/cloud/instances/i-0c7f87d7611b2165e/sem/bootper.docker_options.instance

出力:

0 1488410363

MIME マルチパートアーカイブ

複数のユーザーデータブロックを組み合わせて、MIME マルチパートファイルという単一のユーザーデータブロックにすることができます。たとえば、Amazon ECS コンテナエージェントの設定情報を書き込むユーザーデータシェルスクリプトを使用して、Docker デーモンを設定するクラウドブートフックを組み合わせることができます。

MIME マルチパートファイルには次のコンポーネントが含まれます。

  • コンテンツの種類およびパート境界の宣言: Content-Type: multipart/mixed; boundary="==BOUNDARY=="

  • MIME バージョンの宣言: MIME-Version: 1.0

  • 次のコンポーネントを含む 1 つ以上のユーザーデータブロック:

    • ユーザーデータブロックの始まりを示す開始境界:--==BOUNDARY==

    • ブロックのコンテンツの種類の宣言 (コンテンツの種類のリストは「Cloud-Init のドキュメント」を参照してください): Content-Type: text/cloud-boothook; charset="us-ascii"

    • ユーザーデータのコンテンツ、たとえば、シェル・コマンドまたは cloud-init ディレクティブのリスト

  • MIME マルチパートファイルの終わりを示す、終了境界: --==BOUNDARY==--

例 MIME マルチパートファイル

この MIME マルチパートファイルの例では、Docker ベースデバイスのサイズを 20 GiB に設定し、Amazon ECS コンテナエージェントを設定してインスタンスを my-ecs-cluster という名前のクラスターに登録します。

Content-Type: multipart/mixed; boundary="==BOUNDARY==" MIME-Version: 1.0 --==BOUNDARY== Content-Type: text/cloud-boothook; charset="us-ascii" # Set Docker daemon options cloud-init-per once docker_options echo 'OPTIONS="${OPTIONS} --storage-opt dm.basesize=20G"' >> /etc/sysconfig/docker --==BOUNDARY== Content-Type: text/x-shellscript; charset="us-ascii" #!/bin/bash # Set any ECS agent configuration options echo "ECS_CLUSTER=my-ecs-cluster" >> /etc/ecs/ecs.config --==BOUNDARY==--