👻

Workers 段階的デプロイメントとステージング専用URL

2024/10/07に公開

Cloudflare Workers のデプロイは従来は完全上書き方式でした。このためテスト環境やステージング環境を作成したい場合、別サブドメインを付与して形でWorkersをデプロイする必要がありました。

先日のBirthday Weekで段階的デプロイメントとステージング機能が一般提供開始となり、カナリアリリースが可能となりました。

カナリアリリースとは

カナリアリリースとは全ユーザーに一度にリリースするのではなく、まずは一部のユーザーにのみや、段階的に展開されるデプロイ手法を指します。どのようなユーザーを新しい環境にルーティングさせるかは様々な手法が存在していますが、Cloudflare Workersはリクエスト単位でユーザを識別せず指定されたパーセンテージのリクエストを新しい環境へルーティングする手法を取ります。

この場合、新環境、旧環境双方へ同じURLでアクセス可能となります。

ステージング専用URL

今回もう一つリリースされた機能がステージング専用URLです。最大過去10バージョンまで、デプロイされた環境単位でランダムに生成されたサブドメインに対して過去バージョンへアクセス可能なURLが存在しており、過去に遡ったテストが容易になります。また前述の機能と連携させ例えば新環境:0%, 旧環境100%と指定することでユーザーからのリクエストがルーティングされない、特定URLを入手できる開発者のみがアクセス可能な環境を作ることも可能です。

さっそくやってみる

まずはいつも通りWorkersでHello Worldを作成します。
入力パラメータは以下を参考にしてください。

wrangler init canary
Delegating to locally-installed wrangler@3.57.1 over global wrangler@2.14.0...
Run `npx wrangler init canary` to use the local version directly.

 ⛅️ wrangler 3.57.1 (update available 3.80.0)
-------------------------------------------------------
Using npm as package manager.
▲ [WARNING] The `init` command is no longer supported. Please use `npm create cloudflare\@2.5.0 -- canary` instead.

  The `init` command will be removed in a future version.


Running `npm create cloudflare\@2.5.0 -- canary`...


──────────────────────────────────────────────────────────────────────────────────────────────────────────
👋 Welcome to create-cloudflare v2.29.2!
🧡 Let's get started.
📊 Cloudflare collects telemetry about your usage of Create-Cloudflare.

Learn more at: https://github.com/cloudflare/workers-sdk/blob/main/packages/create-cloudflare/telemetry.md
──────────────────────────────────────────────────────────────────────────────────────────────────────────

╭ Create an application with Cloudflare Step 1 of 3
│
├ In which directory do you want to create your application?
│ dir ./canary
│
├ What would you like to start with?
│ category Hello World example
│
├ Which template would you like to use?
│ type Hello World Worker
│
├ Which language do you want to use?
│ lang JavaScript
│
├ Copying template files 
│ files copied to project directory
│ 
├ Updating name in `package.json`
│ updated `package.json`
│
├ Installing dependencies
│ installed via `npm install`
│
╰ Application created

╭ Configuring your application for Cloudflare Step 2 of 3
│
├ Retrieving current workerd compatibility date 
│ compatibility date 2024-10-04
│
├ Do you want to use git for version control?
│ no git
│
╰ Application configured 

╭ Deploy with Cloudflare Step 3 of 3
│
├ Do you want to deploy your application?
│ no deploy via `npm run deploy`
│
╰ Done 

────────────────────────────────────────────────────────────
🎉  SUCCESS  Application created successfully!

💻 Continue Developing
Change directories: cd canary
Start dev server: npm run start
Deploy: npm run deploy

📖 Explore Documentation
https://developers.cloudflare.com/workers

💬 Join our Community
https://discord.cloudflare.com
────────────────────────────────────────────────────────────
cd canary

わかりやすいようにindex.jsの中身を以下に変えておきます。

index.js
export default {
	async fetch(request, env, ctx) {
		return new Response('Hello World! from main');
	},
};

次にこれをDeployします。

wrangler deploy


この時点ではステージングと本番が同じもの(45980d60-de17-42ef-9a67-26e5ef780183)となっています。

次にコードを以下に変更します。

index.js
export default {
	async fetch(request, env, ctx) {
		return new Response('Hello World! from new');
	},
};

従来であればこの後wrangler deployを行っていましたが、これであれば既存環境を上書きしてしまいます。新しいコマンドとしてuploadを使います。

wrangler versions upload
Delegating to locally-installed wrangler@3.80.0 over global wrangler@2.14.0...
Run `npx wrangler versions upload` to use the local version directly.


 ⛅️ wrangler 3.80.0
-------------------

Total Upload: 23.62 KiB / gzip: 5.76 KiB
Worker Startup Time: 9 ms
Uploaded canary (0.97 sec)
Worker Version ID: 1c407280-6aad-4f79-a807-657da3b8b083
Version Preview URL: https://1c407280-canary.harunobukameda.workers.dev

To deploy this version to production traffic use the command wrangler versions deploy

Changes to non-versioned settings (config properties 'logpush' or 'tail_consumers') take effect after your next deployment using the command wrangler versions deploy

Changes to triggers (routes, custom domains, cron schedules, etc) must be applied with the command wrangler triggers deploy

従来と異なりPreviewURLがhttps://1c407280-canary.harunobukameda.workers.devとして1c407280-6aad-4f79-a807-657da3b8b083バージョンへのアクセスが可能となります。1c407280deploy毎、upoload毎に自動で付与されます。

それぞれのバージョンごとの専用URLがわからくなった場合、マネージメントコンソールから確認してアクセスが可能となっています。

では次にカナリアデプロイを行ってみます。

wrangler versions deploy

現在以下の環境に全てのトランザクションが流れていることが表示されます。

├ Your current deployment has 1 version(s):
│ 
│ (100%) 45980d60-de17-42ef-9a67-26e5ef780183
│       Created:  2024-10-07T06:27:40.470218Z
│           Tag:  -
│       Message:  -

次に選択した新・旧環境を2つ選びます。その後トランザクションの割合を指定します。

├ What percentage of traffic should Worker Version 1 receive?
├ 50% of traffic
├
├ What percentage of traffic should Worker Version 2 receive?
├ 50% of traffic

アクティブ環境が以下の通り
50%/50%になっています。

あとはブラウザでアクセスすれば50%毎に表示が切り替わるはずです。この状態で様子を見て完全移行を行う場合、統一したい環境を1個だけ選択して100%を指定すればOKです。

Discussion