AWS Secrets Managerストレージ
シークレットマネージャーの接続情報をAWS Secrets Managerに保存。ローカルファイルは不要。
KeeperシークレットマネージャーはAWS Secrets Managerと連携し、KSMクライアント構成をホスト上のローカルファイルではなく、AWSアカウント内のシークレットとして保存できます。構成はSDK起動のたびに取得され、ディスク上に平文または暗号化されたファイルは保持されません。
ローカル構成ファイルのAWS KMS暗号化について
AWS KMSでの暗号化をご参照ください。この連携では構成をディスク上に保持し、AWS KMSのカスタマーマスターキーでラップします。2つのAWS連携は目的が異なり、使用するAWSサービスも異なります。運用に合った方を選択してください。
機能
KSMクライアント構成をAWS Secrets Managerのシークレットとして保存 (ローカルファイル不要)
SDK起動のたびにIAM認証済みのAWS API経由で構成を取得
構成ファイルをイメージに含めたくない短期間のコンピュート環境 (Lambda、ECSタスク、オートスケーリングEC2など) に適している
AWS Secrets Managerが独自のKMSキーで保存時暗号化を内部処理するため、クライアント側のキー管理は不要
すべてのKSM Python SDK機能に対応
要件
Python 3.9.2以降が必要 (Python 3.6〜3.8の場合は
keeper-secrets-manager-storage<1.1.0に固定)boto3パッケージが必要事前に作成済みのAWS Secrets Managerシークレットと、読み書き用のIAM権限を持つAWSアカウント
セットアップ
1. モジュールのインストール
2. AWSアクセスの構成
Python SDKは、KSM構成を単一のAWS Secrets Managerシークレットとして読み書きします。以下が必要です。
SDKが読み書きするシークレット名 (または完全なARN)。指定しない場合のデフォルト名は
ksm-configです。シークレットの読み書き権限を持つAWS認証情報。
対象シークレットに必要なIAM権限は以下のとおりです。
secretsmanager:GetSecretValuesecretsmanager:PutSecretValue
単一のシークレットへのアクセスを付与するAWSポリシーの例:
AwsSecretStorage はインスタンス生成時にシークレットを読み取るため、シークレットは事前に作成しておく必要があります。シークレットが存在しない場合は失敗します。アプリケーションを初めて実行する前に、値として少なくとも空のJSONオブジェクト ({}) を持つシークレットを作成してください。
AWSコンソールやIaCツールからシークレットを作成することもできます。SDKは初回実行時にシークレットを作成しません。
boto3 パッケージは、インスタンスロール、~/.aws/credentials、環境変数 (AWS_ACCESS_KEY_ID / AWS_SECRET_ACCESS_KEY / AWS_DEFAULT_REGION)、または名前付きプロファイルなど、標準的な場所からAWS認証情報を検索します。設定については AWSドキュメント をご参照ください。
3. コードにAWS Secrets Managerストレージを追加
SecretsManager コンストラクタのストレージとして AwsSecretStorage を使用します。このクラスは4つの認証情報解決モードに対応しています。展開環境に合ったものを選択してください。
v1.0.xからのアップグレードについて
v1.1.0では、AwsSecretStorage に影響する以下の動作が変わります。
AwsSecretStorage.__init__は、インスタンス生成時に構成を読み込みます (他のバックエンドと同様)。無効な認証情報や存在しないシークレットは、最初のSDK呼び出し時ではなく、生成時に例外となります。AwsSecretStorageは、シークレット値にprivateKeyフィールドが含まれていることを要求せず、任意の有効なJSON辞書を受け入れます。AwsSecretStorage.__load_config()は、AWS Secrets Manager呼び出しが失敗した場合に例外を発生させます。v1.0.xではエラーはログに記録されるだけで、config = {}のまま問題が検出されない状態でした。AwsConfigProvider._get_instance_regionとread_configは、失敗時に空の値を返すのではなく、例外を発生させます。AwsSecretStorageは、同時読み書きに対してスレッドセーフになりました。
EC2インスタンスロールの使用 (既定)
既定のコンストラクタは、EC2インスタンスのIAMロールを使用し、インスタンスロールの検索に失敗した場合は既定のAWSプロファイルにフォールバックします。リージョンはEC2インスタンスメタデータサービス (IMDS) から自動検出されます。
このモードでは、EC2インスタンス上で動作するか、aws_key に完全なARNを指定する必要があります。リージョンの自動検出にはIMDSを使用するため、EC2上でのみ利用できます。EC2以外で短いシークレット名 (例: "ksm-config") を渡すと、インスタンス生成時に "Failed to determine AWS region for EC2 instance." が発生します。ワークステーションなどの非EC2環境では、完全なARN (リージョンはARNから取得) を渡すか、以下の他の認証情報モードのいずれかを使用してください。
既定のAWSプロファイルの使用
EC2以外 (ワークステーション、CIランナー、AWS認証情報をマウントしたコンテナ) で実行するコード向け:
名前付きAWSプロファイルの使用
明示的な認証情報の使用
aws_key パラメータには、以下のいずれかを指定できます。
シークレット名:
ksm-configシークレットID:
ksm-config-aBcDeF完全なARN:
arn:aws:secretsmanager:us-east-2:123456789012:secret:ksm-config-aBcDeF
aws_key が空の場合、SDKは KSM_AWS_SECRET 環境変数から読み取ります。それも未設定の場合は、デフォルトのシークレット名 ksm-config が使用されます。
AWS Secrets Managerストレージの使用
セットアップ後、AwsSecretStorage はシークレットマネージャーSDKのすべての機能に対応します。SDK起動のたびに、構成を取得するための GetSecretValue 呼び出しが少なくとも1回実行されます。書き込み時 (ワンタイムアクセストークンによる初回初期化など) には PutSecretValue が呼び出されます。
初回初期化時の動作
AwsSecretStorage は、インスタンスが生成されるたびにシークレット値を読み取ります。__init__ が __load_config を呼び出し、それが provider.read_config() を呼び出します。シークレットが存在しない、または値が有効なJSONでない場合、インスタンス生成は ValueError で失敗します。初回使用前に {} でシークレットを事前作成してください。上記のIAMセクションの警告をご参照ください。
インスタンス生成後、ワンタイムトークンによる最初の PutSecretValue で、既存のシークレットに構成が書き込まれます。以降のSDK実行ではその構成を読み取り、再初期化は行われません。
構成の削除
config.delete_all() を呼び出すと、ローカルのインメモリ構成がクリアされ、空のJSONオブジェクトがAWSシークレットに書き戻されます。シークレット自体はAWS Secrets Managerから削除されず、値のみがクリアされます。シークレットを完全に削除するには、AWSコンソール、AWS CLI、またはIaCツールを使用してください。
AWS Secrets Managerストレージでシークレットマネージャーを使用する準備が整いました。
その他の例と機能については、KSM SDKのドキュメントをご参照ください。
最終更新

