AWS ECS: サービス + 自動スケーリングとユーザーデータ起動タスク

AWS ECS: サービス + 自動スケーリングとユーザーデータ起動タスク

EC2 起動 (少なくとも今のところは Fargate ではない) を使用して ECS を理解しようとしています。

すべてのコンテナ インスタンスで起動する、長時間実行される単一のタスクがあるとします。このための意図されたメカニズムは、構成した数のタスク インスタンスを起動するサービスであると思われます。この場合、コンテナ インスタンスと同じ数のタスクから開始します。

ここでは、自動スケーリングは 2 つのレイヤーで存在するようです。クラスターはインスタンスを自動スケーリングでき、サービスはタスクの数を自動スケーリングできます。Fargate なしでこれら 2 つのレイヤーを同期する方法はないようです。

この制限を回避するために私が思いついたアプローチの1つは、スケールアウトをCloudWatchアラームによってトリガーすることです。集まる、インスタンス作成時にライフサイクル フックを使用して、サービスのスケールアウトをトリガーします。スケールインでこれがどのように機能するかはまだわかりませんが、サービスのスケールイン用に自動的に生成されるイベントはありますか?

それから

私が見たコンテナ起動時にタスクを開始するための AWS ガイド問題の核心は次の MIME ユーザー データであると思われます。

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

# Install the AWS CLI and the jq JSON parser
yum install -y aws-cli jq

--==BOUNDARY==
Content-Type: text/upstart-job; charset="us-ascii"

#upstart-job
description "Amazon EC2 Container Service (start task on instance boot)"
author "Amazon Web Services"
start on started ecs

script
    exec 2>>/var/log/ecs/ecs-start-task.log
    set -x
    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
end script
--==BOUNDARY==--

記事の冒頭に免責事項がありますが、これはawscliタスクを実行するために使用するこの方法によりすべての懸念が軽減されるという意味だと理解しました。

何か見逃しましたか? これは、自動スケーリング機能を備えたサービスの代替として実行可能なのでしょうか?

答え1

AWS のサポート担当者とこの件について話し合った結果、これは私の問題に対するかなり良い解決策のように思えます。

これを設定するには、Amazon ECS に最適化された AMI をベースとする起動構成を使用して自動スケーリング グループを作成し、ECS 権限を持つロールを割り当てる必要がありました。その後、示されているようにユーザーデータを含めることができました。すべてが適切に構成され (インスタンスがパブリック インターネットにアクセスできる)、インスタンスは起動時に ECS クラスターに自身を登録し、タスクを実行します。

これは、実行するタスクとは独立して存在するコンテナがある場合や、コンテナ全体を再起動せずに失敗した場合に再起動できるタスクがある場合には、適切なソリューションではありません。

関連情報