Cloudflare Pagesで自分のブログなどのWebサイトを公開している人も多いですよね。
デプロイも自動でやってくれるので便利です。
今回はそんなCloudflare PagesをTerraform管理下に置いていきたいと思います。
Terraform初期設定
まずはTerraformが動くように初期設定していきます。
- cloudflare providerのインストール
- API TOKENの発行とセット
上記の2つを記事では書きますが、本当はbackendも設定してstateファイルをしっかり管理した方がいいと思います。
この記事では設定しないですが、あとでクラウド管理するつもりです。
cloudflare providerのインストール
まずはcloudflareのproviderを入れていきます。
# provider.tf
terraform {
required_version = "~> 1.6"
required_providers {
cloudflare = {
source = "cloudflare/cloudflare"
version = "~> 4.0"
}
}
}
上記を書いたのち、terraform initを実行します。
API TOKENの発行とセット
続いて、Terraformを通してローカルからCloudflareを操作するためにAPI TOKENを発行します。
公式ドキュメントはこちらです。なお、権限制御がないAPI Keysを使うのは非推奨のようです。
https://developers.cloudflare.com/fundamentals/api/get-started/create-token/
My Profile > API Tokensへ行き、Create Tokenを押します。
今回はPagesとDomainについて管理していくので、以下の設定でトークンを発行します。
Permissions
- Account, Cloudflare Pages, Edit
- Zone, DNS, Edit
発行したAPI TOKENを環境変数に設定します。
export CLOUDFLARE_API_TOKEN=hogehoge
もしtfファイルに直接トークンを埋めるならcloudflareブロックが必要なので以下の記事のapi_tokenなどを参考にしてください。
https://registry.terraform.io/providers/cloudflare/cloudflare/latest/docs
Cloudflare PagesをTerraform管理する
Cloudflare PagesをTerraform管理下に置いていきます。
すでにコンソールで作っているので、今回はインポートしていきます。
terraformのimportブロックを使用したインポート方法はこちらの記事をご覧ください。
https://blog.akikazewf.dev/post/use-terraform-import-block
cloudflare_pages_projectの設定
まずはプロジェクトをインポートしていきます。リソースのページはこちらです。
https://registry.terraform.io/providers/cloudflare/cloudflare/latest/docs/resources/pages_project
インポートに必要なaccount_idとproject_nameはWorkers & Pages > Overviewから確認できます。もしGitHubからのビルド設定を入れているHugoのブログなら、最終的に以下のような形になると思います。
resource "cloudflare_pages_project" "akikazewf" {
name = "YOUR_BLOG_NAME"
account_id = "YOUR_ACCOUNT_ID"
production_branch = "main"
build_config {
build_command = "hugo"
destination_dir = "public"
root_dir = "YOUR_ROOT_DIR"
}
source {
type = "github"
config {
owner = "YOUR_GITHUB"
repo_name = "YOUR_REPOSITORY"
production_branch = "main"
}
}
}
cloudflare_pages_domainの設定
続いて、おそらくカスタムドメインを設定していると思うのでそれもインポートしていきます。
https://registry.terraform.io/providers/cloudflare/cloudflare/latest/docs/resources/pages_domain
最終的にはこうなります。
resource "cloudflare_pages_domain" "akikazewf" {
account_id = "YOUR_ACCOUNT_ID"
domain = "YOUR_DOMAIN"
project_name = "YOUR_PROJECT_NAME"
}
その他の設定
以上で終了ですが、カスタムページなどを入れているなら他にもインポートが必要かもしれません。
終わりに
Cloudflare PagesをTerraform管理しました。
AWSやGCPばかり使いがちなのですが、Cloudflareも対応しているとはさすがTerraformです。