🧪

TypeScript だけで Cloudflare/AWS のインフラを書ける IaC「Alchemy」が面白い

に公開

はじめに

こんにちは。@caru_iniです。

最近、フルスタックのボイラープレートを漁っていたときに発見して、かなり面白いなと思ったのが Alchemy です。

公式サイトでは "Infrastructure as TypeScript" を掲げていて、Cloudflare を中心に、AWS なども TypeScript から扱えるようになっています。2026-03-12 時点で GitHub の alchemy-run/alchemy⭐️1.9k / 247 releases まで伸びていて、勢いもかなりあります。(執筆日にもReleaseされてる!!)

この記事では、Alchemy が何なのか、何が面白いのか、そして最後に Cloudflare Worker を 5 分で試す短いハンズオン でまとめていきたいと思います!

Alchemyとは

Alchemy は、純粋な TypeScript で書かれた IaC ライブラリです。
alchemy.run.ts のようなスクリプトの中でリソースを定義し、そのコードを実行すると Cloudflare や AWS 上のリソースが作成・更新・削除されます。

たとえば、Cloudflare Worker ならこんな感じです。

alchemy.run.ts
import alchemy from "alchemy";
import { Worker } from "alchemy/cloudflare";

const app = await alchemy("my-first-app");

const worker = await Worker("hello-worker", {
  entrypoint: "./src/worker.ts",
  url: true,
});

console.log(worker.url);

await app.finalize();

Terraform や CloudFormation のように別言語へ変換する感じではなく、TypeScript そのものが実行系にかなり近いのが特徴です。

公式サイト:

https://alchemy.run/

何が面白い?

1. TypeScript が薄いラッパーではなく本体っぽい

Alchemy の面白さは、TypeScript を書いている感覚がかなり素直なところです。

公式ブログでも、Pulumi / Terraform / CloudFormation などと違って、Alchemy は pure TypeScript / ESM-native で実装されていることを強く押し出しています。
要するに、TypeScript 用の薄いラッパーを書いているのではなく、TypeScript 自体が主役です。

IaC を触っていて、

  • 型はあるけど結局別プロセスが動いている
  • 値をその場で使いたいのに特殊な抽象が必要
  • 仕組みを理解する前にツールチェーンの癖を覚える必要がある

みたいな重さを感じたことがある人には、刺さりやすいと思います!

2. リソースが async function なのがわかりやすい

Alchemy ではリソースが async function ベースです。

const worker = await Worker("api", {
  entrypoint: "./src/worker.ts",
});

console.log(worker.url);

この書き味がかなり良いです。
リソースを await したら、そのまま使える値が返るので、アプリケーションコードに近い感覚で読めます。

IaC にありがちな、確定していない値を別の抽象で扱う系の認知負荷が、かなり少なく感じられます。

3. state がローカル JSON で見える

Alchemy は state をローカルの JSON ファイルとして持てます。

これは地味ですがかなり良くて、

  • 何が保存されているか読める
  • トラブル時に状態を追いやすい
  • Secretを暗号化して保存できる
  • Git 管理に向いている

というメリットがあります。

IaC の state はブラックボックス化しやすいので、何が起きているか見えるのはかなり安心感があります。

4. Cloudflare との相性がかなり良い

Alchemy は Cloudflare 側の導線がかなり充実しています。

  • Worker
  • D1
  • KV
  • R2
  • Durable Objects
  • Queues
  • Workflows
  • AI Gateway

あたりがまとまっていて、ローカル開発モードでは hot reload やローカルエミュレーションも用意されています。

さらに、Vite / Astro / SvelteKit / Nuxt / React Router / TanStack Start など向けのガイドやプラグインもあり、Cloudflare Workers を前提にフルスタック構成を作る ときの相性がかなり良さそうでした。

個人的には、wrangler.tomlwrangler.jsonc、各種 binding の設定をあちこちのファイルで管理するのに疲れてきた人にも相性が良いと思っています。
Worker 本体とインフラ定義をどちらも TypeScript 側へ寄せやすいので、Cloudflare 特有の設定が増えてきたときほど嬉しさが出そうです。

まずは Cloudflare で試すのが良さそうだと思います!

5. 自作 Resource まで見据えた思想がある

Alchemy は「既存プロバイダーを使う」だけでなく、自分で Resource を実装する 使い方もできます。

何なら公式ガイドでは、AIを活用して自分で作る方法が推奨されています。

これは好みが分かれる部分ですが、個人的にはかなり好きです。
実際に使っていくと、微妙に足りない...!ということがよく起きるので、無いなら作ってしまえ というのは面白いですね。

ソース:

https://alchemy.run/guides/custom-resources/

どんな人に向いていそうか

特に向いていそうなのは、こんな人です。

  • Cloudflare Workers 周辺を TypeScript でまとめて管理したい人
  • wrangler の設定ファイル管理がだんだんつらくなってきた人
  • Terraform より軽い書き味の IaC を探している人
  • アプリコードとインフラコードの距離を縮めたい人
  • state の中身を自分で追いたい人
  • 必要なら独自 Resource まで作りたい人

逆に、既存 Terraform モジュールの巨大な資産をそのまま流用したい場合は、まずは別の選択肢のほうが自然かもしれません。

ハンズオン: Cloudflare Worker を動かす

ここからは、公式 Getting Started に沿って最小構成で触ってみます。

前提

  • Bun が入っている
  • Cloudflare アカウントがある

無料アカウントでも試せます。

1. プロジェクトを作る

bun init -y
bun add alchemy

2. Cloudflare 用のプロフィールを設定してログインする

bun alchemy configure

login

OAuthを選択すると、ブラウザでログインするだけで設定できます。
Cloudflare を複数アカウントで使っている人は、ここで profile を分けておくと後が楽です。

2-a. スクリプト側で機密情報を管理したい場合

APIトークンを.envt3-envで管理したい場合は、CloudflareのダッシュボードからAPIキーを入手し、サービス(Worker())などの第二引数に入力します。

コード例
alchemy.run.ts
const app = await alchemy("hello-alchemy",{
    password: process.env.SECRET_PASSPHRASE, // Secretの暗号化キー
});

const worker = await Worker("hello-worker", {
  entrypoint: "./src/worker.ts",
  url: true,
  apiToken: alchemy.secret(process.env.CLOUDFLARE_API_TOKEN),
});

3. alchemy.run.ts を作る

alchemy.run.ts
import alchemy from "alchemy";
import { Worker } from "alchemy/cloudflare";

const app = await alchemy("hello-alchemy");

const worker = await Worker("hello-worker", {
  entrypoint: "./src/worker.ts",
  url: true,
});

console.log(`Worker URL: ${worker.url}`);

await app.finalize();

4. Worker 本体を作る

src/worker.ts
export default {
  async fetch(request: Request): Promise<Response> {
    const url = new URL(request.url);

    return Response.json({
      message: "Hello from Alchemy!",
      path: url.pathname,
      timestamp: new Date().toISOString(),
    });
  },
};

5. ローカルで動かす

bun alchemy dev

これでローカル URL が表示され、コードを保存すると自動で反映されます。
まずは message を変えてみるだけでも、Alchemy の軽さが伝わると思います!

6. デプロイする

bun alchemy deploy

デプロイ後は Cloudflare 側の URL が出るので、そのままアクセスすれば OK です。

不要になったら削除もできます。

bun alchemy destroy

使う前に知っておきたいこと

Alchemy はかなり勢いのある OSS で、2026-03-11 にも新しいリリースが出ています。
そのぶん、良くも悪くも変化が速いです。

また、公式ドキュメント上では development mode が beta になっています。
個人開発や検証にはかなり楽しそうですが、業務で本格採用するなら、もう少し様子を見たほうがいいかもしれません。

  • どの provider を使うか
  • state をどこに置くか
  • チーム運用で stage / profile をどう分けるか

あたりは最初に決めたほうがよさそうです。

個人的に使いたいリソース

まとめ

Alchemy は、単に「TypeScript でインフラを書ける」だけでなく、IaC の重さそのものをかなり薄くしようとしている のが面白いと感じました。

特に、

  • async function ベースの軽い書き味
  • 見える state
  • Cloudflare まわりの厚いサポート

この 3 つがかなり魅力的です。

Cloudflare Workers をよく使う人なら、一度触ってみる価値は十分あると思います。
気になった方は、まず Getting Started から試してみてください。

https://github.com/alchemy-run/alchemy

https://alchemy.run/getting-started/

https://alchemy.run/blog/2025-07-01-how-alchemy-is-different/

GitHubで編集を提案

Discussion