web-dev-qa-db-ja.com

ECS AutoScaling環境のEC2インスタンスでOS / ECSエージェントの更新を自動化する方法は?

まず、AWSの基本的な概念のいくつかをまだ理解していないように感じます。この質問がわかりにくい場合は、ご容赦ください。

AWSで次の設定があります。

  • 1つのECS-クラスターと1つの単一サービス
  • クラスターは、1つの単一EC2インスタンスを使用するように構成されています
  • このEC2インスタンスは、特定のLaunchConfigurationに基づくAutoScalingグループの一部です。 (クラスターセットアップはこのように構成しました。これは理にかなっていると思います。)

私はいくつかの先入観/条件を開発しました

  • 私のサービスはマシンに依存しないため、EC2インスタンスは気にしません
  • 私のサービスは、一度に1つのインスタンスでのみ実行する必要があります。私はECSを使用して、ドッキングされたアプリケーションを実行する簡単な方法を用意しています。
  • 特定の時間のダウンタイムは気にしません。
  • サービスで使用する必要がある事前定義されたElasticIPがあります。
  • このサービスを可能な限り自動化する必要があります。問題が発生した場合は修正できます(稼働時間はそれほど重要ではありません)が、EC2インスタンスなどにSSHで接続することは絶対にありません。

CloudWatchおよびLambdaの助けを借りて、次のタスクを設定しました。

インスタンスはクラスター名で識別され、Nameタグに自動的に追加されます。

  • 週に1回クラスターインスタンスが再起動します。これにより、証明書と構成が更新されます。これは、サービスが起動時に更新するためです。 (おそらく、サービスを強制終了してクラスター内で再起動するようにスケジュールすることもできたでしょう...)
  • クラスターの新しいEC2インスタンスが開始するたびに事前定義されたElasticIPが割り当てられます。
  • 月に1回 EC2インスタンスは終了し、Auto ScalingGroupによって開始された新しいインスタンスに自動的に置き換えられます。

Auto Scaling Groupによって新しいインスタンスが作成されると、最新のECSエージェントを含む最新かつ最高のAMIが含まれることを期待していました。

間違っている場合は訂正してください。ただし、このAuto Scaling Groupの起動構成を確認したところ、構成されたAMIが常に使用されるため、これは当てはまらないことがわかりました。


私の一般的な質問は次のとおりです:起動構成でAMIを更新してから終了するために時々手動でチェックインする必要がある場合(正確な場合)、このセットアップにはどのような用途がありますか?新しいものを置き換えるインスタンス?

多くの人は、最初にテストしたいので、本番クラスターでOSの更新を自動化することをおそらく望まないことを理解しています。ただし、それでも、OSの更新が自動的に適用されるステージング環境が必要になる場合があります。 OSの更新を手動でロールアウトする必要があるのに、高度に自動化されたプラットフォームを使用するのはなぜですか。これは私の側の概念的な誤解ですか?

2
Thomas Ebert

すべてのECSクラスターのインスタンスエージェントを更新するLambda関数を作成しました。

var AWS = require('aws-sdk');
AWS.config.update({ region: 'sa-east-1' });

exports.handler = async(event, context) => {
    var ecs = new AWS.ECS();

    var responseArray = [];

    const clusters = await ecs.listClusters({}).promise();

    for (var i = 0; i < clusters.clusterArns.length; i++) {
        const clusterArn = clusters.clusterArns[i];

        const clusterInstances = await ecs.listContainerInstances({
            cluster: clusterArn
        }).promise();

        for (var j = 0; j < clusterInstances.containerInstanceArns.length; j++) {
            const containerInstanceArn = clusterInstances.containerInstanceArns[j];

            try {
                const response = await ecs.updateContainerAgent({
                    containerInstance: containerInstanceArn,
                    cluster: clusterArn
                }).promise();

                responseArray.Push({
                    cluster: clusterArn,
                    containerInstance: containerInstanceArn,
                    response: response
                });
            }
            catch (e) {
                responseArray.Push({
                    cluster: clusterArn,
                    containerInstance: containerInstanceArn,
                    response: e
                });
            }
        }
    }

    return responseArray;
};

次に、ラムダ関数を毎日実行するCloudWatchイベントルールを作成しました。私にとってはうまくいきます。

1
renan.wao