deno deploy で任意ドメインを使ったときのポイント

deno deploy では、.deno.devの前の部分を変更する以外に、任意のドメインを設定できる。

この際に、注意しておくことが有ったのでメモしておく。

参考

設定

誘導に従い A AAAA CNAME レコードを設定する。
(Route53 で設定した。)
Let’s Encrypt の証明書を提供してくれたりと非常に便利である。

気が付いたこと

任意のドメインを設定しても、hogehoge.deno.dev ドメインが生きたままになっている。
なので、設定した任意のドメインとアクセスできる経路が 2 つある状況。
これを対策して、設定したドメインでだけ応答を返すようにしたい。

対策実装

oak -> ミドルウェアを書く

oak ではこのようにできた。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
import "https://deno.land/std@0.150.0/dotenv/load.ts";
import { Application, Router, Context } from "https://deno.land/x/oak/mod.ts";

const router = new Router();
router.get("/", (context: Context) => {
context.response.body = "RETURN";
});

const app = new Application();

// 追加ミドルウェア
// Internal Server Error 扱い
app.use(async (context: Context, next: () => Promise<unknown>) => {
console.log(context.request.headers.get("host"));
if (context.request.headers.get("host") !== Deno.env.get("DOMAIN")) {
throw new Error("disallow domain!");
}
await next();
});

app.use(router.routes());
app.use(router.allowedMethods());

await app.listen({ port: 8080 });

fresh -> ミドルウェアを書く

fresh ではこのようにできた。

routes/_middleware.ts
1
2
3
4
5
6
7
8
import { MiddlewareHandlerContext } from "$fresh/server.ts";
export async function handler(request: Request, ctx: MiddlewareHandlerContext) {
console.log(request.headers.get("host"));
if (request.headers.get("host") !== Deno.env.get("DOMAIN")) {
throw new Error("disallow domain!");
}
return await ctx.next();
}

std/http -> おそらく個別対処

ミドルウェア機能は無いので、個別に実装。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
import "https://deno.land/std@0.150.0/dotenv/load.ts";
import { serve } from "https://deno.land/std@0.150.0/http/server.ts";
import { router } from "https://deno.land/x/rutt/mod.ts";

await serve(
router({
"/": (request: Request) => {
console.log(request.headers.get("host"));
if (request.headers.get("host") !== Deno.env.get("DOMAIN")) {
throw new Error("disallow domain!");
}
return new Response("RETUNE", { status: 200 });
},
}),
{ port: 8080 }
);

それぞれ、console.log(request.headers.get("host")); を残してしまっている。
deno deploy のログで見たいだけなので、別に残さなくてもいい。


というわけで deno deploy でドメイン指定するときのまとめを記載した。
正直これをアプリケーションでフォローするべきなのかは、判断が難しい。
できるなら、管理画面で OFF できるとうれしい。

では。