2022-03-29 Fastly User Meetup #4
Yusuke Wada
テックブログやってます。
TravelBook Tech Blog
https://tech.travelbook.co.jp/
「Compute@EdgeはVCLに置き換わるのか?」
今回、Compute@EdgeはJavaScriptによる実装を前提としています
全て個人の見解です!(間違っているところあると思います)
CDNのエッジで実行する系が面白い - ゆーすけべー日記 https://yusukebe.com/posts/2021/functions-at-edge/
JavaScriptにおいては、どちらもService Worker互換
使ってみて
Supporting Remix with full stack Cloudflare Pages https://blog.cloudflare.com/remix-on-cloudflare-pages/
DOOMのようなアプリケーション寄りのデモもあるが…
DOOM | Fastly Developer Hub https://developer.fastly.com/solutions/demos/doom/
Fastly Compute@Edgeは「CDNに強い」
Fastly vs Cloudflare
CDNに強い?
=> バックエンドを活かす
Varnish Configuration Language
あくまでVarnish(キャッシュサーバ)の設定言語
VCLでできることはCompute@Edgeでできるのではないか?
Code over Configuration
「Edge Functions – Vercel」のページより
Migrate from VCL | Fastly Developer Hub https://developer.fastly.com/learning/compute/migrate/
2022/03/16
How we migrated developer.fastly.com from VCL to Compute@Edge | Fastly
https://www.fastly.com/blog/how-we-migrated-developer-fastly-com-from-vcl-to-compute-edge
Compute@Edgeでできること
Configuration
Request
Backends
Response
Controlling the cache
トラベルブックがやってること1
トラベルブックがやってること2
h3.alt_svc()
自分でヘッダに足す
set beresp.gzip = true
X-Compress-Hint | Fastly Developer Hub https://developer.fastly.com/reference/http/http-headers/X-Compress-Hint/
client.ip ~ ${ip_block_acl_name}
Fastly-Debug:1
ヘッダが効かない => 自分でやれ?h2.early_hints
Fastly Compute@Edgeについて分かったこと – TravelBook Tech Blog
https://tech.travelbook.co.jp/posts/fastly-compute-at-edge/
ほぼ全ての機能をCompute@Edgeがカバー
例
Link
ヘッダをつけるsxg-rs/fastly_compute at main · google/sxg-rs https://github.com/google/sxg-rs/tree/main/fastly_compute
(あらためて)JavaScriptで書ける!!
set obj.status = 200;
synthetic "Hello world";
return(deliver);
const handleRequest = async (request) => {
return new Response("Compute@Edge!")
}
addEventListener("fetch", event => {
event.respondWith(handleRequest(event.request))
})
Codeである意味
Fetch API - Web API | MDN https://developer.mozilla.org/ja/docs/Web/API/Fetch_API
const path = new URL(req.url).pathname // Request, URL
const ua = req.headers.get('User-Agent') // Headers
res.headers.append('X-Debug', `${path} - ${ua}`) // Response
@fastly/js-compute
@fastly/js-compute - v0.2.4 | @fastly/js-compute - v0.2.4 https://js-compute-reference-docs.edgecompute.app/
TypeScriptでも書ける
TS => JS => Wasm
Codeである意味
Service Worker互換なので「Cloudflare Workers向け」を謳っているものも使える
Hono[炎] - Ultrafast web framework for Cloudflare Workers ( and Fastly Compute@Edge ).
yusukebe/hono: Hono[炎] - Ultrafast web framework for Cloudflare Workers.
https://github.com/yusukebe/hono
import { Hono } from 'hono'
export const app = new Hono()
app.get('/', (c) => c.text('Compute@Edge!!!'))
app.use('*', async (c, next) => {
const ua = c.req.header('User-Agent') || ''
await next()
if (ua.match(/MalBot/)) {
c.res = c.text('Forbidden', 403)
}
})
app.use(
'/auth/*',
basicAuth({
username: 'compute',
password: 'edge',
hashFunction: (m: string) => SHA256(m).toString(),
})
)
app.get('/auth/*', (c) => c.text('You are authorized!'))
app.get('/backend', (c) => {
const backendResponse = fetch(c.req as Request, {
backend: 'origin_a',
})
return backendResponse
})
さらに、同じコードがCloudflare Workersで動くこともある
Codeである意味
Fastly CLI / Viceroy
開発からデプロイまで
$ fastly compute serve
$ fastly compute deploy
Codeである意味
test('GET /', async () => {
const res = await app.request('/')
expect(res.status).toBe(200)
})
test('Access control for a Bot', async () => {
const req = new Request('/')
req.headers.set('User-Agent', 'MalBot/0.01')
const res = await app.request(req)
expect(res.status).toBe(403)
})
例: GitHub Actionsからデプロイする
fastly/compute-actions: GitHub Actions for building on Compute@Edge.
https://github.com/fastly/compute-actions
(日経新聞さんはVCLをCI/CDしている!)
バックエンドのユニットテストができない
Viceroyレベルでテストしなくてはいけない = E2Eっぽいテストになる
fetch
するconst url = new URL('http://127.0.0.1:7676/')
test('GET "/"', async () => {
url.pathname = '/'
const res = await fetch(url.toString())
expect(res.status).toBe(200)
})
test('GET "/banana"', async () => {
url.pathname = '/banana'
const res = await fetch(url.toString())
expect(res.status).toBe(404)
})
Jest Environment · Miniflare https://miniflare.dev/testing/jest
// jest.config.js
export default {
testEnvironment: "miniflare",
testEnvironmentOptions: {
bindings: { KEY: "value" },
kvNamespaces: ["TEST_NAMESPACE"],
}
}
Synthetic Response
VCLはローカルで動かせないので、オンラインのホストを叩く
https://vcl.freetls.fastly.net/
https://is-js-fast.edgecompute.app/
https://is-rust-fast.edgecompute.app/
ネットワーク以外でも差が出てしまう
(この場合はVCLのホストが遅い)
なるべく純粋な「反応速度」
Timing web requests with cURL and Chrome https://blog.cloudflare.com/a-question-of-timing/
同じネットワーク環境でかつ
curl
の「time_starttransfer - time_appconnect
」で比べる
では計測
何回計測しても順位は変わらず
結構差がついた
kwhitley/itty-router: A little router.
https://github.com/kwhitley/itty-router
論理的にはHonoの方が格段に速い
オンラインだと差が出にくいので、ローカルサーバーを叩く
Compute@Edge同士ならややルーターで差が出る
=> Compute@Edgeが速くなって、Wasmにした時でもRustと同等になって、速いルーターを使えばよい
以上、Compute@Edgeについて
「Compute@EdgeはVCLに置き換わるのか?」
いわくら「(VCLだとプロパティ・関数の名称を)いちいち調べてる」
わだ「Compute@EdgeだとVSCodeで補完が効く」
いわくら「!!!!」
(パフォーマンスがVCLに近づけば)
「Compute@EdgeはVCLに置き換わる」
そして【VCL以上】の体験を手に入れる
正式リリースに期待!
おしまい
トラベルブックではエンジニア募集中!
Fastlyガンガン使ってます
Compute@Edgeも導入するかもしれません!
TravelBook Tech Blog