はじめに
TerraformはSupabaseのプロバイダを提供しており、構成をTerraformで管理して必要になったときに自動でプロジェクトを立ち上げたり更新したりできます。
Supabaseと一緒に使うことの多いVercelに関してもTerraformがプロバイダを提供しています。
これらを組み合わせることでバックエンドの作成からホスティングまでまとめて自動化できます。
今回実際にTerraformでSupabase x Vercelを連携して立ち上げる構成を作成したので、利用方法を説明していきます。
Terraformの実装部分
まずは今回作成したtfファイルを含むプロジェクトの構造を添付画像でお見せします。
重要なのはprovider.tfとterraform.tfvarsです。
それ以外は生成されたファイルなので関係ありません。
まずはprovider.tfの内容ですが、下記のようになっています。
provider.tf
terraform {
required_providers {
supabase = {
source = "supabase/supabase"
version = "~> 1.0"
}
vercel = {
source = "vercel/vercel"
version = "~> 2.0"
}
}
}
variable "supabase_access_token" {}
variable "supabase_organization_id" {}
variable "supabase_database_password" {}
variable "supabase_linked_project" {}
variable "supabase_url" {}
variable "supabase_anon_key" {}
variable "vercel_access_token" {}
variable "vercel_team_id" {}
variable "vercel_gitrepo" {}
provider "supabase" {
access_token = var.supabase_access_token
}
# Create a project resource
resource "supabase_project" "production" {
organization_id = var.supabase_organization_id
name = "tf-example"
database_password = var.supabase_database_password
region = "ap-southeast-1"
lifecycle {
ignore_changes = [database_password]
}
}
# Configure api settings for the linked project
resource "supabase_settings" "production" {
project_ref = var.supabase_linked_project
api = jsonencode({
db_schema = "public,storage,graphql_public"
db_extra_search_path = "public,extensions"
max_rows = 1000
})
}
# Vercel
provider "vercel" {
api_token = var.vercel_access_token
team = var.vercel_team_id
}
resource "vercel_project" "with_git" {
name = "example-project-with-git"
framework = "nextjs"
git_repository = {
type = "github"
repo = var.vercel_gitrepo
}
}
# supabaseの環境変数をvercelに反映
resource "vercel_project_environment_variable" "supabase_url" {
project_id = vercel_project.with_git.id
key = "NEXT_PUBLIC_SUPABASE_URL"
value = var.supabase_url
target = ["production"]
}
resource "vercel_project_environment_variable" "supabase_anon_key" {
project_id = vercel_project.with_git.id
key = "NEXT_PUBLIC_SUPABASE_ANON_KEY"
value = var.supabase_anon_key
target = ["production"]
}
resource "vercel_deployment" "with_git" {
project_id = vercel_project.with_git.id
ref = "main"
各所で何をしているのか説明します。
terraform {
required_providers {
supabase = {
source = "supabase/supabase"
version = "~> 1.0"
}
vercel = {
source = "vercel/vercel"
version = "~> 2.0"
}
}
}
まずはじめのこの部分ですが、SupabaseとVercelのプロバイダを読み込んでいます。
これらはTerraformのレジストリからそれぞれ取得しています。
https://registry.terraform.io/providers/supabase/supabase/latest/docs
https://registry.terraform.io/providers/vercel/vercel/latest/docs
次にこちらで変数の読み込みをしています。
変数の実態はterraform.tfvars
で定義しています。
variable "supabase_access_token" {}
variable "supabase_organization_id" {}
variable "supabase_database_password" {}
variable "supabase_linked_project" {}
variable "supabase_url" {}
variable "supabase_anon_key" {}
variable "vercel_access_token" {}
variable "vercel_team_id" {}
variable "vercel_gitrepo" {}
次にここでSupabaseのプロジェクトの作成を行っています。
Supabaseユーザのアクセストークンとユーザが所属する組織ID、あと利用したいデータベースパスワードをそれぞ
変数から読み込んで利用しています。
provider "supabase" {
access_token = var.supabase_access_token
}
# Create a project resource
resource "supabase_project" "production" {
organization_id = var.supabase_organization_id
name = "tf-example"
database_password = var.supabase_database_password
region = "ap-southeast-1"
lifecycle {
ignore_changes = [database_password]
}
}
SupabaseのアクセストークンはAccount Settings
のAccess Tokens
から作成できます。
Organization IDはOrganizations
から見ることができます。
次にこちらでは作成したプロジェクトの設定を変更しています。
supabase_linked_projectにはプロジェクトのIDが入ります。
# Configure api settings for the linked project
resource "supabase_settings" "production" {
project_ref = var.supabase_linked_project
api = jsonencode({
db_schema = "public,storage,graphql_public"
db_extra_search_path = "public,extensions"
max_rows = 1000
})
}
適用後、Project Settings
で設定が適用されたことが確認できます。
Vercel側の設定はまとめてこちらで作成されています。
# Vercel
provider "vercel" {
api_token = var.vercel_access_token
team = var.vercel_team_id
}
resource "vercel_project" "with_git" {
name = "example-project-with-git"
framework = "nextjs"
git_repository = {
type = "github"
repo = var.vercel_gitrepo
}
}
resource "vercel_project_environment_variable" "supabase_url" {
project_id = vercel_project.with_git.id
key = "NEXT_PUBLIC_SUPABASE_URL"
value = var.supabase_url
target = ["production"]
}
resource "vercel_project_environment_variable" "supabase_anon_key" {
project_id = vercel_project.with_git.id
key = "NEXT_PUBLIC_SUPABASE_ANON_KEY"
value = var.supabase_anon_key
target = ["production"]
}
resource "vercel_deployment" "with_git" {
project_id = vercel_project.with_git.id
ref = "main"
}
こちらは特に説明必要ないぐらいにわかりやすい部分だと思いますが、アクセストークン、チームID、Supabase側の環境変数、githubのリポジトリとデプロイに必要なブランチを指定するとVercelのプロジェクト作成~github連携&デプロイまで対応してくれます。
terraform.tfvars
変数はこちらのファイル内で定義されます。それぞれ必要な値を入れてください。
supabase_url, supabase_linked_project, supabase_anon_keyはSupabaseプロジェクトを作成しないとわからないのではじめは空欄でよいです。
supabase_access_token = "your_supabase_access_token"
supabase_organization_id = "your_supabase_organization_id"
supabase_database_password = "your_supabase_database_password"
supabase_linked_project = "your_supabase_linked_project"
supabase_url = "your_supabase_url"
supabase_anon_key = "your_supabase_anon_key"
vercel_access_token = "your_vercel_access_token"
vercel_team_id = "your_vercel_team_id"
vercel_gitrepo = "your_vercel_gitrepo"
Vercelで利用するgithubリポジトリ作成
Vercelと結びつけるためにサンプルプロジェクトを作成してgithubにアップロードしておきましょう。
https://supabase.com/docs/guides/getting-started/quickstarts/nextjs
上記ページをもとに、下記のコマンドでプロジェクトだけ作成しておきます。
※envファイルの作成も不要です。
npx create-next-app -e with-supabase
実行してみる
上記の事前準備が終わったら、実際に実行の流れを確認してみましょう。
Supabaseのプロジェクト立ち上げ
まずはSupabaseのプロジェクトの立ち上げを行います。
先ほどのprovider.tf
の中のSupabase立ち上げ以外をいったんコメントアウトしましょう。
terraform {
required_providers {
supabase = {
source = "supabase/supabase"
version = "~> 1.0"
}
vercel = {
source = "vercel/vercel"
version = "~> 2.0"
}
}
}
variable "supabase_access_token" {}
variable "supabase_organization_id" {}
variable "supabase_database_password" {}
variable "supabase_linked_project" {}
variable "supabase_url" {}
variable "supabase_anon_key" {}
variable "vercel_access_token" {}
variable "vercel_team_id" {}
variable "vercel_gitrepo" {}
provider "supabase" {
access_token = var.supabase_access_token
}
# Create a project resource
resource "supabase_project" "production" {
organization_id = var.supabase_organization_id
name = "tf-example"
database_password = var.supabase_database_password
region = "ap-southeast-1"
lifecycle {
ignore_changes = [database_password]
}
}
# # Configure api settings for the linked project
# resource "supabase_settings" "production" {
# project_ref = var.supabase_linked_project
# api = jsonencode({
# db_schema = "public,storage,graphql_public"
# db_extra_search_path = "public,extensions"
# max_rows = 1000
# })
# }
# # Vercel
# provider "vercel" {
# api_token = var.vercel_access_token
# team = var.vercel_team_id
# }
# resource "vercel_project" "with_git" {
# name = "example-project-with-git"
# framework = "nextjs"
# git_repository = {
# type = "github"
# repo = var.vercel_gitrepo
# }
# }
# # supabaseの環境変数をvercelに反映
# resource "vercel_project_environment_variable" "supabase_url" {
# project_id = vercel_project.with_git.id
# key = "NEXT_PUBLIC_SUPABASE_URL"
# value = var.supabase_url
# target = ["production"]
# }
# resource "vercel_project_environment_variable" "supabase_anon_key" {
# project_id = vercel_project.with_git.id
# key = "NEXT_PUBLIC_SUPABASE_ANON_KEY"
# value = var.supabase_anon_key
# target = ["production"]
# }
# resource "vercel_deployment" "with_git" {
# project_id = vercel_project.with_git.id
# ref = "main" # or a git branch
# }
まずterraformの初期化を行います。
terraform -chdir=module init
問題なく通ったら実行しましょう。
terraform -chdir=module apply
プロジェクトの作成ができました。
ここまで出来たらSupabaseプロジェクトの情報をterraform.tfvars
に入れ、provider.tf
のコメントアウトした部分をもとに戻します。
そして、初期化処理をupgradeフラグを付けて再度実行します。
terraform -chdir=module init -upgrade
こちらも問題なく通ったら再度実行しましょう。
terraform -chdir=module apply
すると、Vercel側でもプロジェクトが立ち上がり、デプロイが行われていることが確認できます。
今回はProduction環境に環境変数を設定したので、Productionのデプロイを見ると環境変数のステップが消えていることがわかります。
Previewのデプロイを作って確認すると環境変数がなく、環境変数を作る旨のステップが下に表示されていることがわかります。
まとめ
これでTerraformを使ったSupabase x Vercel構成のインフラ自動化の基礎ができました!
ほかにも設定できる項目はいろいろあるため下記ドキュメントで調べつつ自分の環境に合わせてカスタマイズしてみてください!
Supabase Provider: https://registry.terraform.io/providers/supabase/supabase/latest/docs
Vercel Provider: https://registry.terraform.io/providers/vercel/vercel/latest/docs
参考資料
今回のgithubリポジトリ: https://github.com/TodoONada/supabase-vercel-terraform-setting