コンテナインスタンス起動時のタスクの開始 - Amazon Elastic Container Service

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

コンテナインスタンス起動時のタスクの開始

アプリケーションのアーキテクチャ設計によっては、コンテナインスタンスごとに特定のコンテナを実行して、モニタリング、セキュリティ、メトリクス、サービス検出、ログ記録などのオペレーションやセキュリティ上の問題に対処する必要があります。

これを行うには、起動時にユーザーデータスクリプトで、または Upstart や systemd などの一部の init システムで、docker run コマンドを呼び出すように、コンテナインスタンスを設定できます。これは機能しますが、いくつかの欠点があります。Amazon ECS は、コンテナに関する情報を渡されず、CPU、メモリ、ポートなどのリソースをモニタリングできないためです。Amazon ECS がすべてのタスクリソースについて適切に情報を得られるように、コンテナインスタンスで実行するコンテナのタスク定義を作成します。その後、Amazon ECS を使用して、起動時に Amazon EC2 ユーザーデータを渡してタスクを配置します。

以下の手順の Amazon EC2 ユーザーデータスクリプトは、Amazon ECS イントロスペクション API を使用してコンテナインスタンスを識別します。次に、 AWS CLI と start-task コマンドを使用して、起動時に指定されたタスクをそれ自体で実行します。

コンテナインスタンスの起動時にタスクを開始するには
  1. まだ実行していない場合は、「コンソールを使用したタスク定義の作成」の手順に従って、コンテナインスタンスの起動時に実行するコンテナを指定したタスク定義を作成します。

  2. ecsInstanceRole IAM ロールを変更して、StartTask API オペレーションに対するアクセス権限を追加します。詳細については、「Amazon ECS コンテナインスタンスの IAM ロール」を参照してください。

    1. IAM コンソール (https://console.aws.amazon.com/iam/) を開きます。

    2. ナビゲーションペインで Roles (ロール) を選択します。

    3. [ecsInstanceRole] を選択します。ロールが存在しない場合は、「Amazon ECS コンテナインスタンスの IAM ロール」の手順に従ってロールを作成し、この手順に戻ります。ロールが存在する場合は、そのロールを選択して、アタッチされているポリシーを表示します。

    4. [アクセス許可] タブで [インラインポリシーの追加] を選択します。

    5. [サービス] で、[サービスの選択]、 [Elastic Container Service] の順に選択します。

    6. アクション StartTaskで、検索フィールドに「」と入力し、「」を選択しますStartTask

    7. [リソース] で [すべてのリソース] を選択したら、[ポリシーの確認] を選択します。

    8. [ポリシーの確認] ページでポリシー名 (ecs-start-task など) を入力し、[ポリシーの作成] を選択します。

  3. Amazon ECS Linux コンテナインスタンスの起動」の手順に従って、Amazon ECS に最適化された Amazon Linux 2 AMI を使用して 1 つ以上のコンテナインスタンスを起動します。ただし、「ステップ 7」では、以下の MIME マルチパートユーザーデータスクリプトをコピーし、[ユーザーデータ] フィールドに貼り付けます。your_cluster_name は、コンテナインスタンスに登録するクラスターに置き換え、my_task_def は、起動時にインスタンスで実行するタスク定義に置き換えます。

    注記

    以下の MIME マルチパートの内容では、シェルスクリプトを使用して値を設定し、パッケージをインストールしています。また、systemd ジョブを使用して、ecs サービスが実行されイントロスペクション API が使用可能になった後にタスクが開始されるようにしています。

    Content-Type: multipart/mixed; boundary="==BOUNDARY==" MIME-Version: 1.0 --==BOUNDARY== Content-Type: text/x-shellscript; charset="us-ascii" #!/bin/bash # Specify the cluster that the container instance should register into cluster=your_cluster_name # Write the cluster configuration variable to the ecs.config file # (add any other configuration variables here also) echo ECS_CLUSTER=$cluster >> /etc/ecs/ecs.config START_TASK_SCRIPT_FILE="/etc/ecs/ecs-start-task.sh" cat <<- 'EOF' > ${START_TASK_SCRIPT_FILE} exec 2>>/var/log/ecs/ecs-start-task.log set -x # Install prerequisite tools yum install -y jq aws-cli # Wait for the ECS service to be responsive until curl -s http://localhost:51678/v1/metadata do sleep 1 done # Grab the container instance ARN and AWS Region from instance metadata instance_arn=$(curl -s http://localhost:51678/v1/metadata | jq -r '. | .ContainerInstanceArn' | awk -F/ '{print $NF}' ) cluster=$(curl -s http://localhost:51678/v1/metadata | jq -r '. | .Cluster' | awk -F/ '{print $NF}' ) region=$(curl -s http://localhost:51678/v1/metadata | jq -r '. | .ContainerInstanceArn' | awk -F: '{print $4}') # Specify the task definition to run at launch task_definition=my_task_def # Run the AWS CLI start-task command to start your task on this container instance aws ecs start-task --cluster $cluster --task-definition $task_definition --container-instances $instance_arn --started-by $instance_arn --region $region EOF # Write systemd unit file UNIT="ecs-start-task.service" cat <<- EOF > /etc/systemd/system/${UNIT} [Unit] Description=ECS Start Task Requires=ecs.service After=ecs.service [Service] Restart=on-failure RestartSec=30 ExecStart=/usr/bin/bash ${START_TASK_SCRIPT_FILE} [Install] WantedBy=default.target EOF # Enable our ecs.service dependent service with `--no-block` to prevent systemd deadlock # See https://github.com/aws/amazon-ecs-agent/issues/1707 systemctl enable --now --no-block "${UNIT}" --==BOUNDARY==--
  4. コンテナインスタンスが正しいクラスターで起動し、タスクが開始されていることを確認します。

    1. コンソール (https://console.aws.amazon.com/ecs/v2) を開きます。

    2. ナビゲーションバーから、クラスターがあるリージョンを選択します。

    3. ナビゲーションペインで [Clusters] を選択し、コンテナインスタンスをホストするクラスターを選択します。

    4. [クラスター] ページで [タスク] を選択した後、使用するタスクを選択します。

      起動した各コンテナインスタンスでは、このタスクが実行状態になります。

      タスクが表示されない場合は、SSH を使用してコンテナインスタンスにログインし、/var/log/ecs/ecs-start-task.log ファイルでデバッグの情報を確認できます。