3
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?

AWS Lambda Web FunctionsをHonoで使ってみる

3
Last updated at Posted at 2026-10-13

AWS Community Builder Serverlessカテゴリの @Kanahiro です。

Lambdaでコンテナを動かすことに心血を注いでいます。

AWS Lambda と Web Functions

AWS Lambda Web Functionsは、2026-10-12にリリースされたAWS Lambdaの新形態です。

以後、従来のLambda関数は"Event Function"と呼ばれるようです。Lambda関数は何らかのイベントをトリガーとして実行されるのでした。典型的サーバーレスアーキテクチャでは、API Gatewayを前段に設置し、HTTPリクエストを受けた際にLambda関数を実行します。

ただしここ3年くらいで、Lambda Web Adapterを利用してコンテナイメージをそのまま利用することが出来るようになったり…

HonoというWebフレームワークでは、Adapterという仕組みでLambda専用の実装ではなく汎用的なサーバー実装をLambda Hanlder向けに置き換えることでLambdaで動かしたり…

またLambda Function URLsの存在もあり、LambdaだけでHTTPリクエストを捌くというとてもシンプルな構成が可能となっているわけです。

そんなパターンが一般的になってきた2026年終盤に、Web Functionsというものがローンチされました。

Web Functionsのうれしさを読み解く

ドキュメントとマネジメントコンソールからわかるうれしいことを列挙します

  • ふつうのHTTPサーバーが動く:Event HandlerやAdapter層がなくとも動作する
  • 並列実行:従来のLambdaはひとつの関数は同時に1リクエストしか捌けなかったが、Web Functionsでは128リクエストまでを同時に捌ける。I/O待ちの多いHTTPサーバーにとって嬉しい。
  • マルチリージョン構成:マネコン上の簡単な操作でマルチリージョン構成になる。

実際に試してみる

マネジメントコンソールからWeb Functionsを作成してみます。

image.png
ウェブ関数。従来の関数はEvent Functionsと名付けられた。

image.png
なんとマルチリージョンを選択できる。また認証タイプは「IAM認証」の他に「アプリケーションマネージド認証」というかっこいい名前の何かがあるが、これは認証なし=アプリ側に責任があることを意味する

Honoで、@hono/node-serverのみを利用してHTTPサーバーを実装しておきます。コードは以下です。

以下のふたつのエンドポイントがあります:

  • 単純なGETリクエスト
  • 並列実行・OACの挙動を確かめるためのPOSTリクエスト
curl https://2pddty25x7j2kxz9.lambda-web.global.on.aws/
# {"message":"Hello from Hono on Lambda Web Functions!","region":"ap-northeast-1"}

タイプが「マルチリージョン」の場合、エンドポイントがこのようにglobalとなるようです。ホームリージョンならap-northeast-1など。リージョンごとだとこれがリージョンごとに複数生えます。これは素晴らしい、つまりマルチリージョンにしておくとグローバルに利用できるエンドポイントが生えて自動的に冗長化されると。

Screenshot 2026-10-13 at 9.16.39.png「リージョンごと」だとこうなる

CloudFront OAC

OACもマネジメントコンソールで簡単に設定できるようです。LambdaをIAM認証にして生URLへのアクセスが拒否されることを確認します。

curl https://2pddty25x7j2kxz9.lambda-web.global.on.aws/
<!DOCTYPE html>
<html>
<head>
    <title>HTTP Error 403</title>
</head>
<body>
    <h1>403 Forbidden</h1>
    <p>You are not authorized to access this endpoint.</p>
    <p>Request ID: MMWRMXRMVRLOTOPLE3BOLDUY5E</p>
</body>
</html>

CloudFrontを作成します

Screenshot 2026-10-13 at 9.19.01.pngAllow private Lambda function access to CloudFrontにチェックをつける

次にLambda側にCloudFrontを許可する設定を追加します。リソースベースポリシーを以下のように記述します。

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "AllowCloudFrontOACAccess",
      "Effect": "Allow",
      "Principal": {
        "Service": "cloudfront.amazonaws.com"
      },
      "Action": "lambda:InvokeWebFunctionEndpoint",
      "Resource": "arn:aws:lambda:ap-northeast-1:123456789012:web-function/my-web-function/endpoint/my-web-function",
      "Condition": {
        "StringEquals": {
          "aws:SourceArn": "arn:aws:cloudfront::123456789012:distribution/ABCDEF12345678"
        }
      }
    }
  ]
}

ResourceはエンドポイントのARN

CloudFrontのエンドポイントを叩く

# CloudFront経由なら疎通する!
curl https://d2pxk0jt3k7zln.cloudfront.net/
{"message":"Hello from Hono on Lambda Web Functions!","region":"ap-northeast-1"}

OAC下のPOSTリクエストと並列実行

従来、Funtion URLs + OAC下では、POSTリクエストには署名済みのヘッダーが必要で不便でした。Web Functionsでは…。

curl -X POST 'https://d2pxk0jt3k7zln.cloudfront.net/probe' \ 
  -H 'Content-Type: application/json' \
  --data '{"id":"oac-post-test","delayMs":0}'
{"id":"oac-post-test","environmentId":"34d143ca-0028-4cc8-9605-77c6c1870eb5","activeAtStart":1,"startedAt":1791852741914,"finishedAt":1791852741915}

特殊なヘッダーなしに、OAC下でPOSTリクエストが通りました。
また、このエンドポイントは並列実行を検証するものなので、以下のコマンドを実行してみます(同時に10本リクエストを投げる)

curl --parallel --parallel-max 10 -sS \
  -H 'Content-Type: application/json' \
  --data '{"id":"parallel","delayMs":1000}' \
  -w '\n\n' \
  'https://d2pxk0jt3k7zln.cloudfront.net/probe?request=[1-8]'

{"id":"parallel","environmentId":"949c719e-6aec-4a76-931c-a2e930e2ea08","activeAtStart":3,"startedAt":1791853838122,"finishedAt":1791853839124}
{"id":"parallel","environmentId":"949c719e-6aec-4a76-931c-a2e930e2ea08","activeAtStart":1,"startedAt":1791853838121,"finishedAt":1791853839123}
{"id":"parallel","environmentId":"949c719e-6aec-4a76-931c-a2e930e2ea08","activeAtStart":2,"startedAt":1791853838122,"finishedAt":1791853839123}
{"id":"parallel","environmentId":"949c719e-6aec-4a76-931c-a2e930e2ea08","activeAtStart":4,"startedAt":1791853838122,"finishedAt":1791853839124}
{"id":"parallel","environmentId":"949c719e-6aec-4a76-931c-a2e930e2ea08","activeAtStart":5,"startedAt":1791853838127,"finishedAt":1791853839126}
{"id":"parallel","environmentId":"b01bc7f0-3677-48ea-b69e-a0fc6dc1f9bc","activeAtStart":1,"startedAt":1791853838412,"finishedAt":1791853839413}
{"id":"parallel","environmentId":"b01bc7f0-3677-48ea-b69e-a0fc6dc1f9bc","activeAtStart":2,"startedAt":1791853838412,"finishedAt":1791853839422}
{"id":"parallel","environmentId":"b01bc7f0-3677-48ea-b69e-a0fc6dc1f9bc","activeAtStart":3,"startedAt":1791853838413,"finishedAt":1791853839422}

activeAtStartの値が1より大きい場合、並列実行していると解釈できます。つまり、このLambda関数はひとつのリクエストを受けている最中に他のリクエストを受けることができています。普通のサーバーみたいですね、素晴らしい!

終わりに

イベント駆動型のサービスであったLambdaは、API Gateway、Function URLsやLambda Web AdapterなどによりHTTPサーバーとして進歩してきましたが、ついに来るところまで来たという感じですね、顧客がほんとうに欲しかったものという感じです。個人的にはコンテナイメージがサポートされたら理想的なサービスです!

3
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
3
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?