Skip to content

非公式本サイトは非公式の日本語ドキュメントであり、Cloudflare 公式サイトではありません。最新情報はdevelopers.cloudflare.comをご確認ください。

段階的デプロイ

最終更新 Markdown で表示Agent セットアップ

段階的デプロイでは、トラフィックをバージョン間で分割し、Worker の新しい バージョン を少しずつ公開できます。新しいバージョンへ一度にすべてのトラフィックを切り替えず、一部のリクエストだけを新バージョンへ送り、残りは前のバージョンで処理できます。

段階的デプロイ

段階的デプロイでは、次のことができます。

  • Worker の新しいバージョンへ、トラフィックを少しずつ移す
  • オブザーバビリティ ツールで、バージョンごとのエラー率と例外を監視する
  • 問題に気づいたら、以前の安定バージョンへ ロールバック する

段階的デプロイを使う

次のセクションでは、段階的デプロイの利用例を説明します。

Wrangler から

1. 新しい Worker を作成してデプロイする

create-cloudflare CLI(C3)"Hello World" Worker を作成し、デプロイします。

npm create cloudflare@latest -- <NAME> -- --type=hello-world

TypeScript を使うかどうかは yes または no で答えます。アプリケーションのデプロイは yes と答えます。これが Worker の最初のバージョンです。

2. Worker の新しいバージョンを作成する

Response の内容を変えて Worker のコードを編集し、wrangler versions upload コマンドで Worker をアップロードします。

npx wrangler versions upload

自動ではデプロイされない、新しいバージョンが作成されます。

3. 新しいデプロイを作成する

wrangler versions deploy コマンドで、2 つのバージョン間でトラフィックを分割する新しいデプロイを作成します。対話プロンプトに従い、各バージョンの希望する割合を選びます。

npx wrangler versions deploy

4. 分割デプロイをテストする

Worker に対して cURL コマンドを実行し、分割デプロイをテストします。

for j in {1..10}
do
    curl -s https://$WORKER_NAME.$SUBDOMAIN.workers.dev
done

10 件のレスポンスが表示されます。内容は ステップ 3 で設定した割合によって変わります。

バージョンオーバーライド で、特定のバージョンを対象にすることもできます。

5. 新しいバージョンを 100% デプロイにする

もう一度 wrangler versions deploy を実行し、対話プロンプトに従います。新しいバージョンを選び、100% に設定します。

npx wrangler versions deploy

Cloudflare ダッシュボードから

  1. Cloudflare ダッシュボードで Workers & Pages ページを開きます。

    Workers & Pages を開く ↗
  2. Create application > Hello World テンプレートを選び、Worker をデプロイします。

  3. Worker のデプロイ後、Edit code からオンラインコードエディターを開きます。Worker のコードを編集します(Response の内容を変更します)。

  4. デプロイせずに変更を保存するには、Deploy の横の 下向き矢印 > Save を選びます。Worker の新しいバージョンが作成されます。

  5. Deployments を開き、Promote deployment を選んで、2 つのバージョン間の分割を作成します。

バージョンスキュー

段階的デプロイでは、複数バージョンの Worker が同時にトラフィックを処理します。そのため、クライアントやサービスが複数バージョンとやり取りし、エラーや一貫性のない挙動が起きることがあります。これを バージョンスキュー(version skew) と呼びます。

Worker 内のバージョンスキュー

既定では、各リクエストは設定した割合に基づいて、独立していずれかのバージョンへルーティングされます。同じユーザーからの連続リクエスト(ページの再読み込みやアセット取得を含む)が、異なるバージョンで処理されることがあります。

段階的デプロイの間、ユーザーを同じバージョンに固定したい場合は、バージョンアフィニティ を使えます。

Worker 間のバージョンスキュー

ある Worker が サービスバインディング で別の Worker を呼ぶとき、2 つの Worker はそれぞれ独自の段階的デプロイの途中にあることがあります。Worker A(新バージョン)が Worker B を呼んでも、リクエストは Worker B の旧バージョンに着き、API 契約が異なる場合があります。

サブリクエスト中に下流の Worker を特定バージョンへ固定するには、バージョンオーバーライド を使えます。

Durable Objects

Durable Objects では、各 Durable Object の実行バージョンは一度に 1 つだけのため、段階的デプロイの動きが異なります。バージョンの割り当て、保証、マイグレーションの詳細は、Durable Objects での段階的デプロイ を参照してください。

オブザーバビリティ

段階的デプロイでは、Workers の呼び出しを特定バージョンに紐づけて、新バージョン公開の影響を把握したいことがあります。

Logpush

Workers Logpush で、新しい ScriptVersion オブジェクトを使えます。現時点では、ScriptVersion は Logpush API からのみ追加できます。API 呼び出しの例です。

curl -X POST 'https://api.cloudflare.com/client/v4/accounts/<ACCOUNT_ID>/logpush/jobs' \
-H 'Authorization: Bearer <TOKEN>' \
-H 'Content-Type: application/json' \
-d '{
"name": "workers-logpush",
"output_options": {
    "field_names": ["Event", "EventTimestampMs", "Outcome", "Logs", "ScriptName", "ScriptVersion"]
},
"destination_conf": "<DESTINATION_URL>",
"dataset": "workers_trace_events",
"enabled": true
}'| jq .

ScriptVersion は次の構造のオブジェクトです。

{
	"ScriptVersion": {
		"id": "<UUID>",
		"message": "<MESSAGE>",
		"tag": "<TAG>"
	}
}

ランタイムバインディング

Version metadata バインディング で、Worker 内のバージョン ID またはバージョンタグにアクセスできます。

制限

デプロイの制限

段階的デプロイを作成できるのは、アップロード済みの直近 100 バージョンの Worker だけです。

役に立ちましたか?