很多时候,我们会需要在 EC2 实例之外向实例发送命令,由实例来执行。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
获取地区(region)信息,这是怎么做到的?这是实例的动态数据。具体请参考 检索动态数据 和 检索实例元数据。
设置了 aws 的默认地区,是因为有些 aws-cli 命令必须指定区域方可执行。
注意,我们需要给 EC2 的 IAM 角色添加 AmazonEC2RoleforSSM
托管策略,使实例能够与 Run Command API 进行通信。给命令发送方的角色添加 AmazonSSMFullAccess
托管策略。具体请参考 配置访问权限。
配置完成,我们就能使用 AWS 的 EC2 控制台的系统管理器服务来发送命令,或者使用 aws-cli 或 AWS SDK 来做。
下面演示了发送“运行两条 Shell 脚本给实例 ${INSTANCE_ID}
”的命令:
待运行的命令:
aws s3 cp s3://bucket/key /tmp/myscript.sh
chmod +x /tmp/myscript.sh && /tmp/myscript.sh
使用 aws ssm send-command
命令来发送我们的命令:
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\"]}"
我们可以检查命令的执行结果,可以从 EC2 控制台的系统管理器服务——命令历史记录查看,也可以使用编程方式来做。
能够看到 exit code 和输出,如果输出很长,建议通过指定 S3 地址,注意此时也需要提供 S3 的访问权限。
官方文档可以参考 EC2 远程管理 的《EC2 实例入门》部分。
SSM 还有其他功能,比如敏感数据管理、定时任务、元数据采集等,但最常用的莫如执行脚本了。
祝大家使用愉快。
网友评论