Amazon ECS Linux コンテナインスタンスの起動時にスクリプトを実行する
すべてのコンテナインスタンスで特定のコンテナを実行して、モニタリング、セキュリティ、メトリクス、サービス検出、ログ記録などのオペレーションやセキュリティの問題に対処する必要がある場合があります。
これを行うには、起動時にユーザーデータスクリプトで、または Upstart や systemd などの一部の init システムで、docker run コマンドを呼び出すように、コンテナインスタンスを設定できます。これは機能しますが、いくつかの欠点があります。Amazon ECS は、コンテナに関する情報を渡されず、CPU、メモリ、ポートなどのリソースをモニタリングできないためです。Amazon ECS がすべてのタスクリソースについて適切に情報を得られるように、コンテナインスタンスで実行するコンテナのタスク定義を作成します。その後、Amazon ECS を使用して、起動時に Amazon EC2 ユーザーデータを渡してタスクを配置します。
以下の手順の Amazon EC2 ユーザーデータスクリプトは、Amazon ECS イントロスペクション API を使用してコンテナインスタンスを識別します。次に、AWS CLI と start-task コマンドを使用して、指定されたタスクをスタートアップ時に実行します。
コンテナインスタンスの起動時にタスクを開始するには
-
ecsInstanceRole
IAM ロールを変更して、StartTask
API オペレーションに対するアクセス権限を追加します。詳細については、「AWS Identity and Access Management ユーザーガイド」の「ロールの修正」を参照してください。 -
Amazon ECS に最適化された Amazon Linux 2 AMI を使用して、1 つ以上のコンテナインスタンスを起動します。新しいコンテナインスタンスを起動し、EC2 ユーザーデータで次のサンプルスクリプトを使用します。
your_cluster_name
は、コンテナインスタンスに登録するクラスターに置き換え、my_task_def
は、起動時にインスタンスで実行するタスク定義に置き換えてください。詳細については、「Amazon ECS Linux コンテナインスタンスの起動」を参照してください。
注記
以下の 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==-- -
コンテナインスタンスが正しいクラスターで起動し、タスクが開始されていることを確認します。
コンソール (https://console.aws.amazon.com/ecs/v2
) を開きます。 -
ナビゲーションバーから、クラスターがあるリージョンを選択します。
-
ナビゲーションペインで [Clusters] を選択し、コンテナインスタンスをホストするクラスターを選択します。
-
[クラスター] ページで [タスク] を選択した後、使用するタスクを選択します。
起動した各コンテナインスタンスでは、このタスクが実行状態になります。
タスクが表示されない場合は、SSH を使用してコンテナインスタンスにログインし、
/var/log/ecs/ecs-start-task.log
ファイルでデバッグの情報を確認できます。