🌊

awscliで、SessionManagerで接続可能なEC2インスタンスをNameタグでfilterしたい

2020/11/29に公開

ユースケース

  • 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