EC2 Run Command and SSM Agent
EC2 Run Command 是用來執行遠端指令,管理 EC2 Instance、或者自己的 VM (on-primises) ,可以執行像是 Unix Scripts 和 Windows PowerShell 等。
SSM 全名是 Amazon EC2 Simple Systems Manager (SSM),主要就是用來控管 EC2 的代理程式,透過他可以自動化很多維運任務,常見的像是 Windows Update、SSM Agent Upgrade、Remote Script (bash or powershell),也可以做像是 CodeDeploy 的事情,然後用來做 CD。
EC2 Run Command & SSM Agent 不會另外收費。
感覺跟以前我在寫 Automation Test Framework 用的 STAF 概念類似,可以作為 Ops as Code
的底層架構。
角色
- 受控端 (Agent):通常就是 EC2 Instances,也可以是自己 Data Center 裡的機器。
- 需要安裝 SSM Agent,支援 Windows / Linux
- 需要設定 IAM Role / Policy
- 主控端 (Controller):下指令的地方,可以使 AWS EC2 Console 或者透過 AWS CLI / SDK
- SSM Document: 定義要執行的工作項目,可以想像是 script
SSM Agent
受控的機器要安裝 SSM Agent 之外,要有 IAM Role 可以設定 IAM Policy。
安裝 SSM Agent on EC2 Instances (CentOS, Ubuntu)
根據 region 指定 AWS_DEFAULT_REGION
變數:
1 | # CentOS |
SSM Agent 執行狀態檢查:
1 | sudo status amazon-ssm-agent |
設定 IAM Policy for EC2 Role
- 可從
AWS Managed Policies
選擇AmazonEC2RoleforSSM
- 設定 Role 的
Trust Relationship
1
2
3
4
5
6
7
8
9
10
11
12
13{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "",
"Effect": "Allow",
"Principal": {
"Service": "ec2.amazonaws.com"
},
"Action": "sts:AssumeRole"
}
]
}
IAM Policy
IAM User
如果你本身就有 Admin 權限,可以跳過這段。
AWS 提供兩個 Policies for Users:
- AmazonSSMFullAccess:
ssm:*
適合給 Admin - AmazonSSMReadOnlyAccess:
Get*
,List*
, `Describe*``
IAM Role
- AmazonEC2RoleforSSM
SSM Agent 的 Log
SSM Agent 的執行狀況會寫在 log:
/var/log/amazon/ssm/amazon-ssm-agent.log
/var/log/amazon/ssm/error.log
內容大概長這樣:
1 | 2016-10-19 21:41:47 INFO [instanceID=i-xxxxxxx] [MessageProcessor] increasing error count by 1 |
- 這裡可以取得 Agent 是否設定正確的資訊。
- SSM Agent 每五分鐘會跟 SSM API 溝通,確認 Agent 是可以正常運作的。
Troubleshooting: 確認 SSM Agent 清單
可以透過 AWS CLI 取得現在哪一些機器是受控的:aws ssm describe-instance-information
會產生類似以下的內容,主要是機器名稱、作業系統 (版本)、SSM Agent 版版、是否上線 … 等基本資訊。
1 | aws ssm describe-instance-information |
也可以個別過濾條件:
1 | aws ssm describe-instance-information \ |
如果沒有回覆資料,先確認一下 awscli 的 region 設定是否正確。
執行 Command
執行 Command 可以透過 AWS Console -> EC2 -> Commands -> Command History
,或者 AWS CLI,底下的例子是送簡單的 commands:
1 | aws ssm send-command \ |
取得 Command 執行狀態:
1 | aws ssm list-command-invocations \ |
安全性
我測試執行 AWS-RunShellScript
這個 Document,跑的 CLI 是 whoami
、pwd
、env
、date
,結果如下:
1 | === Run `whoami` |
發現他就是用 root
在跑,不給 workdir
就會在根目錄,也沒有什麼環境變數。
官方文件也有特別註明,這會有安全性考量,建議最好做適度的管控。
結論
就是設計給 Operator 使用的工具,在 AWS 還沒 Release 前,我就想用類似的工具,像是 STAF / chef 作 Operations 的工作。這個想法成行沒多久,EC2 Run Command 就出來了 XD
雖然概念就是一般的 agent base 應用,像是防毒軟體、權限控管、Chef、CodeDeploy … 但其實還是很實用的。
除了 Operator 使用,也可以串接現在很流行的機器人,做互動控制。
雖然很方便,帶來的就是安全性要特別注意。
延伸閱讀
- Ops as Code with AWS CLI
- AWS Certified SysOps Administrator - Associate 準備心得
- Study Notes - AWS Identity and Access Management (IAM)
- Shell Script
- AWS Study Roadmap
參考資料
- Remotely Manage Your Linux Instances Using Run Command
- Remotely Manage Your Windows Instances Using Run Command
- AWS CLI - SSM