既存の OpenAI リソースは、作り直さずにインポートします。安全に Terraform の管理下に置くには、まずリモートリソースの設定に合わせて構成を記述します。インポートの内容をプランで確認してから適用し、予定している更新に進む前に、次のプランで変更がないことを確認します。
インポートブロックを使用するには、Terraform 1.5 以降が必要です。
リソースの宣言とインポート
既存の各リソースを現在の設定に合わせて宣言し、プロバイダーのリファレンスに記載されている ID 形式で import ブロックを追加します。
resource "openai_project" "existing" {
name = "existing-project"
}
resource "openai_group" "existing" {
name = "existing-group"
}
resource "openai_project_service_account" "existing" {
project_id = openai_project.existing.project_id
name = "existing-service-account"
}
import {
to = openai_project.existing
id = "proj_123"
}
import {
to = openai_group.existing
id = "group_123"
}
import {
to = openai_project_service_account.existing
id = "proj_123/svc_acct_123"
}
プランを保存し、インポートの内容を確認します。
terraform plan -out=tfplan
terraform show tfplan
プランにインポートが表示され、リモートリソースの更新が含まれていないことを確認します。更新が含まれている場合は、先に構成を現在の設定に合わせます。保存したプランを適用してインポートを実行し、もう一度プランを作成します。
terraform apply tfplan
terraform plan
2 回目のプランで変更がないことを確認します。リソースをどのように Terraform の管理下に置いたかを記録するために、インポートブロックを構成に残しておくことができます。
代表的なインポート ID の形式は次のとおりです。
| リソース | インポート ID の形式 |
|---|---|
| プロジェクト | <project_id> |
| 組織のグループ | <group_id> |
| プロジェクトのロール | <project_id>/<role_id> |
| プロジェクトのサービスアカウント | <project_id>/<service_account_id> |
| プロジェクトのグループに割り当てたロール | <project_id>/<group_id>/<role_id> |
| プロジェクトのユーザーに割り当てたロール | <project_id>/<user_id>/<role_id> |
| プロジェクトのレート制限 | <project_id>/<rate_limit_id> |
各リソースの正確な ID 形式は、プロバイダーのリファレンスで確認してください。
他のシステムが管理するリソースの参照
別のシステムが管理するリソースの最新情報を Terraform で参照するには、データソースを使用します。プロバイダーには、プロジェクト、グループ、ロール、ユーザー、ロールの割り当て、レート制限、モデルの権限、ホスト型ツールの権限、支出アラート、データ保持設定、証明書のデータソースが用意されています。
次の例では、既存のプロジェクトと、そのプロジェクトに現在属しているグループを参照します。
data "openai_project" "existing" {
project_id = var.project_id
}
data "openai_project_groups" "existing" {
project_id = data.openai_project.existing.project_id
}
output "project_groups" {
value = data.openai_project_groups.existing.groups
}
プロバイダーでは、ID を指定して既存のプロジェクトサービスアカウントをインポートできますが、現時点ではサービスアカウントのデータソースは用意されていません。既存のサービスアカウントを Terraform の管理下に置く必要がある場合は、プロジェクト ID とサービスアカウント ID を承認済みの管理台帳に記録しておいてください。API キーの初期設定からインポートまでの手順は、サービスアカウントを参照してください。
構成ドリフトの検出と解消
通常のプランを作成すると、Terraform は OpenAI の現在の設定を読み取り、Terraform の構成で指定した値と比較します。
terraform plan -detailed-exitcode
終了コード 0 は変更がないこと、2 はプランに変更が含まれていること、1 は Terraform でエラーが発生したことを示します。
Terraform の外部で変更された設定がプランに表示された場合は、次の手順で対応します。
- 変更が意図したものかどうかを確認します。
- リモート側の変更を維持する場合は、その変更に合わせて Terraform の構成を更新します。
- リモート側の変更を取り消す場合は、プランを確認して適用し、設定を構成で指定した値に戻します。
- もう一度プランを作成し、変更がないことを必ず確認します。
リソースブロック削除時の動作
リソースブロックを削除すると、リソースは Terraform の状態から削除されます。リモート側のオブジェクトや設定がどう扱われるかは、リソースの種類によって異なります。
| リソースの種類 | 削除時の動作 |
|---|---|
openai_project |
プロジェクトをアーカイブします。アーカイブしたプロジェクトは復元できません。 |
openai_project_service_account |
サービスアカウントを削除します。 |
| ロール、グループ、メンバーシップ、割り当ての各リソース | 対応する管理対象のオブジェクトまたは割り当てを削除します。 |
openai_project_model_permissions |
プロジェクトのモデル権限の設定を削除します。 |
| プロジェクトのレート制限、ホスト型ツールの権限、データ保持設定の各リソース | Terraform の状態からリソースを削除します。リモート側の設定はリセットされません。 |