
很多時候,我們會需要在 EC2 實例之外向?qū)嵗l(fā)送命令,由實例來執(zhí)行。AWS 給我們提供了這種服務,叫 Amazon EC2 Simple System Manager(SSM)。
我們需要在目標實例安裝 SSM Agent 程序來通信。最好在實例的啟動腳本里來做這件事:
yum update -q -y
REGION=$(curl -s http://169.254.169.254/latest/dynamic/instance-identity/document | grep region | awk -F\\\" '{print $4}')
aws configure set default.region ${REGION}
function install_ssm_agent() {
curl https://amazon-ssm-${REGION}.s3.amazonaws.com/latest/linux_amd64/amazon-ssm-agent.rpm -o /tmp/amazon-ssm-agent.rpm 2>/dev/null &&
yum install -q -y /tmp/amazon-ssm-agent.rpm &&
status amazon-ssm-agent || start amazon-ssm-agent
}
status amazon-ssm-agent || (start amazon-ssm-agent || install_ssm_agent)
你可能注意到我們從 169.254.169.254 獲取地區(qū)(region)信息,這是怎么做到的?這是實例的動態(tài)數(shù)據(jù)。具體請參考 檢索動態(tài)數(shù)據(jù) 和 檢索實例元數(shù)據(jù)。
設置了 aws 的默認地區(qū),是因為有些 aws-cli 命令必須指定區(qū)域方可執(zhí)行。
注意,我們需要給 EC2 的 IAM 角色添加 AmazonEC2RoleforSSM 托管策略,使實例能夠與 Run Command API 進行通信。給命令發(fā)送方的角色添加 AmazonSSMFullAccess 托管策略。具體請參考 配置訪問權(quán)限。
配置完成,我們就能使用 AWS 的 EC2 控制臺的系統(tǒng)管理器服務來發(fā)送命令,或者使用 aws-cli 或 AWS SDK 來做。
下面演示了發(fā)送“運行兩條 Shell 腳本給實例 ${INSTANCE_ID}”的命令:
待運行的命令:
aws s3 cp s3://bucket/key /tmp/myscript.sh
chmod +x /tmp/myscript.sh && /tmp/myscript.sh
使用 aws ssm send-command 命令來發(fā)送我們的命令:
aws ssm send-command \
--document-name "AWS-RunShellScript" \
--instance-ids ${INSTANCE_ID} \
--parameters "{\"commands\": [\"aws s3 cp s3://bucket/key /tmp/myscript.sh\", \"chmod +x /tmp/myscript.sh && /tmp/myscript.sh\"]}"
我們可以檢查命令的執(zhí)行結(jié)果,可以從 EC2 控制臺的系統(tǒng)管理器服務——命令歷史記錄查看,也可以使用編程方式來做。
能夠看到 exit code 和輸出,如果輸出很長,建議通過指定 S3 地址,注意此時也需要提供 S3 的訪問權(quán)限。
官方文檔可以參考 EC2 遠程管理 的《EC2 實例入門》部分。
SSM 還有其他功能,比如敏感數(shù)據(jù)管理、定時任務、元數(shù)據(jù)采集等,但最常用的莫如執(zhí)行腳本了。
祝大家使用愉快。