Cloudflare Workerのコード単体と環境設定を分けてデプロイしたい

Cloudflare Worker を利用していて、Terraformによる環境変数やシークレットの設定、サービスバインディングを設定して、 実装したソースコードはTerraformでデプロイせずに、API経由でデプロイします。

有効なパターン

この考え方は、こんな場合に有効かもしれません

  • ソースの変更サイクルと、インフラの更新サイクルが異なるので、デプロイタイミングを分離したい
  • マルチクラウド環境で、AWSのシークレットをTerraformで環境変数にセットしたい
  • ローカルでWranglerを利用して二重管理にしたくない、上書きしたくない

やり方

  1. Workersの名前をハードコードする可能性を許容する
  2. TerrafromにWorkerworkerとHelloWorldコードをデプロイするversion,deployを作成
    • 以降、変更しません。Workersの箱を作るのみです
  3. TerraformにWorkerについて、シークレットなどのバインディングを行うversion,deployを作成
    • 初回のみ実行をスキップする(count=0にする)
      • Terrafrom外部から初回デプロイ時かどうかを判定する変数を流してください
      • 例: Terraform実行前にAPI経由でWorkersの名前を検索してフラグを準備します
    • versionのソースコードはlatestのバージョンから取得してください
      • main_module,moduleのみで良いはずです
      • lifecycleでソースコードの変更をignoreします
      • ※初回スキップはlatestを初回に取ることができないためです
  4. コードのデプロイは、https://api.cloudflare.com/client/v4/accounts/${ACCOUNT_ID}/workers/scripts エンドポイントを利用します
    • -F ‘metadata={“main_module”:“index.js”};type=application/json’
    • -F “index.js=@dist/index.js;type=application/javascript+module”
  5. wrangler.jsoncは開発時のみに利用します
    • 最悪、設定内容が本番と同期していなくても、デプロイに利用されず上書きなどの事故はないです

結果

  • 環境変数の設定やシークレットの更新のみ、Terrafromにdiffが発生します
  • コードの変更によってTerraformのdiffは発生しません
  • お互いに上書き巻き戻しが発生しません

まとめ

wranglerの設定事項を唯一の信頼源とするというCloudflare推奨からは外れます。 ソースコード以外はTerraformが唯一信頼します。 ソースコードとデプロイ先のミスだけには気をつけてください。

なにかの参考までにお願いします。

以上!