
# keenauth_directory

`keenauth_directory` リソースは、組織の SCIM 2.0 ディレクトリを作成します。ディレクトリは、組織の ID プロバイダ（Okta、Entra ID など）がユーザーとグループをプロビジョニングするエンドポイントです。

```terraform
resource "keenauth_directory" "acme_okta" {
  organization_id = keenauth_organization.acme.id
  name            = "Okta"
  scim_host       = "acme.eu.keenauth.app"
}

output "scim_base_url" {
  value = keenauth_directory.acme_okta.base_url
}
```

`base_url` は `https://<scim_host>/scim/v2/<id>` の形式です。SCIM トークンとあわせて ID プロバイダに渡してください。

## 変更時の動作（その場での変更と置き換え）

`name` とディレクトリの設定は、その場で変更されます。プロバイダは変更された項目のみを含む JSON merge patch を送信し、最後の読み取り時の ETag を `If-Match` として付与します。その読み取り後にこの構成の外でディレクトリが変更されていた場合、API は `412` を返して何も変更せず、plan を再実行する必要があります。API はディレクトリ作成時に設定を受け付けないため、設定した項目は作成直後、同じ apply の中で適用されます。

`organization_id`、`scim_host`、`type` を変更すると、ディレクトリは置き換えられます。

- 置き換え時は、まず古いディレクトリが削除されます。ディレクトリの削除は即時かつ完全です。そのトークン、プロビジョニング済みのユーザー、グループ、グループメンバーシップ、保留中のデプロビジョニング保留もすべて削除され、ID プロバイダからの SCIM リクエストは `401` を受け取ります。新しいディレクトリには新しい ID と新しい base URL が割り当てられ、ID プロバイダを新しいトークンで指定し直す必要があります。
- 失うと困るディレクトリは、`lifecycle { prevent_destroy = true }` で保護してください。
- 新しいディレクトリは `inactive` です。プロバイダはこれを有効化も無効化もしません（有効化と無効化は `keenauth directories activate` と `deactivate` で行います）。`state` は読み取り専用です。
- 組織を削除すると、その組織のディレクトリも削除されます。プロバイダの外でディレクトリが削除された場合、そのディレクトリは state から取り除かれ、次の plan で再作成対象として計画されます。

## 設定

```terraform
resource "keenauth_directory" "acme_okta" {
  organization_id = keenauth_organization.acme.id
  name            = "Okta"
  scim_host       = "acme.eu.keenauth.app"

  provisioning_mode   = "user_store"
  attribute_allowlist = ["title", "urn:ietf:params:scim:schemas:extension:enterprise:2.0:user:department"]
  delete_action       = "remove_membership"

  mass_deprovision_guard = {
    percent      = 20
    absolute_min = 50
  }
}
```

| 設定 | 値 | 既定値 |
|---|---|---|
| `provisioning_mode` | `user_store`（環境のユーザー、組織メンバーシップ、グループの役割が書き込まれる）または `mirror`（ディレクトリのレコードのみ保持される） | `user_store` |
| `attribute_allowlist` | ディレクトリのユーザーに保持するオプションの SCIM 属性を最大 40 個指定します: `title`、`usertype`、`phonenumbers` および拡張属性のキー | 空 |
| `unverified_domain_action` | `invite` または `mirror_only`。メールアドレスのドメインが組織で検証されていないユーザーに適用されます | `invite` |
| `delete_action` | `remove_membership` または `delete_user`。SCIM の `DELETE /Users` に対する動作です | `remove_membership` |
| `on_delete_memberships` | `keep`、`suspend` または `remove`。ディレクトリ削除時に、そのディレクトリ由来のメンバーシップに適用されます | `keep` |
| `mass_deprovision_guard` | `enabled`、`percent`（5 から 50）および `absolute_min`（10 から 1000）。5 分以内のデプロビジョニング件数がこの両方を超えた場合、承認されるまで保留されます | 有効、10、25 |
| `send_welcome_email` | `true` または `false`。新しいディレクトリユーザーにアカウント有効化メールを送信します | `false` |

- 構成で設定していない項目はサーバー上の値を維持し、構成から項目を削除しても最後の値が維持されます。`mass_deprovision_guard` では、設定していないフィールドは値を維持します。
- `attribute_allowlist` からキーを削除すると、同じ更新でそのディレクトリのすべてのユーザーレコードから該当の属性が削除されます。空の集合（`[]`）を指定すると、リストがクリアされます。
- ディレクトリがユーザーレコードを保持している間は `provisioning_mode` を変更できません。API は `409` を返します。

## SCIM トークン

SCIM トークンは秘密情報です。API はディレクトリを作成するレスポンスの中で一度だけこれを返し、その後はどのエンドポイントからも読み取れません。プロバイダはトークンを state、plan ファイル、出力、ログのいずれにも書き込みません。この保証を守り、また誰も保持していない有効な認証情報が存在しないようにするため、プロバイダは作成時に返されたトークンを直ちに取り消します。

ID プロバイダ用のトークンは [`keenauth_directory_token`](/docs/terraform/directory-token) で作成してください。このリソースはトークンを、お使いの RSA 公開鍵で暗号化した状態でのみ state に保持し、秘密鍵で復号します。

プロバイダが初期トークンを取り消せなかった場合でも apply は成功しますが、取り消しに使うコマンド（`keenauth directories tokens delete <directory_id> <token_id>`）を添えた警告が表示されます。

## 引数

- `scim_host` は、環境のプライマリホストです。有効なカスタムドメインがあればそれを、なければ `<slug>.<region>.keenauth.app` を指定します。小文字の DNS 名で、この環境へルーティングされている必要があります。そうでない場合、API は `422` を返します。API はプライマリホストかどうかを検証しないため、セカンダリのカスタムドメインも受け付けられます。
- `name` は 1 から 64 文字で、制御文字を含まず、先頭または末尾に空白を含められません。一意である必要はありません。
- `type` は GA-1 では `scim` のみで、それ以外の値は指定できません。
- `state`、`base_url`、`created_at`、`etag`、`id` は読み取り専用です。API は `scim_host` を返さないため、プロバイダは `base_url` のホストからこれを導出します。

## インポート

ディレクトリ ID を指定してインポートします:

```shell
tofu import keenauth_directory.acme_okta dir_01j9zq3v8c5m2x7k4t6r1n0b3d
```
