# KSM用Terraform Provider

<figure><img src="https://859776093-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FPL6k1aGsLiFiiJ3Y7zCl%2Fuploads%2Fp53bcL3JHVaJVI6SrUal%2Fimage.png?alt=media&#x26;token=fa8bbade-0437-46bd-8a29-97306cf61d68" alt=""><figcaption></figcaption></figure>

## 機能

Keeper Terraformプラグインは、Keeperシークレットマネージャーを利用してKeeperボルトに保存されたシークレット認証情報にアクセスします。このプラグインを使うことで、Keeperのゼロ知識インフラを活用し、Terraformのビルド環境にシークレットを安全に直接挿入できます。

* Terraformのビルドで使用するシークレットをKeeperボルトから取得します
* Terraformのビルドスクリプトにクレデンシャルを直接注入します
* 新しいシークレットを作成してボルトに保存します
* Keeperボルトからファイルを取得します

{% hint style="info" %}
Keeperシークレットマネージャー機能の完全なリストについては、[概要のページ](https://docs.keeper.io/jp/keeperpam/secrets-manager/overview)をご参照ください。
{% endhint %}

## 要件

この連携を利用するための要件は以下のとおりです。

* Keeperシークレットマネージャーへのアクセス (詳細は、[クイックスタートガイド](https://docs.keeper.io/jp/keeperpam/secrets-manager/quick-start-guide)をご参照ください)
  * Keeperアカウントのシークレットマネージャーアドオンの有効化
  * シークレットマネージャー強制ポリシーが有効化されたロールを割り当てられたメンバーシップ
* シークレットを共有するKeeper[シークレットマネージャーアプリケーション](https://docs.keeper.io/jp/keeperpam/about/terminology#application)
  * アプリケーションの作成手順については、[クイックスタートガイド](https://docs.keeper.io/jp/keeperpam/quick-start-guide#create-a-secrets-manager-application)をご参照ください
* Keeper[シークレットマネージャー設定](https://docs.keeper.io/jp/keeperpam/secrets-manager/about/secrets-manager-configuration)の初期化
  * Terraform連携では、JSON形式とBase64形式の設定を使用できます

## インストール

### **レジストリのインストール**

{% hint style="info" %}
Keeperシークレットマネージャープロバイダのページは[こちらです](https://registry.terraform.io/providers/Keeper-Security/secretsmanager/latest)。
{% endhint %}

このプロバイダをインストールするには、Terraformの設定に以下のコードを追加して、`terraform init` を実行します。

```
terraform {
  required_providers {
    secretsmanager = {
      source = "keeper-security/secretsmanager"
      version = ">= 1.2.0"
    }
  }
}

provider "secretsmanager" {
  # Configuration options
}
```

こちらの[GitHubリポジトリ](https://github.com/keeper-security/terraform-provider-secretsmanager)でソースコードを確認できます。

### 手動インストール

[GitHubリリースページ](https://github.com/keeper-security/terraform-provider-secretsmanager/releases/latest)からご利用のプラットフォーム用の最新バージョンのTerraformプロバイダをダウンロードし、そのアーカイブを対応するTerraformプラグインフォルダにコピーします (パスに不足しているフォルダがあれば作成します)。完全なプロバイダURLでソースを初期化します (`"github.com/keeper-security/secretsmanager"`)。

{% hint style="info" %}
お使いのOSおよびCPUアーキテクチャ (`amd64` または `arm64`) に対応するアーカイブを使用してください。以下のMac OSおよびLinuxのコマンドは、アーキテクチャを自動的に検出します。Windowsのコマンドは `amd64` 向けです。
{% endhint %}

{% tabs %}
{% tab title="Windows" %}

```bash
SETLOCAL EnableExtensions && ^
mkdir %APPDATA%\.terraform.d\plugins\github.com\keeper-security\secretsmanager && ^
cd %APPDATA%\.terraform.d\plugins\github.com\keeper-security\secretsmanager && ^
curl -SfLOJ https://github.com/keeper-security/terraform-provider-secretsmanager/releases/download/v1.2.0/terraform-provider-secretsmanager_1.2.0_windows_amd64.zip
```

{% endtab %}

{% tab title="Mac OS" %}

```bash
ARCH="$(uname -m)"
case "$ARCH" in
  x86_64) ARCH="amd64" ;;
  arm64)  ARCH="arm64" ;;
  *) echo "Unsupported architecture: $ARCH" && exit 1 ;;
esac

mkdir -p ~/.terraform.d/plugins/github.com/keeper-security/secretsmanager && \
cd ~/.terraform.d/plugins/github.com/keeper-security/secretsmanager && \
curl -SfLOJ "https://github.com/keeper-security/terraform-provider-secretsmanager/releases/download/v1.2.0/terraform-provider-secretsmanager_1.2.0_darwin_${ARCH}.zip"
```

{% endtab %}

{% tab title="Linux" %}

```bash
ARCH="$(uname -m)"
case "$ARCH" in
  x86_64) ARCH="amd64" ;;
  aarch64|arm64) ARCH="arm64" ;;
  *) echo "Unsupported architecture: $ARCH" && exit 1 ;;
esac

mkdir -p ~/.terraform.d/plugins/github.com/keeper-security/secretsmanager && \
cd ~/.terraform.d/plugins/github.com/keeper-security/secretsmanager && \
curl -SfLOJ "https://github.com/keeper-security/terraform-provider-secretsmanager/releases/download/v1.2.0/terraform-provider-secretsmanager_1.2.0_linux_${ARCH}.zip"
```

{% endtab %}
{% endtabs %}

Terraformプロバイダを手動でインストールする方法については、[Terraformの公式ドキュメント](https://www.terraform.io/docs/configuration/providers.html#third-party-plugins)をご参照ください。

## 使用方法

### プロバイダを設定

Keeper[シークレットマネージャー](https://docs.keeper.io/jp/keeperpam/readme)プロバイダを使用して、Keeperシークレットマネージャーでサポートされているリソースと連携します。プロバイダを使用できるようにするには、Keeperのクレデンシャルを使用してプロバイダを設定する必要があります。

```
terraform {
  required_providers {
    secretsmanager = {
      source  = "keeper-security/secretsmanager"
      version = ">= 1.2.0"
    }
  }
}

provider "secretsmanager" {
  # 設定内容を文字列で指定するか、ファイルから読み込みます
  # credential = "<CONFIG FILE CONTENTS BASE64>"
  credential = file("/path/to/config.json")
}
```

{% hint style="info" %}
CI/CD環境では、credential属性は省略でき、代わりに環境変数KEEPER\_CREDENTIALを設定できます。

```bash
export KEEPER_CREDENTIAL=$(cat ~/.keeper/credential)
```

{% endhint %}

#### 構成ファイルの内容

* `appkey` -  (必須) アプリケーションキー。
* `clientid` - (必須) クライアントID。
* `privatekey` - (必須) 秘密鍵。
* `hostname` - (オプション) デフォルトでは、プラグインは `keepersecurity.com` に接続します

{% hint style="info" %}
シークレットマネージャーの構成の作成について、詳しくは[こちらのページ](https://docs.keeper.io/jp/keeperpam/secrets-manager/about/secrets-manager-configuration)のをご参照ください。
{% endhint %}

### データソースを使用してシークレットを取得

Keeperの標準レコードタイプごとにデータソースが用意されているため、シークレットのクレデンシャルを簡単に取得できます。

データソースには、以下の形式を使用してアクセスします。

```
data "<data_source_name>" "<record_type_reference>" {
    path = "<record_uid>"
}
```

たとえば、ログインタイプのレコードを使用する場合は、以下のようになります。

```
data "secretsmanager_login" "my_login_record" {
    path = "<RECORD_UID>"
}
```

ユーザーが定義したレコードタイプの追加のカスタムフィールドまたは標準フィールドにアクセスするには、[`secretsmanager_field`](https://registry.terraform.io/providers/keeper-security/secretsmanager/latest/docs/data-sources/field) データソースを使用します。

#### サポートされているレコードタイプの一覧 <a href="#list-of-supported-record-types" id="list-of-supported-record-types"></a>

| レコードタイプ                                                                                                                               | データソース名                                 |
| ------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------- |
| [住所](https://registry.terraform.io/providers/keeper-security/secretsmanager/latest/docs/data-sources/address)                         | "secretsmanager\_address"               |
| [銀行口座](https://registry.terraform.io/providers/keeper-security/secretsmanager/latest/docs/data-sources/bank_account)                  | "secretsmanager\_bank\_account"         |
| [銀行カード](https://registry.terraform.io/providers/keeper-security/secretsmanager/latest/docs/data-sources/bank_card)                    | "secretsmanager\_bank\_card"            |
| [出生証明書](https://registry.terraform.io/providers/keeper-security/secretsmanager/latest/docs/data-sources/birth_certificate)            | "secretsmanager\_birth\_certificate"    |
| [連絡先](https://registry.terraform.io/providers/keeper-security/secretsmanager/latest/docs/data-sources/contact)                        | "secretsmanager\_contact"               |
| [データベースクレデンシャル](https://registry.terraform.io/providers/keeper-security/secretsmanager/latest/docs/data-sources/database_credentials) | "secretsmanager\_database\_credentials" |
| [運転免許](https://registry.terraform.io/providers/keeper-security/secretsmanager/latest/docs/data-sources/driver_license)                | "secretsmanager\_drivers\_license"      |
| [暗号化されたメモ](https://registry.terraform.io/providers/keeper-security/secretsmanager/latest/docs/data-sources/encrypted_notes)           | "secretsmanager\_encrypted\_notes"      |
| [フィールド](https://registry.terraform.io/providers/keeper-security/secretsmanager/latest/docs/data-sources/field)                        | "secretsmanager\_field"                 |
| [ファイル](https://registry.terraform.io/providers/keeper-security/secretsmanager/latest/docs/data-sources/file)                          | "secretsmanager\_file"                  |
| [健康保険](https://registry.terraform.io/providers/keeper-security/secretsmanager/latest/docs/data-sources/health_insurance)              | "secretsmanager\_health\_insurance"     |
| [ログイン](https://registry.terraform.io/providers/keeper-security/secretsmanager/latest/docs/data-sources/login)                         | "secretsmanager\_login"                 |
| [メンバーシップ](https://registry.terraform.io/providers/keeper-security/secretsmanager/latest/docs/data-sources/membership)                 | "secretsmanager\_membership"            |
| [パスポート](https://registry.terraform.io/providers/keeper-security/secretsmanager/latest/docs/data-sources/passport)                     | "secretsmanager\_passport"              |
| [画像](https://registry.terraform.io/providers/keeper-security/secretsmanager/latest/docs/data-sources/photo)                           | "secretsmanager\_photo"                 |
| [レコード](https://registry.terraform.io/providers/keeper-security/secretsmanager/latest/docs/data-sources/record)                        | "secretsmanager\_record"                |
| [レコード (大量のリクエスト向け)](https://registry.terraform.io/providers/keeper-security/secretsmanager/latest/docs/data-sources/records)          | "secretsmanager\_records"               |
| [サーバーのクレデンシャル](https://registry.terraform.io/providers/keeper-security/secretsmanager/latest/docs/data-sources/server_credentials)    | "secretsmanager\_server\_credentials"   |
| [ソフトウェアライセンス](https://registry.terraform.io/providers/keeper-security/secretsmanager/latest/docs/data-sources/software_license)       | "secretsmanager\_software\_license"     |
| [SSH鍵](https://registry.terraform.io/providers/keeper-security/secretsmanager/latest/docs/data-sources/ssh_keys)                      | "secretsmanager\_ssh\_keys"             |
| [SSNカード](https://registry.terraform.io/providers/keeper-security/secretsmanager/latest/docs/data-sources/ssn_card)                    | "secretsmanager\_ssn\_card"             |

各データソースで使用可能なフィールドについては、[レコードタイプのデータソースリファレンス](https://registry.terraform.io/providers/keeper-security/secretsmanager/latest/docs)をご参照ください。

レコードタイプの詳細は、[レコードタイプのページ](https://docs.keeper.io/jp/keeperpam/commander-cli/command-reference/record-commands/default-record-types)および[コマンダー使用法のページ](https://docs.keeper.io/jp/keeperpam/commander-cli/command-reference/record-commands/creating-and-updating-records)をご参照ください

### レコードフィールドにアクセス

レコードのフィールドに保存されたシークレットのクレデンシャルにアクセスするには、データソースの一部としてフィールドにアクセスします。

**タイプ指定されたレコードのデータソースのフィールドにアクセス**

以下の形式を使用して、タイプ指定されたデータリソースのフィールドにアクセスします。

```
${ data.<data_source_name>.<record_type_reference>.<field> }
```

以下は、ログインタイプのデータソースのパスワードへのアクセスとなります。

```
${ data.secretsmanager_login.my_login_secret.password }
```

**フィールドデータソースを使用し、Keeper表記法でレコード内の任意のフィールドを照会**

"secretsmanager\_field"データソースタイプを使用してデータソースを作成し、pathプロパティでフィールドクエリを指定します。

```
data "secretsmanager_field" "my_field" {
  path = "<record UID>/field/login"
}
```

フィールドクエリでは、`"<UID>/field/<field type>"`という形式が使用されます。

{% hint style="info" %}
レコードUIDが不明な場合は、UIDの代わりにワイルドカード \* を使用し、任意のtitle属性を指定してタイトルで検索できます。

```
data "secretsmanager_field" "db_password" {
  path  = "*/field/password"
  title = "Production Database"
}
```

一致するアクセス可能なレコードが複数存在する場合は、エラーが返されます。
{% endhint %}

### リソースを使用したレコードの作成 <a href="#creating-records-with-resources" id="creating-records-with-resources"></a>

Keeperでは、[上記の主要なKeeperレコードタイプ](#list-of-supported-record-types)用のTerraformリソースがご利用になれます。 これらのリソースを利用し、KeeperシークレットマネージャーのTerraformプラグインを使用してKeeperのレコードを作成できます。

レコードを作成するには、使用したいレコードタイプに対応するリソースを使用します。

各レコードのリソースには、少なくとも `folder_uid` と `title`、および各レコードフィールドの値が必要となります。

**ログインリソースの例**

```
resource "secretsmanager_login" "login" {
    folder_uid = "4PbDLf8UF4od87wJt-fdyQ"
    tile:"My Login Record"
    # 追加フィールド
}
```

#### フォルダUID

レコードを作成するには、Keeperシークレットマネージャーが新しいレコードを作成する場所を認識できるように、フォルダのUIDが必要となります。

フォルダUIDは、KeeperボルトまたはKeeperコマンダーを使用して確認できます。

対象のフォルダ (またはその親の共有フォルダ) は、Keeperシークレットマネージャーアプリケーションから**編集**権限でアクセスできる必要があります。

#### タイトル

レコードタイトル。

#### レコードフィールド

レコードの各フィールドの値と設定は、リソースで設定できます。 レコードタイプごとの利用可能なフィールドについては、[リソース定義](https://registry.terraform.io/providers/Keeper-Security/secretsmanager/latest/docs)をご参照ください。

各フィールドは、リソース内ではオブジェクトとして表記されます。

**ログインフィールドの例**

```
resource "secretsmanager_login" "login" {
    folder_uid = "<FOLDER_UID>"
    title = "My Login Record"

    login {
        value = "MyUsername"
        label = "Username"
        required = true
    }
}
```

#### フィールド値を設定

各フィールドの値を設定するには、`value` フィールドを使用してください。フィールドの形式については、`login` フィールドタイプは文字列を受け取りますが、`name` フィールドは「first」「middle」「last」フィールドを持つオブジェクトを受け取るなど、異なる場合があります。

各フィールドの値の形式については、[リソースのドキュメント](https://registry.terraform.io/providers/Keeper-Security/secretsmanager/latest/docs)をご参照ください。

#### フィールドの設定を指定

各フィールドは、様々な設定で構成できます。

| フィールド           | 有効な値    | 説明                                  |
| --------------- | ------- | ----------------------------------- |
| label           | string  | フィールドラベル                            |
| required        | boolean | Trueの場合、このフィールドはKeeperボルトで必須と見なされます |
| privacy\_screen | boolean | Trueの場合、このフィールドはKeeperボルトで非表示になります  |

#### パスワードフィールド

パスワードフィールドにはいくつかの特別な機能があります。

#### パスワード生成

Terraformプラグインを使用して作成されたレコードには、パスワードが自動的に生成されます。 プラグインでパスワードを生成するには、パスワードに `value` フィールドを指定せず、代わりに`generate = "true"` を使用します

パスワード生成は、complexityフィールドを使用して、指定した長さのパスワードを生成するように設定できます。

```
password {
    generate = "true"
    complexity {
        length = 16
    }
}
```

また、パスワードフィールドには、`enforce_generation` という設定があります。これがtrueの場合、パスワードの生成のみを可能にし、ユーザーによるパスワード設定はできないようにKeeperボルトに強制適用します。

{% hint style="info" %}
Terraformにパスワードを再生成させるには、generateフィールドの相違を認識させる必要があります。 相違を認識できるように、generateフィールドは「true」と「yes」の両方の値を受け入れます。 一方から他方への変更が再生成のトリガーになります。
{% endhint %}

#### SSHキーの生成

`secretsmanager_ssh_keys` リソースでは、SSHキーペアを自動的に生成できます。生成を実行するには、キーペアの値を省略し、`key_pair` フィールドで `generate = "true"` を設定します。

```
resource "secretsmanager_ssh_keys" "example" {
  folder_uid = "<FOLDER_UID>"
  title      = "My SSH Key"

  key_pair {
    generate = "true"
    key_type = "ssh-ed25519"    # デフォルト。他に ssh-rsa、ecdsa-sha2-nistp256/384/521 にも対応
    # key_bits = 4096           # ssh-rsa のみで使用。有効な値は 2048、3072、4096
  }

  # 任意: 秘密鍵を暗号化するためのパスフレーズを生成して保存
  passphrase {
    generate = "true"
    complexity {
      length = 32
    }
  }
}
```

PAMマシンおよびPAMユーザーリソースでも、`private_pem_key` フィールドを使用して、同様の`generate` / `key_type` / `key_bits` のパターンで秘密PEMキーを生成できます。

{% hint style="info" %}
パスワードと同様に、SSHキーの生成では「`true`」または「`yes`」を有効な値として使用できます。これらの値を切り替えると、Terraformが差分を検出し、次回のapply時にキーペアが再生成されます。
{% endhint %}

```
terraform {
  required_providers {
    secretsmanager = {
      source  = "keeper-security/secretsmanager"
      version = ">= 1.2.0"
    }
    local = {
      source  = "hashicorp/local"
      version = "2.1.0"
    }
  }
}

provider "local" {}
provider "secretsmanager" {
  # オプション1: base64でエンコードされた認証情報を含むファイルを使用
  credential = file("~/.keeper/credential")

  # オプション2: 環境変数を使用 ( CI/CDに推奨 )
  # credentialを空にすると、環境変数KEEPER_CREDENTIALから読み取られます
}

data "secretsmanager_login" "db_server" {
  path = "<record UID>"
}

resource "local_file" "out" {
  filename        = "${path.module}/out.txt"
  file_permission = "0644"
  content         = <<EOT
UID:    ${data.secretsmanager_login.db_server.path}
Type:   ${data.secretsmanager_login.db_server.type}
Title:  ${data.secretsmanager_login.db_server.title}
Notes:  ${data.secretsmanager_login.db_server.notes}
======
Login:    ${data.secretsmanager_login.db_server.login}
Password: ${data.secretsmanager_login.db_server.password}
URL:      ${data.secretsmanager_login.db_server.url}
TOTP:
-----
%{for t in data.secretsmanager_login.db_server.totp~}
URL:    ${t.url}
Token:  ${t.token}
TTL:    ${t.ttl}
%{endfor~}
FileRefs:
---------
%{for fr in data.secretsmanager_login.db_server.file_ref~}
UID:      ${fr.uid}
Title:    ${fr.title}
Name:     ${fr.name}
Type:     ${fr.type}
Size:     ${fr.size}
Last Modified:  ${fr.last_modified}
Content/Base64: ${fr.content_base64}
%{endfor~}
EOT
}

output "db_secret_login" {
  value = data.secretsmanager_login.db_server.login
}
```

## 例

### 認証情報の読み取り

この例では、Keeperシークレットマネージャーをプロビジョニングして、ログインタイプのデータソースを読み取り、データソースの各フィールドにアクセスします。

```
  # オプション2: 環境変数を使用 (CI/CDに推奨)
  # credentialを空にすると、環境変数KEEPER_CREDENTIALから読み取られます
}

data "secretsmanager_login" "db_server" {
  path = "<record UID>"
}

resource "local_file" "out" {
  filename        = "${path.module}/out.txt"
  file_permission = "0644"
  content         = <<EOT
UID:    ${data.secretsmanager_login.db_server.path}
Type:   ${data.secretsmanager_login.db_server.type}
Title:  ${data.secretsmanager_login.db_server.title}
Notes:  ${data.secretsmanager_login.db_server.notes}
======
Login:    ${data.secretsmanager_login.db_server.login}
Password: ${data.secretsmanager_login.db_server.password}
URL:      ${data.secretsmanager_login.db_server.url}
TOTP:
-----
%{for t in data.secretsmanager_login.db_server.totp~}
URL:    ${t.url}
Token:  ${t.token}
TTL:    ${t.ttl}
%{endfor~}
FileRefs:
---------
%{for fr in data.secretsmanager_login.db_server.file_ref~}
UID:      ${fr.uid}
Title:    ${fr.title}
Name:     ${fr.name}
Type:     ${fr.type}
Size:     ${fr.size}
Last Modified:  ${fr.last_modified}
Content/Base64: ${fr.content_base64}
%{endfor~}
EOT
}

output "db_secret_login" {
  value = data.secretsmanager_login.db_server.login
}
```

### Keeperのレコードを作成

```
terraform {
  required_version = ">= 1.0.0"
  required_providers {
    secretsmanager = {
      source  = "keeper-security/secretsmanager"
      version = ">= 1.2.0"
    }
    local = {
      source  = "hashicorp/local"
      version = "2.1.0"
    }
  }
}

provider "local" {}
provider "secretsmanager" {
  # オプション1: base64でエンコードされた認証情報を含むファイルを使用
  credential = file("~/.keeper/credential")

  # オプション2: 環境変数を使用 ( CI/CDに推奨 )
  # credentialを空にすると、環境変数KEEPER_CREDENTIALから読み取られます
}

resource "secretsmanager_membership" "membership" {
  folder_uid = "<FOLDER UID>"
  title      = "test_membership_resource"
  notes      = "test_membership_resource"

  account_number {
    label          = "MyAccountNumber"
    required       = true
    privacy_screen = true
    value          = "AccountNumber#1234"
  }

  name {
    label          = "Jane"
    required       = true
    privacy_screen = true
    value {
      first  = "Jane"
      middle = "D"
      last   = "Doe"
    }
  }

  password {
    label              = "MyPass"
    required           = true
    privacy_screen     = true
    enforce_generation = true
    generate           = "true"
    complexity {
      length = 16
    }
    # value = "to_be_generated"  # generate=trueのためコメントアウト
  }
}

resource "local_file" "out" {
  filename        = "${path.module}/out.txt"
  file_permission = "0644"
  content         = <<EOT
FUID:   ${secretsmanager_membership.membership.folder_uid}
UID:    ${secretsmanager_membership.membership.uid}
Type:   ${secretsmanager_membership.membership.type}
Title:  ${secretsmanager_membership.membership.title}
Notes:  ${secretsmanager_membership.membership.notes}
======

Account Number:
---------------
%{for n in secretsmanager_membership.membership.account_number~}
Type:           ${n.type}
Label:          ${n.label}
Required:       ${n.required}
Privacy Screen: ${n.privacy_screen}
Value:          ${n.value}
%{endfor}

Name:
-----
%{for n in secretsmanager_membership.membership.name~}
Type:           ${n.type}
Label:          ${n.label}
Required:       ${n.required}
Privacy Screen: ${n.privacy_screen}
First Name:     ${n.value.0.first}
Middle Name:    ${n.value.0.middle}
Last Name:      ${n.value.0.last}
%{endfor}

Password:
---------
%{for n in secretsmanager_membership.membership.password~}
Type:               ${n.type}
Label:              ${n.label}
Required:           ${n.required}
Privacy Screen:     ${n.privacy_screen}
Enforce Generation: ${n.enforce_generation}
Generate:           %{if n.generate != null}${n.generate}%{endif}
Complexity:         Length = ${n.complexity.0.length}
Value:              ${n.value}
%{endfor}
EOT
}

output "record_uid" {
  value = secretsmanager_membership.membership.uid
}

output "record_title" {
  value = secretsmanager_membership.membership.title
}
```

### PAMレコードの作成

{% hint style="info" %}
これらのコード例は、`terraform` ブロックおよび `provider "secretsmanager"` ブロックが、上記のとおり設定済みであることを前提としています。
{% endhint %}

```
resource "secretsmanager_pam_database" "postgres_prod" {
  folder_uid = "<FOLDER_UID>"
  title      = "Production PostgreSQL"

  pam_hostname {
    value {
      hostname = "postgres.prod.example.com"
      port     = "5432"
    }
  }

  pam_settings = jsonencode([{
    connection = [{
      protocol = "postgresql"
      port     = "5432"
      database = "production"
    }]
  }])

  database_type = "postgresql"

  use_ssl {
    value = true
  }
}

resource "secretsmanager_pam_directory" "corp_ad" {
  folder_uid = "<FOLDER_UID>"
  title      = "Corporate AD"

  pam_hostname {
    value {
      hostname = "ad.corp.example.com"
      port     = "636"
    }
  }

  pam_settings = jsonencode([{
    connection = [{
      protocol = "ldaps"
      port     = "636"
    }]
  }])

  directory_type = "Active Directory"

  distinguished_name {
    value = "DC=corp,DC=example,DC=com"
  }

  use_ssl {
    value = true
  }
}
```

### PAMデータソースの出力を読み取る

{% hint style="info" %}
これらのコード例は、`terraform` ブロックおよび `provider "secretsmanager"` ブロックが、上記のとおり設定済みであることを前提としています。
{% endhint %}

```
data "secretsmanager_pam_machine" "host" {
  path = "<PAM_MACHINE_UID>"
}

output "pam_machine_folder_uid" {
  value = data.secretsmanager_pam_machine.host.folder_uid
}

output "pam_machine_totp_uri" {
  value = try(data.secretsmanager_pam_machine.host.totp[0].value, null)
}

output "pam_machine_private_key_passphrase" {
  value     = try(data.secretsmanager_pam_machine.host.private_key_passphrase[0].value, null)
  sensitive = true
}
```

その他の例については、ソースコード内の[examplesフォルダ](https://github.com/keeper-security/terraform-provider-secretsmanager/tree/master/examples)をご参照ください。

## 最適化

`secretsmanager_records` データソースを使用すると、複数のKeeperシークレットマネージャーレコードを1回のAPI呼び出しで取得でき、多数のシークレットを扱う場合のAPIリクエストを大幅に削減し、パフォーマンスを向上させます。

**UIDで取得 (最も効率的)**

```json
data "secretsmanager_records" "infrastructure" {
  uids = ["uid1", "uid2", "uid3"]
}
```

**タイトルで取得**

```json
data "secretsmanager_records" "by_name" {
  titles = ["Production DB", "Staging DB", "API Keys"]
}
```

**正規表現パターンで取得**

```json
data "secretsmanager_records" "prod_secrets" {
  title_patterns = ["^prod-.*"]  # "prod-"で始まるレコード
}
```

{% hint style="warning" %}
`titles` および `title_patterns` は、アクセス可能なすべてのボルト内レコードを取得し、クライアント側でフィルタリングを行います。パフォーマンス向上のため、可能な限り `uids` の使用を推奨します。パターンはGoの正規表現構文を使用し、ReDoSを防ぐため500文字に制限されています。
{% endhint %}

{% hint style="info" %}
利用可能なすべての出力属性を含む詳細なドキュメントについては、`secretsmanager_records` [リファレンス](https://registry.terraform.io/providers/keeper-security/secretsmanager/latest/docs/data-sources/records)をご参照ください。
{% endhint %}

**UIDによる結果へのアクセス**

レコードは `records` としてリスト形式で、また `records_by_uid` としてUIDをキーにしたマップ形式でも利用できます。

```json
# リストの位置でアクセス
output "first_title" {
  value = data.secretsmanager_records.infrastructure.records[0].title
}

# UIDでアクセス ( JSONエンコードされたレコードを返します )
output "specific_record" {
  value = data.secretsmanager_records.infrastructure.records_by_uid["uid1"]
}
```
