SSM

AWS Systems Manager の略で、EC2 やオンプレミスサーバーの管理、パラメータストアを提供する

AWS運用

SSM とは

AWS Systems Manager (SSM) は、EC2 インスタンスやオンプレミスサーバーの管理、パラメータストア、セッションマネージャーを提供するサービスである。サーバーレス開発では主に SSM Parameter Store を設定値の管理に使う。

これらの機能は、管理対象のサーバーに常駐する SSM Agent が AWS 側へ外向きの HTTPS 接続を張ることで成り立っている。手元からサーバーへ入っていく経路を作らないため、受信ポートを開けずに操作できるのがこのサービスの基本的な仕組みである。

SSM Parameter Store

Parameter Store は /myapp/prod/log-level のようなパス形式の名前で値を保管し、GetParameter で 1 件、GetParametersByPath でパス配下をまとめて取り出す。取得時に WithDecryption を付け忘れると暗号化した値は暗号文のまま返るため、設定が復号されないまま起動してしまう不具合につながりやすい。

import { SSMClient, GetParameterCommand } from '@aws-sdk/client-ssm';

const ssm = new SSMClient({});
const param = await ssm.send(new GetParameterCommand({
  Name: '/myapp/prod/log-level',
  WithDecryption: true,
}));
console.log(param.Parameter?.Value); // "INFO"

パラメータの種類

値の型は 3 つある。暗号化するかどうかと、値を 1 つとして扱うかリストとして扱うかで選ぶ。料金は型では決まらず、後述する階層と取得回数で決まる点に注意する。

種類暗号化取り出したときの形用途
Stringなし値がそのまま返る設定値、URL
StringListなしカンマ区切りの 1 つの文字列として返る宛先やホスト名の並び
SecureStringKMS で暗号化復号を指定しないと暗号文が返る重要度の低い資格情報

暗号化に使うキーを自分で用意した場合は、Parameter Store の料金とは別に KMS 側の料金がかかる。

標準パラメータと上級パラメータ

上限と料金は値の型ではなく階層で決まる。

観点標準上級
保管できる数1 アカウント 1 リージョンあたり 10,000100,000
値の最大サイズ4 KB8 KB
パラメータポリシー (有効期限・未使用の通知)使えない使える
アカウント間での共有できないできる
料金追加料金なし1 パラメータあたり月 $0.05

料金と上限は 2026 年 8 月時点の公表値である。上級の月額は、月の途中で作った分は時間割りで課金される。

階層は標準から上級へ上げられるが、上級から標準へは戻せない。 8 KB の値を 4 KB に収められない、パラメータポリシーが失われる、暗号化の方式が階層で違う、という 3 点が理由である。 既定の階層はアカウントとリージョンごとに設定でき、Intelligent-Tiering を選べば標準の上限に収まらない要求のときだけ上級が使われる。 設定を変えても既存のパラメータの階層は動かないため、後から一括で下げ直すことはできない。

取得の回数にも上限がある

料金とは別に、取得 API の呼び出し回数にも既定の上限がある。 GetParameterGetParametersGetParametersByPath の 3 つは合計で毎秒 40 回までで、 超えると ThrottlingException が返る。 オートスケーリングで一斉に立ち上がったインスタンスや、同時に増えた Lambda の実行環境が起動時に設定を読み込むと、 台数がそれほど多くなくてもこの上限に届く。

高スループットを有効にすれば GetParameter は毎秒 10,000 回まで引き上がるが、 標準パラメータでも取得に 10,000 回あたり $0.05 の料金がかかるようになる (2026 年 8 月時点)。 ここで数える 1 回はリクエスト数ではなくパラメータ 1 件の取り出しで、 10 件をまとめて返すリクエストは 10 回として計算される。 Lambda では AWS Parameters and Secrets Lambda Extension を挟み、 取得した値を実行環境にキャッシュして有効期限が切れるまで再利用する方法で呼び出し回数を抑えられる。

Secrets Manager との使い分け

どちらも値を保管して取り出す機能だが、Secrets Manager は値の入れ替えを前提に作られており、Parameter Store は設定値をパスで整理することに向く。差が出るのは次の 4 点である。

観点SSM Parameter StoreSecrets Manager
保管の料金標準パラメータは追加料金なし。上級パラメータは 1 件あたり月 $0.05シークレット 1 件あたり月 $0.40
自動ローテーション標準では行わず、入れ替えの処理は自分で用意するLambda を介して、対応するデータベースの資格情報を作り替える
用途設定値、フラグパスワード、API キー
階層構造/myapp/prod/db-host のようにパスで束ね、配下をまとめて取得できる名前で区切るだけで、まとめ取りの単位にはならない
/myapp/
  /prod/
    /db-host     → "db.example.com"
    /log-level   → "WARN"
  /dev/
    /db-host     → "localhost"
    /log-level   → "DEBUG"

Session Manager

SSM Agent が 443 番ポートの外向き通信で ssmssmmessagesec2messages のエンドポイントへつなぎ、その経路を通してシェルの入出力が流れる。接続の向きが内側から外側なので、セキュリティグループで 22 番ポートを開ける必要も、踏み台サーバーや SSH キーを用意する必要もない。誰が接続できるかは IAM ポリシーで決める。インターネットへ出せないサブネットでは、VPC エンドポイントを置いて同じエンドポイント群に到達させる。

記録は 2 段に分かれる。接続したという API の呼び出しは CloudTrail に、セッション中の操作内容は S3 か CloudWatch Logs に残る。ただしポートフォワーディングと、Session Manager 経由の SSH 接続は操作内容の記録に対応しない。監査のために全操作の記録を要件にしている環境では、この 2 つを許可した時点で穴が空くと考えたほうがよい。

aws ssm start-session --target i-1234567890abcdef0

Run Command

複数の EC2 インスタンスにコマンドを一括で実行する。対象はタグで指定できるため、台数が増えても指定を書き換えずに済む。実行は非同期で、送信時に返るコマンド ID を使ってインスタンスごとの成否と出力を後から照会する。

aws ssm send-command \
  --targets Key=tag:Environment,Values=prod \
  --document-name AWS-RunShellScript \
  --parameters commands=["yum update -y"]

サーバーレスでの SSM

Lambda と DynamoDB で組む構成には接続する相手のサーバーがないため、Session Manager や Run Command を使う場面はほとんどない。 使うのは Parameter Store で、環境変数に書くと変更のたびに再デプロイが必要になる値や、コードに残したくない値をここへ寄せる。

迷ったときは、値を定期的に作り替える仕組みが要るかどうかで決める。 作り替えが要る資格情報は Secrets Manager、変わらない設定値は Parameter Store が既定の選び方になる。 そのうえで、取得が多い経路では階層の料金より先に取得回数の上限が問題になることを見込んでおく。

この記事は役に立ちましたか?

関連用語

関連する記事