Cloudflare Worker を利用していて、Terraformによる環境変数やシークレットの設定、サービスバインディングを設定して、 実装したソースコードはTerraformでデプロイせずに、API経由でデプロイします。
有効なパターン
この考え方は、こんな場合に有効かもしれません
- ソースの変更サイクルと、インフラの更新サイクルが異なるので、デプロイタイミングを分離したい
- マルチクラウド環境で、AWSのシークレットをTerraformで環境変数にセットしたい
- ローカルでWranglerを利用して二重管理にしたくない、上書きしたくない
やり方
- Workersの名前をハードコードする可能性を許容する
- TerrafromにWorker
workerとHelloWorldコードをデプロイするversion,deployを作成- 以降、変更しません。Workersの箱を作るのみです
- TerraformにWorkerについて、シークレットなどのバインディングを行う
version,deployを作成- 初回のみ実行をスキップする(
count=0にする)- Terrafrom外部から初回デプロイ時かどうかを判定する変数を流してください
- 例: Terraform実行前にAPI経由でWorkersの名前を検索してフラグを準備します
versionのソースコードはlatestのバージョンから取得してくださいmain_module,moduleのみで良いはずですlifecycleでソースコードの変更をignoreします- ※初回スキップは
latestを初回に取ることができないためです
- 初回のみ実行をスキップする(
- コードのデプロイは、
GET /workers/scripts/worker_name/settingsとPUT /workers/scripts/worker_nameエンドポイントを利用します- GETで既存のメタデータ(
.result以下)を取得して、PUTのマルチパートフォームのmetadata部分に追加します - 必要に応じて取得したデータに
keep_bindingsを追加します
- GETで既存のメタデータ(
wrangler.jsoncは開発時のみに利用します- 最悪、設定内容が本番と同期していなくても、デプロイに利用されず上書きなどの事故はないです
結果
- 環境変数の設定やシークレットの更新のみ、Terrafromにdiffが発生します
- コードの変更によってTerraformのdiffは発生しません
- お互いに上書き巻き戻しが発生しません
まとめ
wranglerの設定事項を唯一の信頼源とするというCloudflare推奨からは外れます。
ソースコード以外はTerraformが唯一信頼します。
ソースコードとデプロイ先のミスだけには気をつけてください。
なにかの参考までにお願いします。
以上!