はじめに
2024年2月22日、Amazon Web Services(AWS)はSystems Manager Parameter Storeのパラメータをアカウント間で共有できる機能を発表しました。
Parameter Storeにとっては新機能ですが、AWS Secrets Managerでは以前からアカウント間でのシークレット共有がサポートされていました。Parameter Storeでもパラメータを共有できるようになった今、シークレットの保存と共有にはSecrets Managerではなく、Parameter Storeを使うべきなのでしょうか。
本記事では、Secrets ManagerとParameter Storeの違いを整理したうえで、AWSアカウント間でシークレットパラメータを作成・共有するための手順を解説します。
Secrets Manager vs. 暗号化パラメータ
Secrets Managerの機能と制限
- シークレットはKMSキーで自動的に暗号化される
- シークレットの自動ローテーションが可能
- シークレットの最大サイズは64KB
- マネジメントコンソール、CLI、CloudFormation、Terraformなどでシークレットを作成可能
- リージョン間で自動的にレプリケーション可能
- 毎秒最大10,000件の
GetSecretValueリクエストに対応 - 幅広いAWSサービスに加え、Hashicorp Vaultなどのサードパーティ製サービスからも利用可能
- 料金:シークレット1件あたり月額$0.40、APIコール10,000件あたり$0.05
- シークレットのリソースポリシーを変更することで共有可能
Parameter Storeの機能と制限
SecureStringパラメータタイプを使えば、KMSキーで暗号化可能- 自動ローテーションは非対応
- Advancedパラメータの最大サイズは8KB
SecureStringパラメータはCloudFormationでは作成できないが、マネジメントコンソール、CLI、Terraformなどでは作成可能- パラメータはリージョン単位で、自動レプリケーションは非対応
- 毎秒最大10,000件の
GetParameterリクエストに対応(デフォルトは40件) - 対応するAWSサービスはSecrets Managerより少ない
- 料金:共有パラメータ1件あたり月額$0.05、APIコール10,000件あたり$0.05
- Resource Access Manager(RAM)経由で共有可能
Secrets ManagerとParameter Storeはどちらも、doitintl/secrets-init(Kubernetesクラスター上で動くworkloadsとシークレット管理サービスの連携を簡素化するオープンソースツール)と組み合わせて利用できます。詳しくはこちらのブログ記事をご覧ください。
どちらを選ぶべきか
シークレットの保存先としては、まずSecrets Managerを検討するのが基本です。そもそもシークレット管理を目的に設計されたサービスであり、対応サービスが幅広いうえ、自動ローテーションやParameter Storeより大きなシークレットサイズなど、機能も充実しています。
とはいえ、次のようなケースではParameter Storeでのシークレット共有も選択肢になります。
- 大量のシークレットを管理しており、コスト削減効果が大きい場合(月額$0.05 vs $0.40)
- すでにParameter Storeにシークレットパラメータがあり、Secrets Managerの追加機能を必要としない場合
暗号化されたシークレットパラメータの作成と共有
Parameter Storeのドキュメントには、パラメータを作成・共有する手順が掲載されています。SecureStringパラメータの場合も基本的な流れは同じですが、暗号化に使うKMSキーも併せて共有する必要があります。
1. KMSでキーを作成する
まず、パラメータの暗号化に使う対称KMSキーをAWSで作成します。手順の詳細はAWSの公式ドキュメントをご覧ください。

KMSキー作成プロセスのスクリーンショット。エイリアスの作成は任意ですが、設定しておくことをおすすめします。
このキーのポリシーには、他のアカウントからの利用を許可する条件を含めます。AWS組織全体でこのキーとパラメータを共有したい場合は、AWS re:Postの記事で紹介されている方法でポリシーにConditionを指定できます。

KMSキー作成プロセスの最終確認画面のスクリーンショット
2. Parameter StoreでAdvancedパラメータを作成する
KMSキーを作成したら、AWSのドキュメントの手順に沿ってParameter Storeでパラメータを作成します。
パラメータ階層はAdvanced、タイプはSecureStringを選び、先ほど作成したKMSキーを指定します。

保存できるのはAdvancedパラメータのみです。誤って標準パラメータを選んでしまっても、後から変更できるのでご安心ください。
3. Resource Access Manager(RAM)でパラメータを共有する
パラメータを作成したら、Resource Access Managerを開き、AWSのドキュメントに従って、そのパラメータ用の新しいリソース共有を作成します。
マネージドアクセス許可の関連付けのステップではAWSRAMDefaultPermissionsSSMParameterReadOnlyポリシーを指定し、プリンシパルへのアクセス許可のステップでパラメータへのアクセスを許可するアカウント(必要に応じてAWS組織全体)を指定します。

ここでリソース共有に付けたタグは、パラメータ自体のタグには反映されません

読み取り専用のアクセスで十分なら、AWSRAMDefaultPermissionsSSMParameterReadOnly権限で問題ありません

この例では、アカウントID 123456789012のみが共有パラメータにアクセスできます。パラメータが存在するアカウント自体は追加しないでください。

最後は確認画面のみです
4. リソース共有を承諾する
リソース共有を作成したあとは、外部アカウント側で招待の承諾が必要になる場合があります。
共有先のアカウントがAWS組織内にあり、組織内でのリソース共有が有効になっている場合は、自動的に承諾されます。
組織外のアカウントの場合や、組織内でのリソース共有が有効になっていない場合は、アカウントごとにリソース共有を承諾する必要があります。
5. 共有パラメータにアクセスできるか確認する
パラメータの作成と共有が終わったら、いよいよ動作確認です。
外部アカウントからのアクセスを手早く確認するなら、AWS CLI(ローカルターミナル、またはAWS CloudShell)を使うのが便利です。
aws ssm get-parameter --name <パラメータの完全なARN> --with-decryption
復号されたパラメータ値が表示される出力例は次のとおりです。

シークレットパラメータの値を画面に表示させたくない場合は、--with-decryptionフラグを省略してください
参考資料
- https://github.com/doitintl/secrets-init
- https://www.doit.com/kubernetes-and-secrets-management-in-cloud/
- https://aws.amazon.com/about-aws/whats-new/2024/02/aws-systems-manager-parameter-store-cross-account-sharing/
- https://docs.aws.amazon.com/secretsmanager/latest/userguide/intro.html
- https://docs.aws.amazon.com/secretsmanager/latest/userguide/reference_limits.html
- https://docs.aws.amazon.com/secretsmanager/latest/userguide/integrating.html
- https://developer.hashicorp.com/hcp/docs/vault-secrets/integrations/aws-secrets-manager
- https://aws.amazon.com/secrets-manager/pricing/
- https://docs.aws.amazon.com/secretsmanager/latest/userguide/auth-and-access_examples_cross.html
- https://docs.aws.amazon.com/general/latest/gr/ssm.html
- https://docs.aws.amazon.com/systems-manager/latest/APIReference/API_PutParameter.html#systemsmanager-PutParameter-request-Type
- https://docs.aws.amazon.com/systems-manager/latest/userguide/systems-manager-parameter-store.html
- https://aws.amazon.com/systems-manager/pricing/#Parameter_Store
- https://docs.aws.amazon.com/ram/latest/userguide/shareable.html
- https://docs.aws.amazon.com/systems-manager/latest/userguide/parameter-store-shared-parameters.html
- https://docs.aws.amazon.com/kms/latest/developerguide/create-keys.html#create-symmetric-cmk
- https://repost.aws/knowledge-center/kms-key-organization-account
- https://docs.aws.amazon.com/systems-manager/latest/userguide/parameter-create-console.html
- https://docs.aws.amazon.com/ram/latest/userguide/working-with-sharing-create.html
- https://docs.aws.amazon.com/ram/latest/userguide/getting-started-sharing.html#getting-started-sharing-orgs
- https://docs.aws.amazon.com/ram/latest/userguide/working-with-shared-invitations.html
- https://docs.aws.amazon.com/cloudshell/latest/userguide/welcome.html
- https://gist.github.com/enigmango/0e2332bfc0b3cbbf234a7c5968020eaf
Parameter Storeのパラメータを共有できるようになったことは、特に中央アカウントからAWS組織全体に非機密パラメータを配布したい場面で大きな前進です。一方、シークレットの管理については、引き続きSecrets Managerを第一の選択肢とすべきです。
コードサンプル
Infrastructure-as-Codeで試してみたい方は、こちらのGitHub gistに、AWS組織全体で暗号化された共有パラメータを作成するTerraformのサンプルコードを掲載しています。
詳細情報
DoiT Internationalでは、Secrets ManagerやParameter Storeをはじめとするクラウドサービスについて、専門的な知見とサポートを提供しています。DoiTのコンサルティングについて詳しく知りたい方は、https://www.doit.com/services/をご覧ください。