> For the complete documentation index, see [llms.txt](https://docs.keeper.io/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.keeper.io/keeperpam/jp/secrets-manager/integrations/aws-secrets-manager-storage.md).

# AWS Secrets Managerストレージ

KeeperシークレットマネージャーはAWS Secrets Managerと連携し、KSMクライアント構成をホスト上のローカルファイルではなく、AWSアカウント内のシークレットとして保存できます。構成はSDK起動のたびに取得され、ディスク上に平文または暗号化されたファイルは保持されません。

{% hint style="info" icon="comment-question" %}
**ローカル構成ファイルのAWS KMS暗号化について**

[AWS KMSでの暗号化](/keeperpam/jp/secrets-manager/integrations/aws-kms.md)をご参照ください。この連携では構成をディスク上に保持し、AWS KMSのカスタマーマスターキーでラップします。2つのAWS連携は目的が異なり、使用するAWSサービスも異なります。運用に合った方を選択してください。
{% endhint %}

## 機能

* KSMクライアント構成をAWS Secrets Managerのシークレットとして保存 (ローカルファイル不要)
* SDK起動のたびにIAM認証済みのAWS API経由で構成を取得
* 構成ファイルをイメージに含めたくない短期間のコンピュート環境 (Lambda、ECSタスク、オートスケーリングEC2など) に適している
* AWS Secrets Managerが独自のKMSキーで保存時暗号化を内部処理するため、クライアント側のキー管理は不要
* すべてのKSM Python SDK機能に対応

## 要件

* [Python シークレットマネージャーSDK](/keeperpam/jp/secrets-manager/developer-sdk-library/python-sdk.md)に対応
* Python 3.9.2以降が必要 (Python 3.6〜3.8の場合は `keeper-secrets-manager-storage<1.1.0` に固定)
* `boto3` パッケージが必要
* 事前に作成済みのAWS Secrets Managerシークレットと、読み書き用のIAM権限を持つAWSアカウント

## セットアップ

### 1. モジュールのインストール

```bash
pip3 install keeper-secrets-manager-storage
pip3 install boto3
```

### 2. AWSアクセスの構成

Python SDKは、KSM構成を単一のAWS Secrets Managerシークレットとして読み書きします。以下が必要です。

* SDKが読み書きするシークレット名 (または完全なARN)。指定しない場合のデフォルト名は `ksm-config` です。
* シークレットの読み書き権限を持つAWS認証情報。

対象シークレットに必要なIAM権限は以下のとおりです。

* `secretsmanager:GetSecretValue`
* `secretsmanager:PutSecretValue`

単一のシークレットへのアクセスを付与するAWSポリシーの例:

{% code overflow="wrap" %}

```json
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "KsmConfigSecretAccess",
            "Effect": "Allow",
            "Action": [
                "secretsmanager:GetSecretValue",
                "secretsmanager:PutSecretValue"
            ],
            "Resource": "arn:aws:secretsmanager:<region-id>:<account-id>:secret:<unique-secret-name>"
        }
    ]
}
```

{% endcode %}

{% hint style="warning" %}
`AwsSecretStorage` はインスタンス生成時にシークレットを読み取るため、**シークレットは事前に作成しておく必要があります**。シークレットが存在しない場合は失敗します。アプリケーションを初めて実行する前に、値として少なくとも空のJSONオブジェクト (`{}`) を持つシークレットを作成してください。

```bash
aws secretsmanager create-secret --name ksm-config --secret-string '{}'
```

AWSコンソールやIaCツールからシークレットを作成することもできます。SDKは初回実行時にシークレットを作成しません。
{% endhint %}

{% hint style="info" %}
`boto3` パッケージは、インスタンスロール、`~/.aws/credentials`、環境変数 (`AWS_ACCESS_KEY_ID` / `AWS_SECRET_ACCESS_KEY` / `AWS_DEFAULT_REGION`)、または名前付きプロファイルなど、標準的な場所からAWS認証情報を検索します。設定については [AWSドキュメント](https://docs.aws.amazon.com/cli/latest/reference/configure/) をご参照ください。
{% endhint %}

### 3. コードにAWS Secrets Managerストレージを追加

`SecretsManager` コンストラクタのストレージとして `AwsSecretStorage` を使用します。このクラスは4つの認証情報解決モードに対応しています。展開環境に合ったものを選択してください。

{% hint style="info" icon="comment-question" %}
**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` は、同時読み書きに対してスレッドセーフになりました。
  {% endhint %}

#### EC2インスタンスロールの使用 (既定)

既定のコンストラクタは、EC2インスタンスのIAMロールを使用し、インスタンスロールの検索に失敗した場合は既定のAWSプロファイルにフォールバックします。リージョンはEC2インスタンスメタデータサービス (IMDS) から自動検出されます。

```python
from keeper_secrets_manager_core import SecretsManager
from keeper_secrets_manager_storage.storage_aws_secret import AwsSecretStorage

# aws_key はシークレット名、シークレットID、または完全なARN
config = AwsSecretStorage(aws_key="ksm-config")

secrets_manager = SecretsManager(config=config, verify_ssl_certs=True)
all_records = secrets_manager.get_secrets()
```

{% hint style="warning" %}
このモードでは、EC2インスタンス上で動作するか、`aws_key` に完全なARNを指定する必要があります。リージョンの自動検出にはIMDSを使用するため、EC2上でのみ利用できます。EC2以外で短いシークレット名 (例: `"ksm-config"`) を渡すと、インスタンス生成時に `"Failed to determine AWS region for EC2 instance."` が発生します。ワークステーションなどの非EC2環境では、完全なARN (リージョンはARNから取得) を渡すか、以下の他の認証情報モードのいずれかを使用してください。
{% endhint %}

#### 既定のAWSプロファイルの使用

EC2以外 (ワークステーション、CIランナー、AWS認証情報をマウントしたコンテナ) で実行するコード向け:

```python
from keeper_secrets_manager_core import SecretsManager
from keeper_secrets_manager_storage.storage_aws_secret import AwsSecretStorage

config = AwsSecretStorage()
config.from_default_config(aws_key="ksm-config")

secrets_manager = SecretsManager(config=config, verify_ssl_certs=True)
all_records = secrets_manager.get_secrets()
```

#### 名前付きAWSプロファイルの使用

```python
from keeper_secrets_manager_core import SecretsManager
from keeper_secrets_manager_storage.storage_aws_secret import AwsSecretStorage

config = AwsSecretStorage()
config.from_profile_config(aws_key="ksm-config", profile="ksm-prod")

secrets_manager = SecretsManager(config=config, verify_ssl_certs=True)
all_records = secrets_manager.get_secrets()
```

#### 明示的な認証情報の使用

```python
from keeper_secrets_manager_core import SecretsManager
from keeper_secrets_manager_storage.storage_aws_secret import AwsSecretStorage

config = AwsSecretStorage()
config.from_custom_config(
    aws_key="arn:aws:secretsmanager:us-east-2:123456789012:secret:ksm-config-aBcDeF",
    aws_access_key_id="AK[...]FIF",
    aws_secret_access_key="/[...]/g3",
    region="us-east-2",
)

secrets_manager = SecretsManager(config=config, verify_ssl_certs=True)
all_records = secrets_manager.get_secrets()
```

{% hint style="info" %}
`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` が使用されます。
{% endhint %}

## 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ツールを使用してください。

{% hint style="success" %}
AWS Secrets Managerストレージでシークレットマネージャーを使用する準備が整いました。
{% endhint %}

{% hint style="info" %}
その他の例と機能については、[KSM SDKのドキュメント](/keeperpam/jp/secrets-manager/developer-sdk-library.md)をご参照ください。
{% endhint %}


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://docs.keeper.io/keeperpam/jp/secrets-manager/integrations/aws-secrets-manager-storage.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
