1. 程式人生 > >使用“執行命令”管理一組例項

使用“執行命令”管理一組例項

Emily Freebairn,亞馬遜AWS軟體開發工程師

翻譯 Ye Zhou | 原文連結

通常,工程師希望在一組例項中執行操作任務。 但是,這些任務中的許多工需要以受控的速度進行,並在出現問題時獲得反饋。 此外,管理員還通常希望確保工程師只能執行指定的操作。

執行命令”是Amazon EC2系統管理器(SSM)的一部分,旨在讓您遠端和安全地管理例項。 “執行命令”提供了一種簡單的方法來自動執行常見的管理任務,如執行shell指令碼、安裝軟體或修補程式等等。 “執行命令”允許您在多個例項上執行命令,並提供對結果的可見性。通過與AWS身份和訪問管理(

IAM)的整合,您可以精確控制使用者可以在例項上執行的操作許可權。 “執行命令”執行的所有操作均由AWS CloudTrail記錄,允許您稽核對系統的更改。

在本文中,演示瞭如何執行命令來收集例項的診斷資訊。 由於系統容量是按需新增,系統的容量會隨時變化。為了減少例項出現意外的可能性,命令可以以受控的速度執行。 如果出現失敗,您將收到通知以進行事後分析。 要確保您不會意外執行其他命令,請使用具有鎖定許可權的自定義操作來執行指定任務。

演練

在本節中,我將向您展示如何使用Auto Scaling設定例項,建立自定義SSM文件,然後在Auto Scaling組中的所有例項上執行命令。 同時展示瞭如何設定

Amazon CloudWatch事件,以便在遇到問題時收到通知。

步驟1:使用Auto Scaling組啟動例項

要使用“執行命令”,例項需要以下內容:

  • 出站網際網路連線
  • 附加適當的IAM角色

SSM代理與“執行命令”服務通訊以接收命令併發送輸出,並使用IAM角色授予呼叫服務的許可權。

對於這篇文章,使用Auto Scaling組來建立一組正確配置的例項。 有關分步說明,請參閱Auto Scaling入門

這裡是一個使用了五個例項的Auto Scaling組的示例。

步驟2:建立自定義文件

“執行命令”使用文件來指定要在例項上執行的操作。文件是由JSON定義的AWS資源,它們包括您指定的步驟和引數。

AWS提供了一組執行常見任務的文件,例如執行shell指令碼,配置CloudWatch,安裝應用程式等。 此外,您可以為自己的文件編寫特定任務。 因為IAM策略允許您控制使用者被授權使用哪些文件,因此可以通過將一個指定使用者限制到某個文件子集來鎖定該使用者可以執行的操作。

這裡是一個文件的例子,它找出最消耗記憶體的程序。

{
    "schemaVersion": "2.0",
    "description": "Instance Diagnostics",
    "parameters": { },
    "mainSteps": [
        {
            "action": "aws:runShellScript",
            "name": "collectInformation",
            "inputs": {
                "runCommand": [ "ps aux --sort '%mem' | head -5" ]
            }
        }
    ]
}

要建立自定義文件,請使用建立文件SSM API。

aws ssm create-document --name InstanceDiagnostics --content file://~/workspace/document.json --document-type Command
{
    "DocumentDescription": {
        "Status": "Creating", 
        "Hash": "92182f1392807f23556ecc3f9e1d950a575dce8e2a4b96d284b1b2fb93369db2", 
        "Name": "InstanceDiagnostics", 
        "Parameters": [], 
        "DocumentType": "Command", 
        "PlatformTypes": [
            "Linux"
        ], 
        "DocumentVersion": "1", 
        "HashType": "Sha256", 
        "CreatedDate": 1492636792.396, 
        "Owner": "040557870006", 
        "SchemaVersion": "2.0", 
        "DefaultVersion": "1", 
        "LatestVersion": "1", 
        "Description": "Instance diagnostics example."
    }
}

步驟3:設定CloudWatch事件

去年,我們在“執行命令”中添加了對命令狀態更改的通知的支援。 設定CloudWatch事件通知時,您可以決定在每個例項或每個命令的基礎上觸發事件,並指定通知的狀態。使用此功能,您可以選擇在命令完成時收到通知,以進行必要的後續操作。

設定CloudWatch事件通知,以通過Amazon SNS通知並在命令完成時收到電子郵件。 首先建立一個在觸發時傳送電子郵件的SNS主題。

接下來,建立CloudWatch事件規則以在命令完成執行時觸發SNS主題。

步驟4:測試一個例項上的命令

在將命令傳送到整個例項組之前,請確保它按預期工作。

首先,檢查測試例項是否正確設定並通過使用DescribeInstanceInformation API連線到該服務。 這將返回有關代理的狀態、代理執行的平臺以及其他例項資訊。

aws ssm describe-instance-information --filters "Key=InstanceIds,Values=i-01222ecf7db201ca2"
{
    "InstanceInformationList": [
        {
            "IsLatestVersion": false, 
            "ComputerName": "ip-172-31-24-177.us-west-1.compute.internal", 
            "PingStatus": "Online", 
            "InstanceId": "i-01222ecf7db201ca2", 
            "IPAddress": "172.31.24.177", 
            "ResourceType": "EC2Instance", 
            "AgentVersion": "2.0.755.0", 
            "PlatformVersion": "2017.03", 
            "PlatformName": "Amazon Linux AMI", 
            "PlatformType": "Linux", 
            "LastPingDateTime": 1492637593.888
        }
    ]
}

接下來,使用先前建立的文件向上述例項傳送命令

aws ssm send-command --document-name "InstanceDiagnostics" --instance-ids "i-01222ecf7db201ca2" 
{
    "Command": {
        "Comment": "", 
        "Status": "Pending", 
        "MaxErrors": "0", 
        "Parameters": {}, 
        "ExpiresAfter": 1492645288.475, 
        "ServiceRole": "", 
        "DocumentName": "InstanceDiagnostics", 
        "TargetCount": 1, 
        "OutputS3BucketName": "", 
        "NotificationConfig": {
            "NotificationArn": "", 
            "NotificationEvents": [], 
            "NotificationType": ""
        }, 
        "CompletedCount": 0, 
        "Targets": [], 
        "StatusDetails": "Pending", 
        "ErrorCount": 0, 
        "OutputS3KeyPrefix": "", 
        "RequestedDateTime": 1492638088.475, 
        "CommandId": "11cf0866-fdec-43a4-987b-b7a5f8ad60e9", 
        "InstanceIds": [
            "i-01222ecf7db201ca2"
        ], 
        "MaxConcurrency": "50"
    }
}

最後,檢查以確保命令成功完成。

aws ssm list-commands --command-id 11cf0866-fdec-43a4-987b-b7a5f8ad60e9
{
    "Commands": [
        {
            "Comment": "", 
            "Status": "Success", 
            "MaxErrors": "0", 
            "Parameters": {}, 
            "ExpiresAfter": 1492645288.475, 
            "ServiceRole": "", 
            "DocumentName": "InstanceDiagnostics", 
            "TargetCount": 1, 
            "OutputS3BucketName": "", 
            "NotificationConfig": {
                "NotificationArn": "", 
                "NotificationEvents": [], 
                "NotificationType": ""
            }, 
            "CompletedCount": 1, 
            "Targets": [], 
            "StatusDetails": "Success", 
            "ErrorCount": 0, 
            "OutputS3KeyPrefix": "", 
            "RequestedDateTime": 1492638088.475, 
            "CommandId": "11cf0866-fdec-43a4-987b-b7a5f8ad60e9", 
            "InstanceIds": [
                "i-01222ecf7db201ca2"
            ], 
            "MaxConcurrency": "50"
        }
    ]
}

步驟4:用速度控制“命令執行”

現在,您可以將命令傳送到您的一組例項。

“執行命令”公開了兩個新概念,用於幫助您控制傳送命令的速率。 您可以通過使用max-concurrency引數來控制多少個例項同時執行該命令。 您可以指定絕對的例項數,如10,或百分比,如50%。 系統將逐步建立更多的呼叫(命令和例項ID配對),直到達到最大併發限制,此時它將在建立下一個呼叫之前等待每個當前呼叫完成。

第二個引數max-errors允許您指定在“執行命令”停止向其他例項傳送命令之前允許的錯誤數。 像最大併發一樣,最大錯誤可以指定為絕對數或百分比。

向所建立的Auto Scaling組中的所有例項傳送命令,舉個例子,我們指定max-concurrency為40%、max-errors為100%。 您可以使用自動生成的Auto Scaling組標籤,無需任何其他工作。 通過將max-concurrency設定為40%,您可以確保命令不會同時傳送到所有例項。 將max-errors設定為100%將確保所有例項都執行命令,即使某些命令呼叫不成功。

因為您已設定CloudWatch事件通知,所以在命令完成時將會收到通知。 “執行命令”API的輸出限制為1200個字元,因此指定一個S3的位置以確保捕獲完整的輸出。

aws ssm send-command --document-name "InstanceDiagnostics" --target "Key=tag:aws:autoscaling:groupName,Values=RunCommandASG" --max-concurrency 40% --max-errors 100% --output-s3-bucket-name "run-command-blog" --output-s3-key-prefix "diagnostics"
{
    "Command": {
        "Comment": "", 
        "Status": "Pending", 
        "MaxErrors": "100%", 
        "Parameters": {}, 
        "ExpiresAfter": 1492647224.49, 
        "ServiceRole": "", 
        "DocumentName": "InstanceDiagnostics", 
        "TargetCount": 0, 
        "OutputS3BucketName": "run-command-blog", 
        "NotificationConfig": {
            "NotificationArn": "", 
            "NotificationEvents": [], 
            "NotificationType": ""
        }, 
        "CompletedCount": 0, 
        "Targets": [
            {
                "Values": [
                    "RunCommandASG"
                ], 
                "Key": "tag:aws:autoscaling:groupName"
            }
        ], 
        "StatusDetails": "Pending", 
        "ErrorCount": 0, 
        "OutputS3KeyPrefix": "diagnostics", 
        "RequestedDateTime": 1492640024.49, 
        "CommandId": "666b0ea2-0004-4352-bddc-ac212e0e4090", 
        "InstanceIds": [], 
        "MaxConcurrency": "40%"
    }
}

步驟5:驗證命令結果

當命令完成後,您將收到一封電子郵件中的SNS通知。

{
    "version": "0",
    "id": "8bb24048-9af4-4f88-a70d-47feba9da26c",
    "detail-type": "EC2 Command Status-change Notification",
    "source": "aws.ssm",
    "account": "040557870006",
    "time": "2017-04-19T22:38:19Z",
    "region": "us-west-1",
    "resources": [
        
    ],
    "detail": {
        "command-id": "666b0ea2-0004-4352-bddc-ac212e0e4090",
        "document-name": "InstanceDiagnostics",
        "requested-date-time": "2017-04-19T22:38:16.105Z",
        "expire-after": "2017-04-20T00:38:16.105Z",
        "output-s3bucket-name": "run-command-blog",
        "output-s3key-prefix": "diagnostics",
        "parameters": "",
        "status": "Success"
    }
}

使用ListCommands API來檢查總體的命令狀態。 這裡會返回一些資訊,例如命令的狀態、有多少個例項被定位(TargetCount)以及完成了多少個呼叫(CompletedCount)。

aws ssm list-commands --command-id 666b0ea2-0004-4352-bddc-ac212e0e4090 
{
    "Commands": [
        {
            "Comment": "", 
            "Status": "Success", 
            "MaxErrors": "100%", 
            "Parameters": {}, 
            "ExpiresAfter": 1492647224.49, 
            "ServiceRole": "", 
            "DocumentName": "InstanceDiagnostics", 
            "TargetCount": 5, 
            "OutputS3BucketName": "run-command-blog", 
            "NotificationConfig": {
                "NotificationArn": "", 
                "NotificationEvents": [], 
                "NotificationType": ""
            }, 
            "CompletedCount": 5, 
            "Targets": [
                {
                    "Values": [
                        "RunCommandASG"
                    ], 
                    "Key": "tag:aws:autoscaling:groupName"
                }
            ], 
            "StatusDetails": "Success", 
            "ErrorCount": 0, 
            "OutputS3KeyPrefix": "diagnostics", 
            "RequestedDateTime": 1492640024.49, 
            "CommandId": "666b0ea2-0004-4352-bddc-ac212e0e4090", 
            "InstanceIds": [], 
            "MaxConcurrency": "40%"
        }
    ]
}

現在,您需要從指定例項收集的診斷資訊。 使用GetCommandInvocation API。 這裡會返回命令的輸出,包括有關命令執行的更多詳細資訊,如開始執行時間以及執行了多久。

aws ssm get-command-invocation --command-id 666b0ea2-0004-4352-bddc-ac212e0e4090 --instance-id i-01222ecf7db201ca2
{
    "Comment": "", 
    "ExecutionElapsedTime": "PT0.004S", 
    "ExecutionEndDateTime": "2017-04-19T22:13:47.122Z", 
    "StandardErrorContent": "", 
    "InstanceId": "i-01222ecf7db201ca2", 
    "StandardErrorUrl": "https://s3-us-west-1.amazonaws.com/run-command-blog/diagnostics/666b0ea2-0004-4352-bddc-ac212e0e4090/i-01222ecf7db201ca2/awsrunShellScript/0.diagnose/stderr", 
    "DocumentName": "InstanceDiagnostics", 
    "StandardOutputContent": "eth0      Link encap:Ethernet  HWaddr 02:9B:C5:26:4B:00  \n          inet addr:172.31.24.177  Bcast:172.31.31.255  Mask:255.255.240.0\n          inet6 addr: fe80::9b:c5ff:fe26:4b00/64 Scope:Link\n          UP BROADCAST RUNNING MULTICAST  MTU:9001  Metric:1\n          RX packets:9905 errors:0 dropped:0 overruns:0 frame:0\n          TX packets:3260 errors:0 dropped:0 overruns:0 carrier:0\n          collisions:0 txqueuelen:1000 \n          RX bytes:11135049 (10.6 MiB)  TX bytes:514905 (502.8 KiB)\n\nlo        Link encap:Local Loopback  \n          inet addr:127.0.0.1  Mask:255.0.0.0\n          inet6 addr: ::1/128 Scope:Host\n          UP LOOPBACK RUNNING  MTU:65536  Metric:1\n          RX packets:2 errors:0 dropped:0 overruns:0 frame:0\n          TX packets:2 errors:0 dropped:0 overruns:0 carrier:0\n          collisions:0 txqueuelen:1 \n          RX bytes:140 (140.0 b)  TX bytes:140 (140.0 b)\n\n", 
    "Status": "Success", 
    "StatusDetails": "Success", 
    "PluginName": "diagnose", 
    "ResponseCode": 0, 
    "ExecutionStartDateTime": "2017-04-19T22:13:47.122Z", 
    "CommandId": "666b0ea2-0004-4352-bddc-ac212e0e4090", 
    "StandardOutputUrl": "https://s3-us-west-1.amazonaws.com/run-command-blog/diagnostics/666b0ea2-0004-4352-bddc-ac212e0e4090/i-01222ecf7db201ca2/awsrunShellScript/0.diagnose/stdout"

最後,因為你設定了一個S3儲存桶,所有的命令呼叫的輸出結束將儲存在你指定的 S3的位置。

結論

在本文中,展示瞭如何使用“執行命令”以及其他AWS服務來對一組例項執行管理操作。“執行命令”提供了一種簡單且可擴充套件的方式來管理您的例項。 您可以控制傳送命令的速率,使用細粒度的許可權,並使用通知來簡化工作流程。

關於作者

Emily Freebairn是亞馬遜EC2系統管理團隊的軟體開發工程師。 她已經在亞馬遜工作了四年,從事Amazon EC2和系統管理器的“執行命令”和其他功能。 在工作之餘,她喜歡帆船和跳舞。

相關推薦

使用“執行命令管理例項

Emily Freebairn,亞馬遜AWS軟體開發工程師 翻譯 Ye Zhou | 原文連結 通常,工程師希望在一組例項中執行操作任務。 但是,這些任務中的許多工需要以受控的速度進行,並在出現問題時獲得反饋。 此外,管理員還通常希望確保工程師只能執行指定的操

執行管理(十)處理執行內的不受控制異常

宣告:本文是《 Java 7 Concurrency Cookbook 》的第一章, 作者: Javier Fernández González 譯者:鄭玉婷 處理執行緒組內不受控制異常 對於程式語言來說,一個非常重要的事情是提供管理應用出錯情況的機制。Java 語言, 作為最現代的程式語言,

命令管理命令()

file alias keyword function 命令管理命令:type,man,help,which,whereis,whatis,file,info1.1.type功能:顯示指定命令的類型命令類型有如下情形:alias 別名keyword 關鍵字,Shell保留字function 函

liuux 文件管理命令

linux文件管理命令 楚天逸 於平 linux Linux 文件管理命令(整理版 一 )1.cat: 用於八檔案串聯接後傳到基本輸出. 使用權限:所有使用者 語法格式: cat [-AbeEnstTuv] [--help] [--

通過ansible批量管理Linux服務器:配置Inventory和批量執行命令

ice 單引號 p地址 pytho 不支持 passwd 賬號密碼 常用 系統 ansible是一款比較新的自動化運維工具,基於Python開發,集合了眾多運維工具(puppet、cfengine、chef、func、fabric)的優點,實現了批量系統配置、批量程序部署、

獻給命令行重度用戶的實用 BASH 腳本

內存 tube linux 天都 linux 命令 newton 貨幣 倉庫 轉換 今天,我偶然發現了一組適用於命令行重度用戶的實用 BASH 腳本,這些腳本被稱為 Bash-Snippets,它們對於那些整天都與終端打交道的人來說可能會很有幫助。想要查看你居住地的天氣情況

例項學習ansible系列(3)Ansible執行命令常用Option

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

Linux使用者和使用者管理 使用者管理命令

新增使用者組:groupadd命令 修改使用者組:groupmod命令 刪除使用者組:groupdel命令 使用者新增進組或從組中刪除:gpasswd命令 切換使用者的有效組:newgrp命令   新增使用者組:groupadd命令 命令格式:[[email protecte

【看這篇就夠了】kubernetes入門命令列操作(例項演示)

寫在前面:網上找了好久終於找到了期盼已久的、一個一眼就能理解的kubernetes“整體全過程”文章。 建議看這篇文章可以結合kubernetes官網(www.kubernetes.io)的Tutorial進行演練,效果很好。 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

四班庫存管理任務分配

法律 處理 1.3 限制 系統 3.6 處理流程 可選 3.2 第一組 沈*峰 王*赫: 1引言: 1.1編寫目的 1.2.背景 1.3.定義 1.4.參考資料 第二組 王*蝶、黃*麗: 2可行性研究的前提: 2.1要求 2.2目標 2.3條件,假定和限制 2.4

天一個命令之--Linux(groupmod、groupadd)

Linux組的內容比較少,一塊兒總結了吧! 一、組檔案詳細說明。 /etc/group檔案包含系統上用到的每個組的資訊: root:x:0:root test:x:504: 可以看到該檔案有四個欄位: 1、組名 2、組密碼 3、GID 4、屬於該組的使用者列表。這個欄

Python開源Devops定時任務管理系統(含定時呼叫介面、定時ssh遠端執行命令

 OpenMangosteen Devops定時呼叫http介面,定時執行SSH命令的WEB定時任務工具。本系統強依賴Flask-APScheduler的功能,只是拓展了web頁面部分。使用Pytho

執行管理執行緒的建立和執行

宣告:本文是《 Java 7 Concurrency Cookbook 》的第一章, 作者: Javier Fernández González 譯者:鄭玉婷 校對:歐振聰 執行緒的建立和執行 在這個指南中,我們將學習如何在Java程式中建立和執行執行緒。與每個Java語言中的元素一樣,執行緒

《C#併發程式設計經典例項》學習筆記—2.4 等待任務完成

問題 執行幾個任務,等待它們全部完成。 使用場景 幾個獨立任務需要同時進行 UI介面載入多個模組,併發請求 解決方案 Task.WhenAll 傳入若干任務,當所有任務完成時,返回一個完成的任務。 過載方法 Task WhenAll(IEnumerable<Task>

走心又走腎的優質電商網站設計例項(下)

目前國內的幾家大型的電商平臺越做越完善,大有集眾家之所長於一身的趨勢。反觀國外的這些優質的電商網站,大多有自己的風格和不同於他人的設計方向。這些個性和堅持讓這些網站顯得越發的獨一無二了。也正是在這樣的設定之下催生了各不相同的設計策略和技巧,而這些正是我們需要重新思考、深入學習的地方。另外,本文的上半部分在此

走心又走腎的優質電商網站設計例項(上)

剁手節雙十一剛剛過去,雙十二又要來了。世界範圍內線上購物一再增長,中國的增速尤其明顯。雖然淘寶、京東和亞馬遜這樣的主流電商平臺依然佔據著主流地位,小型的電商購物平臺的生存空間也不小,新興的電商平臺的增長一樣不容忽視。如何設計出令人興奮的視覺搞,怎樣搞定流暢的購物體驗,是所有電商人都需要考慮,進一步完善的事情

Java併發程式設計之CountDownLatch,CyclicBarrier實現執行緒相互等待、喚醒

java多執行緒應用場景不少,有時自己編寫程式碼又不太容易實現,好在concurrent包提供了不少實現類,還有google的guava包更是提供了一些最佳實踐,這讓我們在面對一些多執行緒的場景時,有了不少的選擇。這裡主要是看幾個涉及到多執行緒等待的工具類。一 CountDo

. 執行管理之Thread基礎

不忘初心 砥礪前行, Tomorrow Is Another Day ! 相關文章 一.執行緒管理之Thread基礎 [二.執行緒管理之執行緒池]-完善中. [三.執行緒管理之Android中的多執行緒]-完善中. [四.執行緒管理之ThreadLocal]-完善中. 本

執行tracert命令只有跳的原因及解決方法

一直以來,我在家電腦DOS裡執行Tracert命令時都只看到只有一跳的返回結果,令我非常不解。我原以為是電信運營商那邊的問題,所以也就一直沒去追究是什麼真正的原因。 C:\Documents andSettings\Administrator>tracert www.

Linux使用者管理命令

一、使用者存在的意義 使用者存在的意義就是每個使用者擁有其各自的許可權,即它只能做自己能做的事情,不能影響和干擾其他使用者 二、組存在的意義 使用者限制了許可權,組就放開了許可權 初始組:最先開始的預設組,不能更改 附加組:除初始組之外附加的組,用來共享許可權 三、使用者的檢視 1) 檢視當