Amazon-Ec2

如何在 ECS Auto Scaling 環境中自動更新 EC2 實例上的 OS/ECS-agent?

  • March 11, 2020

首先:我覺得我仍然不了解AWS的一些基本概念,所以如果這個問題是noobish,請多多包涵。

我在 AWS 中有以下設置:

  • 1 個 ECS-Cluster 和 1 個單一服務
  • 集群配置為使用 1 個單個 EC2 實例
  • 此 EC2 實例是 AutoScaling 組的一部分,該組基於特定的啟動配置。(集群設置是這樣配置的,我想這是有道理的。)

我已經形成了一些先入之見/條件

  • 我不關心 EC2 實例,因為我的服務執行與機器無關
  • 我的服務一次只需要在 1 個實例上執行。我只使用 ECS 有一個簡單的方法來執行一個 dockerized 應用程序。
  • 我不在乎特定時間的停機時間。
  • 有一個預定義的彈性 IP 必須與該服務一起使用。
  • 我希望這項服務盡可能自動化。當出現問題時,我們可以解決問題(正常執行時間並不那麼重要),但我從不想通過 SSH 連接到 EC2 實例或類似的東西。

在CloudWatchLambda的幫助下,我設置了以下任務:

該實例由集群名稱標識,該名稱自動添加到名稱標籤中。

  • **每週一次,**集群實例重啟。這會更新證書和配置,因為服務會在啟動時執行此操作。(我可能也可以安排服務被殺死並以某種方式在集群內重新啟動……)
  • **每次啟動集群的新 EC2 實例時,**都會為其分配預定義的彈性 IP。
  • 每月一次, EC2 實例被終止以自動替換為由 Auto Scaling 組啟動的新實例。

現在我的希望是,一旦 Auto Scaling Group 創建了一個新實例,它將擁有最新最好的 AMI,包括最新的 ECS 代理。

如果我錯了,請糾正我,但是當我查看此 Auto Scaling 組的啟動配置時,我認為情況並非如此,因為它總是需要配置的 AMI。


**我的一般問題是:**這個設置有什麼用,當我需要每隔一段時間手動檢查一次(確切的時間?)以更新啟動配置中的 AMI,然後終止實例以替換新實例它?

我知道很多人可能不想在生產集群中自動更新作業系統,因為他們想先測試它。但是,人們可能仍然希望擁有一個臨時環境,在該環境中自動應用作業系統更新。當我仍然需要手動推出作業系統更新時,我為什麼要使用高度自動化的平台。這是我這邊的概念性誤解嗎?

我創建了一個 Lambda 函式來更新我所有 ECS 集群中的實例代理:

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 事件規則來每天執行 lambda 函式。對我有用。

引用自:https://serverfault.com/questions/877251