🌊
awscliで、SessionManagerで接続可能なEC2インスタンスをNameタグでfilterしたい
ユースケース
- awscliを使ってSessionManager経由でEC2インスタンスに接続したい
- 接続する前にインスタンスIDを取得する必要があり、EC2インスタンスに付与したNameタグで絞り込みたい
解決策
コードをば。
aws ssm describe-instance-information --cli-input-json '{"Filters":[{"Key":"tag:Name","Values":["instance-name"]}]}' --profile your-profile
解説
ssm describe-instance-infomation
SessionManagerで接続可能なインスタンスの取得には、 ssm describe-instance-infomation
を使う。
describe-instance-information — AWS CLI 2.1.4 Command Reference
EC2インスタンスの取得で真っ先に思いつくのは ec2 describe-instances
だが、インスタンスにssm agentがインストールされていない場合は接続ができない。
AWSコンソール上でセッションを開始する際のインスタンスの一覧の表示があり、それと同じようなAPIは提供されていないのか?と調べたところ ssm describe-instance-information
が該当した。
Nameタグによる絞り込み
describe-instance-infomationには filter
オプションがあったので、それを使えば良いだろうとまず思った。
ドキュメントを見ると tag-key
としてインスタンスに付与したタグのキー名でフィルタリングができるが、キーに対応する値でのフィルタリングが用意されておらず困った。
ec2 describe-instances
では tag-key
tag-value
または tag:
でのフィルタリングができるのだが、describe-instance-infomationでは対応していないようだ…
困っていたところ、 cli-input-json
でのフィルタリングではより複雑な検索ができるとのことで試してみると tag:
のショートハンドが使えるようだった。解決!
まとめ
というわけで再掲。
aws ssm describe-instance-information --cli-input-json '{"Filters":[{"Key":"tag:Name","Values":["instance-name"]}]}' --profile your-profile
これでセッションマネージャー経由の接続シェルが書ける。
Discussion