Amazon-Ec2
如何在 ECS Auto Scaling 環境中自動更新 EC2 實例上的 OS/ECS-agent?
首先:我覺得我仍然不了解AWS的一些基本概念,所以如果這個問題是noobish,請多多包涵。
我在 AWS 中有以下設置:
- 1 個 ECS-Cluster 和 1 個單一服務
- 集群配置為使用 1 個單個 EC2 實例
- 此 EC2 實例是 AutoScaling 組的一部分,該組基於特定的啟動配置。(集群設置是這樣配置的,我想這是有道理的。)
我已經形成了一些先入之見/條件
- 我不關心 EC2 實例,因為我的服務執行與機器無關
- 我的服務一次只需要在 1 個實例上執行。我只使用 ECS 有一個簡單的方法來執行一個 dockerized 應用程序。
- 我不在乎特定時間的停機時間。
- 有一個預定義的彈性 IP 必須與該服務一起使用。
- 我希望這項服務盡可能自動化。當出現問題時,我們可以解決問題(正常執行時間並不那麼重要),但我從不想通過 SSH 連接到 EC2 實例或類似的東西。
在CloudWatch和Lambda的幫助下,我設置了以下任務:
該實例由集群名稱標識,該名稱自動添加到名稱標籤中。
- **每週一次,**集群實例重啟。這會更新證書和配置,因為服務會在啟動時執行此操作。(我可能也可以安排服務被殺死並以某種方式在集群內重新啟動……)
- **每次啟動集群的新 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 函式。對我有用。