「環境ごとの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ポリシーのパスプレフィックス制限で環境間の誤アクセスを防げる
でも安心してください。プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
なぜ.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. パラメータの型(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" } ] }
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
・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 |
現場で通用する安全なLinuxサーバー構築の「型」を体系的に身につけたい方へ、AWS(Amazon Linux)環境を含むLinuxサーバー構築の基礎から実践まで体系的に学べる無料マニュアルを用意しています。
3,100名以上が実践した「型」を無料で公開中
プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
その「型」を図解60Pにまとめた入門マニュアルを、完全無料でプレゼントしています。
姓・名・メールの3つだけ/30秒/解除は3秒 / 詳細はこちら
- 前のページへ:AWS SSM AgentのVPCエンドポイント経由インストール設計|インターネット非公開環境
- この記事の属するカテゴリ:AWS(Amazon Linux)へ戻る

無料メルマガで学習を続ける
Linuxの実践スキルをメールで毎週お届け。
登録は30秒、解除もいつでも可。
登録無料・いつでも解除できます