AWS SSM Get Parameterを活用したマルチ環境VPC秘密設定管理設計|dev/stg/prod分離

宮崎智広 この記事の監修:宮崎智広(Linux実務・教育歴20年以上・受講者3,100名超)
HOME > Linux技術 リナックスマスター.JP(Linuxマスター.JP) > AWS(Amazon Linux) > AWS SSM Get Parameterを活用したマルチ環境VPC秘密設定管理設計|dev/stg/prod分離
AWSのマルチ環境(dev/stg/prod)でVPCを分けて構築したとき、こんな課題が出てきます。
「環境ごとのDBパスワードやAPIキーをどこに保存すればいい?」「EC2上に.envファイルを置くのは安全か」「ハードコーディングを避けながら、dev/stg/prodで設定を自動的に切り替えたい」

この記事では、AWS Systems Manager(SSM)Parameter Storeとaws ssm get-parameterコマンドを活用した、dev/stg/prod分離のVPC秘密設定管理設計の「型」を解説します。
パス設計・IAMポリシー制御・EC2起動スクリプトへの組み込みまで、実務で即使えるパターンを紹介します。

この記事のポイント

・aws ssm get-parameterでパラメータを環境ごとに安全取得できる
・/dev/, /stg/, /prod/ のパス設計でdev/stg/prod環境を完全分離する
・SecureStringは--with-decryptionオプションで復号して取得する
・IAMポリシーのパスプレフィックス制限で環境間の誤アクセスを防げる


「このままじゃマズい」と感じていませんか?
参考書を開く気力もない、同年代に取り残される不安——
でも安心してください。プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
姓・名・メールの3つだけ/30秒/解除は3秒 / 詳細はこちら

なぜ.envファイルよりSSM Parameter Storeなのか

環境変数の管理方法として、.envファイルをEC2に配置するアプローチをよく見かけます。シンプルで手っ取り早いのですが、マルチ環境・VPC分離の構成では次の課題が出てきます。

・ファイル管理の複雑化:.env.dev、.env.stg、.env.prodと増えていくにつれ、どのサーバーに何を配置したか把握しにくくなります
・秘密情報がディスクに平文で残る:AMI作成やスナップショット取得の際に意図せず含まれるリスクがあります
・変更履歴と監査ログが取れない:誰がいつ設定値を変更したか追跡できません

AWS SSM Parameter Storeはこれらをまとめて解決します。パラメータはAWS側で一元管理され、KMS暗号化・IAMアクセス制御・変更履歴の自動記録がすべてセットになっています。EC2インスタンスはAPI callで値を取得するだけなので、.envファイルをサーバーに置く必要がなくなります。

なお、マルチAZを使ったVPCの冗長構成の全体設計は、AWSマルチAZ構成でLinuxサーバーを冗長化する設計パターンで解説しています。

dev/stg/prod分離のSSMパラメータ設計

1. パス名前空間の設計

SSM Parameter Storeのパラメータ名は、ディレクトリ構造のようにスラッシュで階層化できます。この特性を活かして、以下のような名前空間を設計するのが定石です。

# パラメータパス設計の例(アプリ名: myapp) /dev/myapp/db_host dev環境のDBエンドポイント(String型) /dev/myapp/db_password dev環境のDBパスワード(SecureString型) /stg/myapp/db_host stg環境のDBエンドポイント(String型) /stg/myapp/db_password stg環境のDBパスワード(SecureString型) /prod/myapp/db_host prod環境のDBエンドポイント(String型) /prod/myapp/db_password prod環境のDBパスワード(SecureString型) /prod/myapp/api_key prod環境のAPIキー(SecureString型)

先頭の /{環境名}/{アプリ名}/ という2階層のプレフィックスが重要です。後述のIAMポリシーでこのプレフィックスを使って環境ごとのアクセス範囲を絞り込みます。アプリが複数ある場合でも /prod/appA/ /prod/appB/ と横に増やしていけます。

2. パラメータの型(String vs SecureString)

SSM Parameter Storeには3つの型があります。実務で使うのは主にStringとSecureStringの2つです。

・String:平文で保存する型。DBホスト名・S3バケット名・エンドポイントURLなど、暗号化が不要な設定値に使います
・SecureString:KMSキーで暗号化して保存する型。DBパスワード・APIキー・認証トークンなど、秘密情報に使います。取得時は --with-decryption オプションが必要です
・StringList:カンマ区切りのリスト値。用途が限られるため本記事では割愛します

迷ったらSecureStringを使うのが安全側の判断です。KMS暗号化のコストは実務規模では無視できるレベルです。

3. 環境別IAMポリシーの設計

dev/stg/prod分離の肝は、「dev環境のEC2はdevのパラメータにしかアクセスできない」というIAM制約です。以下のようなポリシーをEC2のインスタンスプロファイルにアタッチします。

prod環境のEC2インスタンスプロファイル用ポリシー例:

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "ssm:GetParameter", "ssm:GetParameters", "ssm:GetParametersByPath" ], "Resource": "arn:aws:ssm:ap-northeast-1:123456789012:parameter/prod/*" }, { "Effect": "Allow", "Action": "kms:Decrypt", "Resource": "arn:aws:kms:ap-northeast-1:123456789012:key/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx" } ] }

Resource に /prod/* と指定することで、prod環境のパラメータ(/prod/myapp/db_host 等)へのアクセスのみ許可し、/dev/ や /stg/ への誤アクセスを構造的に防げます。dev環境のポリシーには /dev/* を指定します。

aws ssm get-parameterの基本的な使い方

実行環境:Amazon Linux 2023(EC2インスタンス / AWS CLI v2.17)で動作確認済みです。

1. 前提条件(AWS CLIとIAMロール)

EC2インスタンスからaws ssm get-parameterを実行するには、以下が必要です。

・AWS CLI v2がインストール済み:Amazon Linux 2023には標準インストール済みです
・EC2インスタンスプロファイルにSSM権限:前述のIAMポリシーをインスタンスプロファイル経由でアタッチします
・--regionオプション:パラメータが存在するリージョンを必ず指定してください

AWS CLIのバージョン確認:

aws --version # 出力例: # aws-cli/2.17.28 Python/3.11.9 Linux/6.1.91-99.172.amzn2023.x86_64 exe/x86_64.amzn.2023

2. String型パラメータの取得

aws ssm get-parameter --name "/prod/myapp/db_host" --region ap-northeast-1

実行結果:

{ "Parameter": { "Name": "/prod/myapp/db_host", "Type": "String", "Value": "myapp-prod.cluster-xxxxxxxxxx.ap-northeast-1.rds.amazonaws.com", "Version": 3, "LastModifiedDate": "2026-09-15T10:23:41.000Z", "ARN": "arn:aws:ssm:ap-northeast-1:123456789012:parameter/prod/myapp/db_host", "DataType": "text" } }

3. SecureStringパラメータの取得(--with-decryption)

SecureString型のパラメータを取得する場合は、--with-decryption オプションが必須です。このオプションなしで取得すると、KMS暗号化されたBase64エンコード値がそのまま返ってきます。

# --with-decryptionあり(SecureStringの正しい取得方法) aws ssm get-parameter --name "/prod/myapp/db_password" --with-decryption --region ap-northeast-1

実行結果:

{ "Parameter": { "Name": "/prod/myapp/db_password", "Type": "SecureString", "Value": "MyS3cur3P@ssw0rd!", "Version": 5, "LastModifiedDate": "2026-09-15T10:23:42.000Z", "ARN": "arn:aws:ssm:ap-northeast-1:123456789012:parameter/prod/myapp/db_password", "DataType": "text" } }

4. 値だけを変数に代入する方法

シェルスクリプトでパラメータ値を変数に代入するには、--query と --output text を組み合わせます。

# 値のみを取得して変数に代入する DB_HOST=$(aws ssm get-parameter --name "/prod/myapp/db_host" --query "Parameter.Value" --output text --region ap-northeast-1) echo "${DB_HOST}" # 出力例: myapp-prod.cluster-xxxxxxxxxx.ap-northeast-1.rds.amazonaws.com

--query "Parameter.Value" でValue部分だけを抽出し、--output text でJSONラッパーを外した生の文字列として取得できます。この形式がシェルスクリプトへの組み込みで最もよく使われます。

EC2起動スクリプトへの組み込み実践

EC2のUser DataスクリプトやOS起動後のinit処理でSSMからパラメータを取得し、アプリに渡すパターンです。Amazon LinuxのEC2サーバー構築の基礎を押さえた上で読むと、User Dataとの組み合わせがイメージしやすくなります。

#!/bin/bash # EC2起動時にSSMからパラメータを注入するスクリプト # 前提: EC2インスタンスプロファイルにssm:GetParameter権限がアタッチ済み ENV="prod" APP="myapp" REGION="ap-northeast-1" # String型パラメータ取得 DB_HOST=$(aws ssm get-parameter --name "/${ENV}/${APP}/db_host" --query "Parameter.Value" --output text --region "${REGION}") # SecureString型パラメータ取得(--with-decryptionが必要) DB_PASSWORD=$(aws ssm get-parameter --name "/${ENV}/${APP}/db_password" --with-decryption --query "Parameter.Value" --output text --region "${REGION}") API_KEY=$(aws ssm get-parameter --name "/${ENV}/${APP}/api_key" --with-decryption --query "Parameter.Value" --output text --region "${REGION}") # 取得した値をアプリの設定ファイルに書き出す cat > /opt/myapp/.env << ENVEOF DB_HOST=${DB_HOST} DB_PASSWORD=${DB_PASSWORD} API_KEY=${API_KEY} ENVEOF chmod 600 /opt/myapp/.env # アプリケーション起動 systemctl start myapp

このスクリプトの3つのポイントです。

・ENVとAPP変数で環境・アプリを切り替え:dev/stg/prodで同じスクリプトを使い回せます。ENVをEC2インスタンスタグから動的に取得するとさらに汎用性が上がります
・最終的に.envファイルに書き出す:アプリが設定ファイルを読む設計なら、SSMから取得した値を一時ファイルに書き出してchmod 600で保護します
・systemd経由で起動する場合:/etc/systemd/system/myapp.service の EnvironmentFile に書き出す方法も有効です

プライベートサブネットからのSSM接続(VPC Endpoint設定)

EC2をプライベートサブネットに配置してインターネットゲートウェイを持たないVPC構成にしている場合、そのままではSSM Parameter StoreのAPIエンドポイントに到達できません。この場合はVPC Endpointを作成して解決します。

SSMアクセスに必要なVPC Endpointは3つです。

・com.amazonaws.ap-northeast-1.ssm(SSM本体のAPIエンドポイント)
・com.amazonaws.ap-northeast-1.ssmmessages(SSM Session Manager用)
・com.amazonaws.ap-northeast-1.ec2messages(EC2との通信用)

AWSコンソールでVPC → エンドポイント → エンドポイントの作成 から追加します。セキュリティグループはEC2サブネットのCIDR(例:10.1.0.0/16)からのHTTPS(443)インバウンドを許可します。

VPC Endpoint作成後、プライベートサブネット上のEC2からaws ssm get-parameterが正常に実行できることを確認してください。

「AccessDeniedException」「ParameterNotFound」が出た時の対処

【エラー1】AccessDeniedException

An error occurred (AccessDeniedException) when calling the GetParameter operation: User: arn:aws:sts::123456789012:assumed-role/dev-ec2-role/i-0123456789abcdef0 is not authorized to perform: ssm:GetParameter on resource: arn:aws:ssm:ap-northeast-1:123456789012:parameter/prod/myapp/db_password

原因と対処:

・IAMポリシーのResource範囲を確認:dev-ec2-roleのResourceが /dev/* に限定されているにもかかわらず /prod/ パスを要求しています。アクセスしようとしているパスがポリシーのResourceと一致しているか確認してください
・SecureStringのKMS Decrypt権限不足:kms:Decrypt のResourceにSecureStringを暗号化したKMSキーのARNが含まれていない場合もAccessDeniedになります。KMSキーのARNをポリシーに追加してください

【エラー2】ParameterNotFound

An error occurred (ParameterNotFound) when calling the GetParameter operation: Parameter /prod/myapp/db_host not found.

原因と対処:

・パスの完全一致を確認:大文字・小文字・スラッシュの有無が完全一致しないと見つかりません。以下のコマンドで実在するパラメータ一覧を確認してください

# /prod/myapp/ 配下のパラメータ一覧を確認する aws ssm describe-parameters --parameter-filters "Key=Name,Option=BeginsWith,Values=/prod/myapp/" --region ap-northeast-1 --query "Parameters[*].Name" # 出力例: # [ # "/prod/myapp/api_key", # "/prod/myapp/db_host", # "/prod/myapp/db_password" # ]

【エラー3】ConnectTimeoutError(プライベートサブネット)

ConnectTimeoutError: Connect timeout on endpoint URL: "https://ssm.ap-northeast-1.amazonaws.com/"

原因と対処:

・プライベートサブネット内のEC2からインターネット経由でSSMに接続しようとしています。前述の3つのVPC Endpointを作成することで解決します

本記事のまとめ

やりたいこと コマンド
String型パラメータを取得する aws ssm get-parameter --name "/prod/app/key" --region ap-northeast-1
SecureStringを復号して取得する aws ssm get-parameter --name "/prod/app/pw" --with-decryption --region ap-northeast-1
値だけを変数に代入する aws ssm get-parameter --name "/prod/app/key" --query "Parameter.Value" --output text --region ap-northeast-1
複数パラメータを一括取得する aws ssm get-parameters --names "/prod/app/key1" "/prod/app/key2" --with-decryption --region ap-northeast-1
パスプレフィックスで一括取得する aws ssm get-parameters-by-path --path "/prod/myapp" --recursive --with-decryption --region ap-northeast-1
SSM Parameter Storeを使ったdev/stg/prod分離の秘密設定管理は、「パス設計 → IAMポリシーによる環境分離 → EC2起動スクリプトへの組み込み」という3ステップで完成します。.envファイルのサーバー直置きと比べ、監査ログ・暗号化・環境間の誤操作防止がすべて担保される点が最大のメリットです。

現場で通用する安全なLinuxサーバー構築の「型」を体系的に身につけたい方へ、AWS(Amazon Linux)環境を含むLinuxサーバー構築の基礎から実践まで体系的に学べる無料マニュアルを用意しています。

>> AWS(Amazon Linux)でLinuxサーバー構築を始める方法はこちら

無料メルマガで学習を続ける

Linuxの実践スキルをメールで毎週お届け。
登録は30秒、解除もいつでも可。

登録無料・いつでも解除できます

暗記不要・1時間後にはサーバーが動く

3,100名以上が実践した「型」を無料で公開中

プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
その「型」を図解60Pにまとめた入門マニュアルを、完全無料でプレゼントしています。

姓・名・メールの3つだけ/30秒/解除は3秒 / 詳細はこちら

Linux無料マニュアル(図解60P) 名前とメールで30秒登録
宮崎 智広

この記事を書いた人

宮崎 智広(みやざき ともひろ)

株式会社イーネットマーキュリー代表。現役のLinuxサーバー管理者として20年以上の実務経験を持ち、これまでに累計3,100名以上のエンジニアを指導してきたLinux教育のプロフェッショナル。「現場で本当に使える技術」を体系的に伝えることをモットーに、実践型のLinuxセミナーの開催や無料マニュアルの配布を通じてLinux人材の育成に取り組んでいる。

趣味は、キャンプにカメラ、トラウト釣り。好きな食べ物は、ラーメンにお酒。休肝日が作れない、酒量を減らせないのが悩み。最近、ドラマ「フライトエンジェル」を観て涙腺が崩壊しました。