コンテンツにスキップ

SSM の仕様

使いかたは SSM で EC2 にログインする にあります。ここには、その細かい規則をまとめます。

項目 規則
使用するプロファイル 必須。ホストはプロファイルを内部の ID で覚えます。プロファイルを削除して登録し直すと別のものになり、ホストからは選び直しが要ります
別名 必須。ほかのホストと同じ別名も登録できます。そのときセッションの名前には、プロファイルの名前(なければアカウント ID)が括弧で付きます
インスタンス ID 必須
リージョン 任意。決まりかたは リージョン
run-as ドキュメント 任意。入れると aws ssm start-session --document-name に渡します。空なら Session Manager の既定のシェルです
端末の色 既定は「自動」で、ホストごとに決まります。色はセッションを作るときに付くので、変えると、これから開くセッションに効きます
  • ホストの編集は、これから開くセッションに効きます。開いているセッションの接続先は変わりません。
  • ホストが使っているプロファイルは削除できず、画面がそのホストを挙げます。ほかのプロファイルがロールを引き受ける元になっている プロファイルも、削除やロールを引き受ける種類への変更ができません。
  • ホストが使っていたプロファイルがないときは、行に「プロファイルが削除されています」と出ます。編集して選び直してください。

接続するリージョンは、次の順で最初に決まったものです。

  1. ホストのリージョン
  2. プロファイルの既定リージョン
  3. 別のプロファイルからロールを引き受けるプロファイルなら、元のプロファイルの既定リージョン
  4. SSO のプロファイル(ロールを引き受けるなら元のプロファイル)の SSO リージョン

~/.aws/config に書き出すプロファイルも同じ順で決まるので、aws、SDK、SSM のセッションは同じリージョンに届きます。

  • 端末はまず aws sts get-caller-identity でログインを確かめ、ログインしていなければデバイスコードのログインを始めます。 コードは「SSM ログイン」の画面に出ます。ロールを引き受けるプロファイルでは、ログインするのは元のプロファイルです。
  • 接続の直前に [Agent Fleet] AWS profile <名前> (identity from Settings, not confirmed) · account … · role … · region … · target … の 1 行を出します。設定に書かれた身元で、AWS に確かめたものではありません。値のない項目は出ません。ロールを引き受けるプロファイルでは via <元のプロファイル>、 共有サインインでは sign-in <名前> も出ます。
  • 強制的に再ログイン(停止したセッションでは 再ログインして再開)は、そのプロファイルのログインを捨ててからログインします。
  • 「SSM ログイン」の画面で キャンセル を押すと、新しく作ったセッションはごみ箱へ移ります。停止していたセッションを 開き直したときは、セッションは停止したまま残ります。
  • 停止した SSM のセッションを 再開 すると、ログインの確認からやり直します。

「はじめる」の SSM の画面の AWS から検索 は、選んだプロファイルで aws ssm describe-instance-information を実行します。

  • 出るのは、今オンラインの EC2 インスタンス(i-…)だけです。オンプレミスのマネージドノード(mi-…)は出ません。
  • 名前は EC2 の Name タグです。ロールに ec2:DescribeInstances がないときは名前なしで出ます。
  • ssm:DescribeInstanceInformation がないと「AWS上のインスタンスを検索する権限がありません」と出ます。
  • プロファイルが 2 つ以上あるときは、検索に使うプロファイルを選べます。1 つだけならそのプロファイルです。登録 したホストも、そのプロファイルで接続します。
  • 検索は保存済みのログインを使います。ログインが切れていると失敗するので、登録済みのホストに一度接続してログインしてください。
  • 検索は 25 秒で打ち切ります。権限以外の AWS のエラーは「AWS の検索に失敗」と出ます。
  • 登録 で作るホストの別名は、Name タグ、なければコンピューター名、それもなければインスタンス ID です。リージョンは空 (プロファイルの既定)、run-as ドキュメントも空です。
  • 検索の結果は Agent Fleet に保存しません。

~/.ssh/config から取り込む(プロファイルの取り込みの隣)は、ssh の設定を読んで SSM ホストを作ります。

接続のしかたが変わります。 ssh の設定では、これらのエントリは ProxyCommand aws ssm start-session … --document-name AWS-StartSSHSession で SSM のトンネル越しに SSH セッション (ユーザー・鍵・ポート)を開きます。Agent Fleet のホストは、インスタンス上で aws ssm start-session のシェルを開き、 SSH のユーザー・鍵・ポートはありません。User・IdentityFile・Port・転送などの設定は引き継がれず、プレビューにそれらの名前が出ます。

ファイルはブラウザの中だけで読み、ProxyCommand は実行も表示も送信も保持もしません。 保存されるのは、チェックした 行の別名・インスタンス ID・AWS プロファイル・リージョンだけで、ホストの追加と同じ保存を使います。

読むのは決まった 1 つの形だけです。

  • 1 つの具体的な名前の Host であること
  • ProxyCommand が aws ssm start-session(sh -c "…" で包んだ形も可)であること
  • 次のオプションだけを、各 1 回まで使うこと
    • --target:インスタンス ID(i-… / mi-…)か %h。%h はそのエントリの HostName、HostName がなければ Host の名前そのもので、 インスタンス ID であること
    • --document-name AWS-StartSSHSession
    • --parameters portNumber=%p(または portNumber=22)
    • --profile
    • --region

それ以外は、理由つきで取り込めません。他のドキュメント(ポートフォワード・独自)、他のオプション、他の % トークン、 シェルの構文(;・|・$(…)・単語全体を囲む以外の引用符)、ProxyJump、CanonicalizeHostname、ワイルドカード(*・?)、否定(!)、 Match、Include です。

OpenSSH は、名前に当てはまる全ブロックを通して、各キーワードの最初の値を使うので、ブロックは互いに独立していません。 ProxyCommand(%h が要るときは HostName も)が最初の値で、かつそのホスト名を直接書いたブロックから来ている ときだけ取り込めます。Host * や前にあるパターンから受け継ぐ値、これらのキーワードを設定する Match や Include(その中身は貼り付けた文面にありません)より後ろの値は断ります。取り込みたいときは、Include 先の内容を 上に貼り、そのホストのエントリを全部書いてください。

  • AWS プロファイルは、AWS 名がコマンドの --profile と同じ設定のプロファイルです。--profile がない、または 一致するものがないときは、行の中でプロファイルを選びます。
  • 別名に使えるのは英数字と . _ @ - で、64 文字までです。
  • すでにある行(別名とインスタンスが同じ)は 登録済み と出ます。別のインスタンスで使われている別名は断ります。
  • 1 つのファイルで読めるエントリは 500 件までです。
  • アクセスキーやトークンらしきものがあると警告し、それは使いません。
  • 「取り込む」を押すまで何も作りません。今のホストの一覧を読めなければ、何も送りません。