🍍

Pinecone リソースを Terraform で import する

2024/05/05に公開

Pinecone リソースを Terraform で import する手順

Pinecone 用の Terraform プロバイダがリリースされたようです。詳細はこちらを参照してください。
本記事では、このプロバイダを使って既存の Pinecone リソースを Terraform で管理してみようと思います。

Terraform のバージョン

terraformはv1.4.6以上が必要みたいなので、今回を機会に最新のバージョンに更新しました。
同プロジェクトでawsのリソースも管理しているので、awsのプロバイダ設定も含んでいます。

terraform -v
# Terraform v1.8.2
# on darwin_amd64
# + provider registry.terraform.io/hashicorp/aws v5.47.0
# + provider registry.terraform.io/pinecone-io/pinecone v0.7.4

ディレクトリ構成

ディレクトリ構成は、Terraform の推奨スタイルガイドに従っています。

├── dev
│   ├── backend.tf
│   ├── main.tf
│   ├── providers.tf
│   └── terraform.tf
└── modules
    └── rag
        ├── main.tf
        ├── terraform.tf
        └── variables.tf

手順

  1. dev/providers.tf ファイルを作成し、プロバイダを設定します。
provider "aws" {
  region = local.region
}

provider "aws" {
  alias  = "virginia"
  region = "us-east-1"
}

provider "pinecone" {
}

pineconeのproviderブロックでは、このようにAPIキーをセットできるようですが、本記事では環境変数を使います。後述の手順でexportしています。

  1. dev/terraform.tf ファイルを作成し、必要なプロバイダとバージョンを指定します。

pineconeのプロバイダバージョンは最新のv0.7.4で固定しておきます。

terraform {
  required_providers {
    aws = {
      source                = "hashicorp/aws"
      version               = "5.47.0"
      configuration_aliases = [aws.virginia]
    }
    pinecone = {
      source  = "pinecone-io/pinecone"
      version = "0.7.4"
    }
  }
  required_version = "1.8.2"
}

modules/rag/terraform.tfにも同じファイルを設置します。
必要であれば、適宜シンボリックリンクなどを使ってください。

  1. dev/main.tf ファイルを作成し、Pinecone モジュールを呼び出します。
module "rag" {
  source      = "../modules/rag"

  index_name  = "hoge_index"
  dimension   = 1536
  metric      = "cosine"
  cloud       = "aws"
  region      = "us-east-1"

  providers = {
    aws.virginia = aws.virginia
  }
}
  1. modules/rag/variables.tf ファイルを作成し、モジュールの変数を定義します。
variable "index_name" {
  type = string
}

variable "dimension" {
  type = number
}

variable "metric" {
  type = string
}

variable "cloud" {
  type = string
}

variable "region" {
  type = string
}
  1. modules/rag/main.tf ファイルを作成し、Pinecone インデックスのリソースを定義します。

今回はpinecone_indexリソースのみを対象にします。
pinecone_collectionリソースもterraformnに対応しているようですが、私は利用していなかったので未実施です。

resource "pinecone_index" "hoge" {
  name      = var.index_name
  dimension = var.dimension
  metric    = var.metric
  spec = {
    serverless = {
      cloud  = var.cloud
      region = var.region
    }
  }
}
  1. Terraform を初期化します。

以降の手順はdevディレクトリで実行します。

terraform init
  1. Pinecone API キーを環境変数として設定します。
export PINECONE_API_KEY=hoge_key
  1. 既存の Pinecone インデックスを Terraform にインポートします。

ドキュメントには特に記載ありませんでしたが、index_nameを指定することでimportできました。

terraform import module.rag.pinecone_index.hoge hoge_index
  1. インポートしたリソースに対する差分がないことを確認します。
terraform plan

出力結果に No changes と表示されれば、インポートされたリソースと Terraform の状態が同期されており、差分がないことを意味します。これで、既存の Pinecone リソースが Terraform で管理できるようになりました。

おわり

今回はimportの手順ですが、applyも同じようにできるのではないでしょうか。

気付けば、AWS bedrockのknowledge baseのリソースもつい先日terraform対応されていたようです。
aws_bedrockagent_knowledge_base
(記事にするかはともかく)早めに対応したいところです。

Discussion