より効率的なアクセスのためのパラメータストアにおける関連秘密の保存


我々は遅かれ早かれ私たちが何かを達成するために複数の関連する秘密を使用する必要がある我々の開発キャリアに遭遇する.パラメータストアでオブジェクトを保存して取得することでこれらのパラメータを管理できます.

シナリオ


外部サービスに認証する必要があるとしましょう.我々は、アプリケーションに接続するMongoDB , そこで、複数のパラメータを使用して接続文字列を構築する必要があります.アプリケーションは、データベース名、ユーザー名、およびパスワードを知る必要があります.
異なった秘密にそれらを1つずつ格納することは、ビルド時間(別々にそれらを環境変数として永続化する)のどちらかを得る必要があるということです.
私たちは秘密をAの環境変数として保存したくないと言いますLambda 機能の設定、そして我々は安全な店からそれを得ることができますParameter Store 実行時.

問題


2.1 .パラメータの追加に時間がかかる


自然な解決策は別々の秘密に複数のパラメータを格納することです.たとえば、次のコマンドでデータベース名を追加できます.
aws ssm put-parameter --name /dev/db-name --value my-db-name --type SecureString
ヒアname プロパティはパスパラメータを参照します.
我々は、秘密の残りの部分を作成するために、上記のプロセスを2回繰り返す必要があります.また、ユーザ名とパスワードを格納する必要がありますので、2つのAPI呼び出しをする必要があります.

2.2 .パラメータを取得する複数のAPI呼び出し


パラメータのストアに秘密を追加するように、我々はそこからそれらを使用するように我々のアプリケーションをしたい場合、それらを取得する必要があります.
これは、パラメータストアへの複数のAPI呼び出しを意味します.それらのいずれかの理由で失敗すると、アプリケーションはデータベースに接続することができなくなります.

解決策


値を別々のパラメータに格納する代わりに、キー値のペアとして秘密を持つ文字列化オブジェクトを作成できます.
aws ssm put-parameter --name /dev/db-config --value \
'{"dbName": "my-db-name", "dbUsername": "my-db-username", "dbPassword": "my-db-password"}' \
--type SecureString
この方法では、我々は必要なすべての情報を含む1つのパラメータを持っている!
唯一の警告は、オブジェクトのサイズが4 KBを超えないことを保証しなければならないということですparameter size limit .
秘密のオブジェクトを保存した後に、パラメータの全体集合を得るために1つの関数呼び出しを必要とするだけです.
私たちはこのようなものを書店から秘密にするために書くことができます.
import AWS from 'aws-sdk';

const ssm = new AWS.SSM({
  apiVersion: '2014-11-06',
  region: 'us-east-1'
});

async function createDbConnection(environment) {
  const params = {
    Name: `/${environment}/db-config`,
    WithDecryption: true
  };

  const response = await ssm.getParameter(params).promise();
  const { dbName, dbUsername, dbPassword } = JSON.parse(response.Parameter.Value)

  // use dbName, dbUsername and dbPassword to build the connection string
  const connectionString = `mongodb+srv://${dbUsername}:${dbPassword}@cluster0.example.com/${dbName}?authSource=admin`

  return connectionString
}
パラメータストアに1つのAPIコールを使用し、オブジェクト全体を取得しました.文字列化されたオブジェクトをパースした後、キーと値として個々にアクセスできます.
データベース接続文字列を簡単に作成し、それを返すことができます.

まとめ


パラメータストア内のstringifyオブジェクトとして関連する秘密や認証パラメータを格納できます.これは、コードの複雑さと呼び出しの数の両方のアップとダウンロードの時間を削減します.短いとクリーナーコードを書くと同じ結果を達成するために常に勝つことです!

参考文献及び更なる読書


パスパラメータの詳細については、どのように秘密を整理することができますAWS documentation page on the topic .