Cloudflare Workersでサーバレス開発

今回は日頃からいくつものサイト配信で大変お世話になっているCloudflare社が提供するCloudflare Workersを試してみました。

普段はあまりここでサービス紹介系の記事は書かないのですが、いくつかのドメインを運用している都合上、コンテンツ生成に必要なアプリケーションサーバの用意が最近少しずつ大変になってきたので、今回紹介するCloudflare Workersの活用で開発リソース削減を検討するための備忘録として記事にしています。

Cloudflare Workers

Cloudflare WorkersはCloudflareが提供するサーバレスコンピューティング環境です。

AWS LambdaやGoogle Cloud Functionと同様のサービスでFaaS(Function as a Service)と呼ばれることもあります。Cloudflare公式の説明はこちら。

Cloudflareは大規模なCDN事業をやってますから世界中にエッジサーバを持っています(2020/07現在は約200とのこと)。WorkersアプリケーションはCloudflareのグローバルネットワーク上に展開されるので、世界中のどこからアクセスしても低いレイテンシーで実行することができます。

想定利用者

後述しますが、FaaSプロダクトとしては機能面において他社プロダクトに劣っている部分はあるので、高機能で多機能なFaaS環境が必要であれば他社プロダクトを使うはずです。Cloudflare Workersの想定利用者としては既にCloudflareのCDNを使ってコンテンツ配信しているサイト制作者が該当するのではないでしょうか。つまり自身のドメインを持っていてなんらかのサーバ運用もしている技術者にとっては使いやすいサービスなのだと思います。既にCloudflareのCDNでコンテンツ配信やHTTPS対応している人ならば、Cloudflare Workers導入のハードルは低くなっています。

あるいはCloudflareのグローバルネットワーク上で動作するFaaS環境を本気で必要としているサービス提供者でしょうか。AWSとかのパブリッククラウドだと結局はリージョン毎に区切られてリソースが割り当てられているので、どこでも同じパフォーマンスでサービス提供するのは困難です。Cloudflareのエッジにコードを載せることができれば、いつでもどこでも高いパフォーマンスでのサービス提供を実現できます。

無料利用枠

無料利用枠では以下のようなリソースが使えるようです。開発用のサブドメインが無料で使えるのはうれしいですね。
Cloudflare Workers | サーバーレスコンピューティング | Cloudflare

  • 1日あたりリクエスト:10万(UTC+0)
  • 最大30個のスクリプトをリリース
  • すべての200データセンターで実行
  • 無料のworkers.devサブドメイン
  • リクエストあたりのCPU処理時間:10ミリ秒未満
  • 最初のリクエスト後に最小レイテンシー

環境構築

前述の通り、Cloudflare Workersを使ってみようと考える人はCloudflareのCDNサービスを利用済みという前提があるので、アカウント作成などの手順は省略してWorkersアプリケーション構築に必要な情報のみ整理してみます。2020/07現在、利用できるランタイムはJavaScript(Node.JS)/Rust/C/C++の4つです。今回は手軽なJavaScriptでWorkerを作ってみます。

Wranglerのインストール

まずはCloudflare Workersのプロジェクト管理用CLIツール(Cloudflare公式) Wrangler をインストールします。パッケージマネージャーは好きなものを使えば良いです。

wrangler という名前のCloudflareと関係ないモジュールも存在しているので @cloudflare/wrangler と指定します。ちなみにwrangler自体はRustで書かれているようです。

API Tokenの取得

Global API KeyではなくAPI Tokenを使いましょうとwranglerに注意されるので指示通りにAPI Tokenを作ります。以下のページ上部の Create Token ボタンからトークン発行できます。

指示に従ってトークンを作り、wranglerに記憶させておきます。

プロジェクト作成

引き続きwranglerを使ってWorkersプロジェクトを作ります。手動で必要なファイル群を揃えることはもちろんできますが、generateサブコマンドを使えばプロジェクト一式を生成できるので活用しましょう。

まずアカウントIDを設定ファイル wrangler.toml に書いておく必要があるとのことなので、アカウントIDを確認します。これはCloudflareのダッシュボードページに行かなくても wrangler コマンドから取得できます。

whoamiサブコマンドで表示されるAccount IDを wrangler.toml 内に書いておきます。

zone_idは開発環境では指定必須ではありません。ここでは後回しにします。

実装

generateサブコマンドではテンプレートを指定することができますが、何も指定しない場合は以下のようなhello worldのプログラムが出力されます。

Cloudflare Workersは独自のランタイム/API仕様ではなくService Workers仕様で動作するので、Service WorkersのAPI仕様に則ってアプリケーションを実装することができます。

また、workerテンプレートのギャラリーサイトがあるので眺めてみると良いです。もちろんJavaScriptだけでなくRustなど他言語のテンプレートも揃っています。

動作確認

devサブコマンドでローカルサーバを起動できます。今回は静的なレスポンスを返すだけなので確認も簡単です。

127.0.0.1:8787で起動するようです、curlで確認しましょう。

Hello worker! と出力されたので問題なさそうです。

デプロイ

workers.dev

まずはこのhello worldプログラムを開発環境 workers.dev にデプロイしてみます。既にアプリケーションIDは前述の手順で設定済みなのであとは公開するだけです。publishサブコマンドを使います。

{プロジェクト名}.{アカウント名}.workers.dev のドメインで開発環境でのアプリケーションが公開されるようです。ブラウザでアクセスすると、Hello worker! と表示されるはずです。

また、Cloudflareのダッシュボードページにも登録・公開したworkerがリストされます。(僕のブラウザではダークモード表示してるので黒いですが実際は白いサイトです)

production 本番環境

次はproduction環境にデプロイしてみましょう。自身のドメインで公開されますので、既にCloudflareにドメイン設定している前提となります。production環境へのデプロイには別途Zone IDが必要ですが、こちらはwranglerコマンドでは取得できない(?ようなので、仕方なくダッシュボードページでZone IDを調べます。Overviewタブのページ右下のAPIのセクションにZone IDとAccount IDが表示されているので控えておいて wrangler.toml に書いておきます。以下の例のようにproduction環境用のセクションを追加してそこにZone IDとルーティングのパターンを書くだけです。routeにはもちろん自身のドメイン下のパスを指定します。

公開するにはpublishサブコマンドのオプションでproduction指定するだけです。

指定したrouteにアクセスして Hello worker! が表示されればOKです。

おわりに

workers.dev環境で動かしているとイマイチ面白くないのですが、やっぱり自分のドメイン上で動くのを見るとサーバレスの良さを実感しますね。オリジンにコードもランタイムも置かなくていいのは助かります。

一方で冒頭でも少し述べたように、単なるFaaS環境としてみると機能面では他社プロダクトより劣っている部分はあります。設定できる項目は2020/07現在だと環境変数とWorkers KVの名前空間だけですし(Workers KVは今回の記事では紹介対象外)、収集されるメトリクス情報もリクエスト数やエラー数、CPU時間くらいです。

また、今回試したプロジェクト一式はGitHubにも一応上げてありますので興味があれば。今後もCloudflare Worker関連のソースコードは適宜こちらのレポジトリに上げていく予定です。

今回はJavaScriptでworkerを作ってみましたが、次はRust(Rust-generated WebAssembly)でも作ってみたいですね。Wrangler本体もRust製ですしCloudflare社内でも積極採用されてるのでしょうか。公式ブログでもRustカテゴリの記事がいろいろあります。

Cloudflareのリリースアナウンスのブログにもあるように、リージョンなどに縛られること無く、コードがグローバルネットワーク上のどこでも動くことこそがクラウドコンピューティングの夢であると。前述の通り、現時点では機能面で不足があるかもしれませんが、Cloudflareの巨大なグローバルネットワーク上でサーバレスアプリケーションを公開できることが最大のメリットなのだと思います。今後の発展に期待ですね。

We believe the true dream of cloud computing is that your code lives in the network itself. Your code doesn’t run in “us-west-4” or “South Central Asia (Mumbai)”, it runs everywhere.

* Everyone can now run JavaScript on Cloudflare with Workers

あわせて読む:

コメントを残す

メールアドレスが公開されることはありません。