概要
JavaScript ランタイムで動かせる、フロントエンドのないシンプルな Web アプリケーション フレームワーク。
Web API 構築ができるため、個人的に javascript 版 FastAPI だと思っている。
特徴
- 超高速
- 軽量
- 5つの Router から最適なルーティングを選択できる
- Web 標準の採用により、様々なプラットフォーム (Cloudflare Workers, Fastly Compute, Deno, Bun, Vercel, Netlify, AWS Lambda, Lambda@Edge, Node.js) での動作が可能
- 多くのミドルウェアやヘルパーが用意されている
- typescript がデフォルト
チュートリアル
Bun チュートリアル
とりあえず Bun でチュートリアル。
※ Volta だと Bun が管理できなかったので、Proto をバージョン管理ツールとして使用。
AWS Lambda チュートリアル
Lambdalith の構成
各エンドポイントごとに Lambda を持つのではなく、1つの Lambda 関数で全エンドポイントを処理する構成。Hono はこの構成を作るのに便利な Web フレームワークの1つ。
今回は API Gateway 導入するほどでもないので、Lmabda Function URL を使用する。また、IaC は cdk とする。
実践
※ cdktf の CloudFormation テンプレート保存のための S3 課金 + Lambda 実行時の課金があることに注意(最後に完全削除する)。
※ docker (cdk で Lambda 関数をコンテナイメージとしてデプロイしようとする), npm (cdk 実行に必要) を予め準備しておくこと。
※ aws-cdk は内部で node を使用しているため、 bun のみでは動かせない。bun はあくまで typescript の実行環境として使用する。
1. Hono 公式の AWS Lambda での Setup に沿って、cdk の環境構築をする。
$ mkdir lambda-function-api
$ cd lambda-function-api
$ npx cdk init app -l typescript
$ bun add hono
$ mkdir lambda
$ touch lambda/index.ts
2. lambda/index.ts
を記述する。
import { Hono } from 'hono'
import { handle } from 'hono/aws-lambda'
const app = new Hono()
app.get('/', (c) => c.text('Hello Hono!'))
export const handler = handle(app)
3. lib/lambda-function-stack.ts
を記述する。
※ 今回は Lambda Function URL を使用するため、API Gateway の cdk は不要。
NodejsFunction (デプロイ時に docker が必要)
import * as cdk from 'aws-cdk-lib'
import { Construct } from 'constructs'
import * as lambda from 'aws-cdk-lib/aws-lambda'
// Node.js ランタイムの Lambda を構築。フォルダ指定が必要な lambda.Function とは違い、単一ファイルの指定が可能。
import { NodejsFunction } from 'aws-cdk-lib/aws-lambda-nodejs'
export class MyAppStack extends cdk.Stack {
constructor(scope: Construct, id: string, props?: cdk.StackProps) {
super(scope, id, props)
// Lambda 関数を作成
const fn = new NodejsFunction(this, 'lambda', {
entry: 'lambda/index.ts',
handler: 'handler',
runtime: lambda.Runtime.NODEJS_20_X,
})
// 関数 URL を IAM 認証で設定
fn.addFunctionUrl({
authType: lambda.FunctionUrlAuthType.NONE,
})
}
}
4. デプロイする。
※ bootstrap で作成されるものは、 cdk 実行に必要な IAM や CloudFormation テンプレート保存に必要な S3 など。「CloudFormation > CDKToolkit」に実際に作成されるものが記載されている。
# cdk が初めての場合は下記コマンドの実行が必要
# $ npm run cdk bootstrap
# 差分確認
$ npm run cdk diff
# Resources
# [+] AWS::IAM::Role lambda/ServiceRole lambdaServiceRole*****
# [+] AWS::Lambda::Function lambda lambda*****
# [+] AWS::Lambda::Url lambda/FunctionUrl lambdaFunctionUrl*****
# デプロイ
$ npm run cdk deploy
5. Postman で 関数 URL を叩いてみる
IAM 認証しているため、「Authorization > AWS Signature」で下記を設定してから叩く。
- AccessKey
- SecretKey
- AWS Region:Lambda 関数 URL があるリージョン
- Service Name:lambda
下記が Response として返ってきたら成功。
Hello Hono!
6. (おまけ)課金がもったいないので、cdk ごと削除する
今回作ったリソースを cdk で削除する。
$ npm run cdk destroy
下記手順で cdk 自体を削除する。
- 「CloudFormation > スタック > CDKToolkit」を削除。
- スタックに紐づくリソースが削除される。
- 上記スタックに紐ついている S3 は消えないので、手動で削除。
※ cdk 再構築時は、cdk bootstrap
コマンドを叩けば良い。