👨‍💼

TerraformでVercelの色々コード管理試してみた

2024/07/13に公開

概要

TerraformのVercel Providerを参考にVercelの下記の管理を試してみたので、つらつらやったことを書きます。

  • Projects設定
    • Projectの設定
    • デプロイ
    • vercel_attack_challenge_modeの設定
  • 独自ドメイン設定
    • Vercelに指定されたAレコードの方式で独自ドメインを紐付け

コードは下記

https://github.com/K-Sato1995/tf-nextjs-demo

※あくまでも現在何ができるのかな〜を軽く試してみたレベルの記事です

各種バージョン

  • hashicorp/aws: 5.58.0
  • vercel/vercel: 1.12.0
  • terraform_version: 1.5.7

Vercel Projectの作成

こちらの記事に沿ってサクサク作れました。

terraform {
  required_providers {
    vercel = {
      source = "vercel/vercel"
      version = "~> 1.0"
    }
}

resource "vercel_project" "tf-nextjs-demo" {
  name      = "tf-nextjs-demo"
  framework = "nextjs"
  git_repository = {
    type = "github"
    repo = "自分のレポジトリ"
  }
}

デプロイ + vercel_attack_challenge_modeの設定

data "vercel_project_directory" "nextjs-blog" {
  path = "../nextjs-blog" // デプロイしたいプロジェクトのDirを設定
}

resource "vercel_deployment" "tf-nextjs-demo_deployment" {
  project_id  = vercel_project.tf-nextjs-demo.id
  files       = data.vercel_project_directory.nextjs-blog.files
  path_prefix = "../nextjs-blog"
  production  = true
}

resource "vercel_attack_challenge_mode" "tf-nextjs-demo_attack_challenge_mode" {
  project_id = vercel_project.tf-nextjs-demo.id
  enabled    = true
}

カスタムドメインの設定

私の場合はRoute53で管理していたので、そのケースの設定になります。

resource "vercel_project_domain" "tf-nextjs-demo_domain" {
  project_id = vercel_project.tf-nextjs-demo.id
  domain     = "設定したい独自ドメイン"
}

下記の画像のようにVercelから指定されたAレコードで紐付けます。

// provider追加
terraform {
    aws = {
      source  = "hashicorp/aws"
      version = "~> 5.0"
    }
  }
}

data "aws_route53_zone" "dns_zone" {
  name = "dnsゾーン指定"
}
 
resource "aws_route53_record" "dns_record" {
  zone_id = data.aws_route53_zone.dns_zone.zone_id
  name    = "独自ドメイン"
  type    = "A"
  ttl     = 300
  records = ["76.76.21.21"] // Vercelから指定されたIPアドレス
}

まとめ

↑やるとvercelのproject作成から独自ドメイン設定までコード管理できました。

あと、私の使ったvercel/vercel: 1.12.0だとStorage等のサポートはありませんでしたが、絶賛開発中みたいでした。

Add support for Vercel Storage #127

tacomsテックブログ

Discussion