Cloud Intelligence™Cloud Intelligence™

Cloud Intelligence™

AWS Parameter Storeでシークレットを共有する

このページはEnglishDeutschEspañolFrançaisItalianoPortuguêsでもご覧いただけます。

By Tyler WengerdJun 17, 20245 min read
Tyler Wengerd

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 page

PerfectScale™ 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の機能と制限

Parameter Storeの機能と制限

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キー作成プロセスのステップ2のスクリーンショット

KMSキー作成プロセスのスクリーンショット。エイリアスの作成は任意ですが、設定しておくことをおすすめします。

このキーのポリシーには、他のアカウントからの利用を許可する条件を含めます。AWS組織全体でこのキーとパラメータを共有したい場合は、AWS re:Postの記事で紹介されている方法でポリシーにConditionを指定できます。

KMSキー作成プロセスの確認画面のスクリーンショット

KMSキー作成プロセスの最終確認画面のスクリーンショット

2. Parameter StoreでAdvancedパラメータを作成する

KMSキーを作成したら、AWSのドキュメントの手順に沿ってParameter Storeでパラメータを作成します。

パラメータ階層はAdvanced、タイプはSecureStringを選び、先ほど作成したKMSキーを指定します。

パラメータ作成プロセスのスクリーンショット

保存できるのはAdvancedパラメータのみです。誤って標準パラメータを選んでしまっても、後から変更できるのでご安心ください。

3. Resource Access Manager(RAM)でパラメータを共有する

パラメータを作成したら、Resource Access Managerを開き、AWSのドキュメントに従って、そのパラメータ用の新しいリソース共有を作成します。

マネージドアクセス許可の関連付けのステップではAWSRAMDefaultPermissionsSSMParameterReadOnlyポリシーを指定し、プリンシパルへのアクセス許可のステップでパラメータへのアクセスを許可するアカウント(必要に応じてAWS組織全体)を指定します。

Resource Access Managerでパラメータを共有する画面のスクリーンショット — 「リソース共有の詳細を指定」セクション

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

Resource Access Managerでパラメータを共有する画面のスクリーンショット — 「マネージドアクセス許可」セクション

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

Resource Access Managerでパラメータを共有する画面のスクリーンショット — 「プリンシパルへのアクセス許可」セクション

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

Resource Access Managerでパラメータを共有する画面のスクリーンショット — 最終確認画面

最後は確認画面のみです

4. リソース共有を承諾する

リソース共有を作成したあとは、外部アカウント側で招待の承諾が必要になる場合があります。

共有先のアカウントがAWS組織内にあり、組織内でのリソース共有が有効になっている場合は、自動的に承諾されます。

組織外のアカウントの場合や、組織内でのリソース共有が有効になっていない場合は、アカウントごとにリソース共有を承諾する必要があります

5. 共有パラメータにアクセスできるか確認する

パラメータの作成と共有が終わったら、いよいよ動作確認です。

外部アカウントからのアクセスを手早く確認するなら、AWS CLI(ローカルターミナル、またはAWS CloudShell)を使うのが便利です。

 aws ssm get-parameter --name <パラメータの完全なARN> --with-decryption

復号されたパラメータ値が表示される出力例は次のとおりです。

AWS CloudShellで暗号化パラメータを読み取るコマンドと、正常に取得できた出力のスクリーンショット

シークレットパラメータの値を画面に表示させたくない場合は、--with-decryptionフラグを省略してください

参考資料

Parameter Storeのパラメータを共有できるようになったことは、特に中央アカウントからAWS組織全体に非機密パラメータを配布したい場面で大きな前進です。一方、シークレットの管理については、引き続きSecrets Managerを第一の選択肢とすべきです。

コードサンプル

Infrastructure-as-Codeで試してみたい方は、こちらのGitHub gistに、AWS組織全体で暗号化された共有パラメータを作成するTerraformのサンプルコードを掲載しています。

詳細情報

DoiT Internationalでは、Secrets ManagerやParameter Storeをはじめとするクラウドサービスについて、専門的な知見とサポートを提供しています。DoiTのコンサルティングについて詳しく知りたい方は、https://www.doit.com/services/をご覧ください。