使用 aws ssm cli 连接跳板机
背景
在云原生开发越来越热的今天,公司采用云服务提供商的托管 Kubernetes 集群部署应用很常见。如果采用了 AWS 的 EKS,并且公司网络和集群的网络没有打通的情况下,要查看集群资源,可以通过 AWS 的会话管理器,启动 Web Console 来进行。但是这样手动步骤过多,对开发不够友好。
并且目前的 AWS web console,有一个 BUG,即在 web console 里通过 kubectl edit cm/xxxconfigmap 对 configmap 进行编辑后,无法使用常用的 ESC 或者 Ctrl + [ 退出 vi 的插入模式,因为这两个按键方式都会被浏览器截获,导致失去编辑窗口的焦点。尽管我通过试验 Ctrl + o 可以不失去焦点成功退出vi 的插入模式,但是如果能够不用 web console 是最理想的。
aws ssm cli
可以通过 aws ssm cli 来避免使用 web console。但是直接使用会报连接失败的错误。
解决方案
通过脚本自动登录并获取 AWS 临时令牌,以获得连接权限。
先决条件
Python3 已安装:
➜ python3 --version
Python 3.8.2
克隆脚本
git clone git@github.com:Jeff-Tian/aws-adfs-auth.git
cd aws-adfs-auth
安装依赖
sudo pip3 install --upgrade pip # upgrade to latest pip3
sudo pip3 install -r requirements.txt # install dependencies
获取临时令牌
CYBERARK_SERVER=pam.corp.your-company.com ADFS_DOMAIN=adfs.corp.your-company.com ADFS_DOMAIN_USERNAME=cnXXX ADFS_DOMAIN_PASSWORD=***** python3 main.py -r cn-north-1 --no-certificate-verify
安装 ssm 插件
curl "https://s3.amazonaws.com/session-manager-downloads/plugin/latest/mac/session-manager-plugin.pkg" -o "session-manager-plugin.pkg"
sudo installer -pkg session-manager-plugin.pkg -target /
ln -s /usr/local/sessionmanagerplugin/bin/session-manager-plugin /usr/local/bin/session-manager-plugin
连接跳板机
aws ssm start-session --target i-1234-instance-id-of-ec2
使用 kubectl 命令查看集群资源
➜ aws ssm start-session --target i-1234-instance-id-of-ec2
Starting session with SessionId: jeff-sqs-test-0a8d0d4f75545e986
sh-4.2$ sudo su
[root@ip-172-20-20-231 bin]# kubectl get pod
NAME READY STATUS RESTARTS AGE
adminer-f5cc4fcc7-dx7d9 1/1 Running 0 12d
yapi-deployment-mongo-855fff7c6d-fshs4 1/1 Running 0 12d
[root@ip-172-20-20-231 bin]# exit
exit
sh-4.2$ exit
exit
Exiting session with sessionId: jeff-sqs-test-0a8d0d4f75545e986.
总结
第一次使用需要执行一系列命令,因为需要安装一些依赖。在随后的工作中,只需要执行如下两个命令就行了:
CYBERARK_SERVER=pam.corp.your-company.com ADFS_DOMAIN=adfs.corp.your-company.com ADFS_DOMAIN_USERNAME=cnXXX ADFS_DOMAIN_PASSWORD=***** python3 main.py -r cn-north-1 --no-certificate-verify
aws ssm start-session --target i-1234-instance-id-of-ec2
临时令牌只有一个小时的有效期,但是由于执行命令比起操作网页快得多,因此很方便自动化。