0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Hono を触ってみた

Last updated at Posted at 2025-03-31

概要

JavaScript ランタイムで動かせる、フロントエンドのないシンプルな Web アプリケーション フレームワーク。
Web API 構築ができるため、個人的に javascript 版 FastAPI だと思っている。

特徴

  1. 超高速
  2. 軽量
  3. 5つの Router から最適なルーティングを選択できる
  4. Web 標準の採用により、様々なプラットフォーム (Cloudflare Workers, Fastly Compute, Deno, Bun, Vercel, Netlify, AWS Lambda, Lambda@Edge, Node.js) での動作が可能
  5. 多くのミドルウェアやヘルパーが用意されている
  6. 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 自体を削除する。

  1. 「CloudFormation > スタック > CDKToolkit」を削除。
    • スタックに紐づくリソースが削除される。
  2. 上記スタックに紐ついている S3 は消えないので、手動で削除。

※ cdk 再構築時は、cdk bootstrap コマンドを叩けば良い。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?