TerraformでCloudflare PagesにAstroをデプロイ(GitHub連携)
Terraform(またはOpenTofu)を使用してCloudflare PagesにAstroプロジェクトをGithub連携でデプロイしたので備忘録として残します。
Terraformを使用することで、インフラをコードとして管理し、デプロイプロセスを自動化できます。
前提条件
- Terraform(またはOpenTofu)がインストールされていること
- Cloudflareアカウントとアクセストークン
- GitHubアカウントとリポジトリにプッシュされたAstroプロジェクト
また、今回は個人開発前提なので下記の運用とします。
- Astroプロジェクトのgitレポジトリにそのままtfファイルを追加(モノレポ)
- tfstateファイルはローカルでのみ管理
手順
Terraformプロジェクトの設定
まず、Terraformの設定ファイルを作成します。
touch main.tf variables.tf
New-Item main.tf variables.tf
variables.tfファイルの作成
variables.tf
ファイルに必要な変数を定義します。
variable "cloudflare_api_token" { description = "Cloudflare API Token" type = string}
variable "cloudflare_account_id" { description = "Cloudflare Account ID" type = string}
variable "production_branch" { description = "Production branch name" type = string default = "main"}
variable "github_repo_name" { description = "Name of GitHub repository" type = string}
variable "github_owner" { description = "Owner of GitHub repository" type = string}
main.tfファイルの作成
main.tf
ファイルにCloudflare Pagesプロジェクトのリソースを追加します。
terraform { required_providers { cloudflare = { source = "cloudflare/cloudflare" version = "~> 3.0" } }}
provider "cloudflare" { api_token = var.cloudflare_api_token}
resource "cloudflare_pages_project" "astro_project" { account_id = var.cloudflare_account_id name = var.github_repo_name production_branch = var.production_branch
source { type = "github" config { owner = var.github_owner repo_name = var.github_repo_name production_branch = "main" pr_comments_enabled = true deployments_enabled = true production_deployment_enabled = true } }
build_config { build_command = "npm run build" destination_dir = "dist" root_dir = "/" }
deployment_configs { preview { environment_variables = { NODE_VERSION = "20.9.0" } } production { environment_variables = { NODE_VERSION = "20.9.0" } } }}
pnpmを使う場合は、`build_command`を`npm i -g pnpm && pnpm i && pnpm build`に変更してください。
tfvarsファイルの作成(オプション)
terraform.tfvars
ファイルにCloudflare API TokenとアカウントIDを追加します。
これを書いておくと、terraform apply
コマンドを実行する際に変数の値を入力する必要がなくなります。
cloudflare_api_token = "自分のCloudflare API Token"cloudflare_account_id = "自分のCloudflare Account ID"github_repo_name = "Astroプロジェクトのリポジトリ名"github_owner = "Astroプロジェクトのリポジェクトのオーナー名"
branchはデフォルトでmain
になっていますが、変更したい場合はterraform.tfvars
に追加してください。
カスタムドメインの設定(オプション)
カスタムドメインを設定する場合は、以下のリソースをmain.tf
に追加します。
resource "cloudflare_pages_domain" "custom_domain" { account_id = var.cloudflare_account_id project_name = cloudflare_pages_project.astro_project.name domain = "your-custom-domain.com"}
Terraformの初期化と適用
以下のコマンドを実行して、Terraformプロジェクトを初期化し、リソースを作成します。
TerraformはライセンスがBSL1.1であるため、オープンソースの代替としてOpenTofuを使用することもできます。
terraform initterraform apply -auto-approve
tofu inittofu apply -auto-approve
変数の値を入力するよう求められたら、適切な値を入力します。(terraform.tfvarsを作成している場合は不要)
デプロイの確認
Terraformの適用が完了したら、Cloudflareダッシュボードで新しく作成されたPagesプロジェクトを確認できます。
GitHubリポジトリへの変更がプッシュされると、自動的にビルドとデプロイが開始されます。