Cloud Intelligence™Cloud Intelligence™

Cloud Intelligence™

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

By Tyler WengerdJun 17, 20245 min read

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

はじめに

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の追加機能を必要としない場合

暗号化されたシークレットパラメータの作成と共有

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/をご覧ください。