Cloud Intelligence™
AWS Parameter Storeでシークレットを共有する
このページはEnglish、Deutsch、Español、Français、Italiano、Portuguêsでもご覧いただけます。
About Tyler Wengerd
Cloud Architect with 10+ years of cloud expertise, both on AWS and GCP. Focused on security, networking, and IaC.
When I'm not at work, you might find me riding my bicycle or playing the ukulele (not simultaneously).
My personal pagePerfectScale™ for Kubernetes
Ready to optimize?
Get your free Kubernetes savings analysis

はじめに
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の追加機能を必要としない場合
Your cloud bill shouldn't be a mystery
Optimization, automation, expertise. In one platform.
暗号化されたシークレットパラメータの作成と共有
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/をご覧ください。