👏

CloudflareをTerraform化したい

2024/12/09に公開

この記事は、tacoms Advent Calendar 2024の9日目です!
他メンバーのAdvent Calendarはこちらからご覧ください!👇
https://qiita.com/advent-calendar/2024/tacoms

はじめに

Cloudflareのリソースをterraform化したいなと思った時にcf-terraformingという便利そうなツールを見つけたので、ちょいと試したいと思います。
https://github.com/cloudflare/cf-terraforming

試す

インストール

cf-terraformingをインストールしていきます。

brew tap cloudflare/cloudflare
brew install cloudflare/cloudflare/cf-terraforming

https://developers.cloudflare.com/terraform/advanced-topics/import-cloudflare-resources/

設定

まずは認証を通すために環境変数として以下を設定します。ドキュメントにはCLOUDFLARE_ACCOUNT_IDの記載がなかったですが、必須でした。ちなみにアカウントIDを設定しない場合は、FATA[0015] required missing account IDというエラーが出ます。

export CLOUDFLARE_API_TOKEN='hogehoge'
export CLOUDFLARE_ACCOUNT_ID='hogehoge'

https://github.com/cloudflare/cf-terraforming?tab=readme-ov-file#authentication

コマンド実行

例えばアカウント管理をterraform化したい場合は、こんなコマンドを実行すればterraformのコードを出力してくれます。めちゃくちゃ便利ですね!

$ cf-terraforming generate --resource-type "cloudflare_account_member"
resource "cloudflare_account_member" "terraform_managed_resource_8101e0b8fa4ab825deef21c1711b8840" {
  account_id    = "hogehoge"
  email_address = "hogehoge@gmail.com"
  role_ids      = ["1111111111111111111111"]
  status        = "accepted"
}

Cloudflare Workers(以下worker)とかはどう?

まずcf-terraformingではgenerateもimportもできません。サポートしているリソース一覧で確認することができます。リソース一覧を見ると、Cloudflare R2なども含めてCloudflareの主なサービスがサポートされていない状況でした。
https://github.com/cloudflare/cf-terraforming?tab=readme-ov-file#supported-resources

純粋にimportを実装してみる

試しにworkerをサクッと作って、importの実装してみました。

terraform {
  required_version = "~> 1.10.0"

  required_providers {
    cloudflare = {
      source  = "cloudflare/cloudflare"
      version = "4.47.0"
    }
  }
}

resource "cloudflare_workers_script" "main" {
  account_id = "hogehoge"
  name       = "hogehoge"
  content = jsonencode(
    {
      lockfileVersion = 3
      name            = "hogehoge"
      packages = {
        "" = {
          license = "ISC"
          name    = "hogehoge"
          version = "1.0.0"
        }
      }
      requires = true
      version  = "1.0.0"
    }
  )
}

// importブロック
import {
  id = "<account-id>/<worker-name>"
  to = cloudflare_workers_script.main
}

ちなみに最新の5.0.0-alpha1で試すと謎にmissing required account_id parameterが出続けたり、ドキュメントと実際に必要なparameterが違ったりしてます(nameやcontentは記載箇所が違いそう)。4.47.0が無難ではありそうです。
https://registry.terraform.io/providers/cloudflare/cloudflare/latest/docs/resources/workers_script

参考

https://future-architect.github.io/articles/20230502a/

tacomsテックブログ

Discussion