Serverless Operations, inc

>_cd /blog/id_zk3qigvmd_6

title

AWS Lambda Web AdaptorがGAしたので触ってみる

AWS Lambda Web Adapter は、開発者が使い慣れたWebフレームワーク(Express.js、Next.js、Flask、SpringBoot、ASP.NET、Laravelなど、HTTP 1.1/1.0に対応するものであれば何でも)を使ってWebアプリを構築し、それをそのままAWS Lambda上で動かすためのツールです。

ひとことで言えば、「普通のWebアプリをコードを変えずにサーバーレス化できるアダプター」です。

従来、ExpressやFlaskなどのWebフレームワークをLambdaで動かすには、Lambda専用のハンドラー形式にコードを書き直す必要がありました。Lambda Web Adapterはその橋渡しを自動で行ってくれます。

同じDockerイメージが、AWS Lambda・Amazon EC2・AWS Fargate・ローカルPC のいずれでも動作します。

主な機能

主な機能として、Amazon API Gateway(REST API・HTTP API)、Lambda Function URLs、Application Load Balancerへの対応、Lambdaマネージドランタイム・カスタムランタイム・Docker OCIイメージのサポート、Lambda Managed Instancesによる並行リクエスト処理、バイナリレスポンスの自動エンコード、グレースフルシャットダウン、レスポンスのgzip/br圧縮、レスポンスストリーミング、テナントID伝播によるマルチテナンシー対応、そしてHTTP以外のイベントトリガーへの対応などがあり、非常に多機能です。

v1.0.0

AWS公式のOSSプロジェクトとして、Amazon Web Services(AWS) が開発・メンテナンスしています。2026年3月27日に最新版の v1.0.0 が公開されGAとなっています。

単なるバージョン番号の更新ではなくマルチテナンシーサポート、Lambda Managed Instancesによる並行処理、ゼロコピーボディ変換によるパフォーマンス改善など、本番運用を意識した機能が一気に揃いました。

さっそくやってみる

では AWS Lambda Web Adaptor を用いて、Node + Expressを使って簡単なWebを起動する手順を見ていきます。

実行にはNode環境の他に以下2つが必要なります。

AWS CLI に設定するIAMユーザーのパーミッションは以下で作業を行っています。

CloudFormation

SAM はデプロイ時に内部で CloudFormation を使ってリソースを管理します。スタックの作成・更新・削除、そして各リソースのステータス監視に必要です。

S3

デプロイ前に sam build で生成したコード(ZipパッケージやSAMテンプレート)をS3バケットにアップロードします。CloudFormation はそのS3上のファイルを参照してLambdaをデプロイするため、読み書き権限が必要です。

IAM

LambdaがCloudWatchにログを書き込むための 実行ロール(IAM Role) を、SAMがデプロイ時に自動で作成します。この「ロールを作る」操作に iam:CreateRole などの権限が必要です。今回のエラーもまさにここで詰まりました。

API Gateway

template.yamlType: HttpApi を定義したため、SAMがAPI Gatewayのエンドポイントを自動作成します。外部からLambdaをHTTPで呼び出せるURLを払い出すために必要です。

まず以下のコマンドでプロジェクトを初期化します。

npm init -y 
npm install express

次に4つのファイルを作成します。このさい必ず改行コードはLFで保存してください。Windowsの場合デフォルトではCRLFとなりますが、VSCodeであれば画面右下をクリックすることで変更可能です。

準備するファイルは3つです。

app.js : Web本体です。

bootstrap :Lambdaのカスタムランタイムには、エントリーポイントとして bootstrap という名前のファイルを置くという仕様があります。Lambda環境が起動時にこのファイルを探して実行する仕組みになっており、ファイル名は bootstrap 固定です。

template.yaml :AWS SAM(Serverless Application Model)の設定ファイルで、「どんなAWSリソースをどのように作るか」をコードで定義するファイルです。いわゆる Infrastructure as Code(IaC) の考え方で、AWSコンソールを手動でポチポチ操作する代わりに、このファイル1つでLambda・API Gateway・IAMロールといったリソースをまとめて自動作成できます。

const express = require('express');
const app = express();

app.use(express.json());

app.get('/', (req, res) => {
  res.json({ message: 'Hello from Lambda Web Adapter!' });
});

app.get('/health', (req, res) => {
  res.json({ status: 'ok' });
});

const port = process.env.PORT || 8080;
app.listen(port, () => {
  console.log(`Server running on port ${port}`);
});
#!/bin/bash
exec node app.js
AWSTemplateFormatVersion: '2010-09-09'
Transform: AWS::Serverless-2016-10-31

Globals:
  Function:
    Timeout: 30

Resources:
  ExpressFunction:
    Type: AWS::Serverless::Function
    Properties:
      CodeUri: ./
      Handler: bootstrap
      Runtime: nodejs20.x
      MemorySize: 512
      Environment:
        Variables:
          AWS_LAMBDA_EXEC_WRAPPER: /opt/bootstrap
          AWS_LWA_PORT: "8080"
      Layers:
        - !Sub arn:aws:lambda:${AWS::Region}:753240598075:layer:LambdaAdapterLayerX86:27
      Events:
        Api:
          Type: HttpApi
          Properties:
            Path: /{proxy+}
            Method: ANY
        Root:
          Type: HttpApi
          Properties:
            Path: /
            Method: ANY

Outputs:
  ApiUrl:
    Value: !Sub https://${ServerlessHttpApi}.execute-api.${AWS::Region}.amazonaws.com/

sam build を実行するとデプロイに必要なファイルだけを .aws-sam/build/ 以下にコピー・整理します。具体的には、ソースコードと node_modules を関数ごとのフォルダにまとめ、template.yaml 内のS3参照パスなどをデプロイ用に書き換えた新しい template.yaml を生成します。

いよいよDeployです。 sam deploy を実行します。対話型では[y/n]が求められた際はすべてy, それ以外の入力はすべてデフォルトで進めてください。

Outputs
-------------------------------------------------------------------------------------------------------------------------------------------------------------   
Key                 ApiUrl
Description         -
Value               https://2mwnad4174.execute-api.ap-northeast-1.amazonaws.com/
-------------------------------------------------------------------------------------------------------------------------------------------------------------  

無事ブラウザからアクセスができています!

基盤はLambdaですからHTTPリクエストを受け付けて初めて関数が起動しています。このためWebサーバとして利用は可能ですが、従来通りストートレスであることやコールドスタートが発生しうることに注意して下さい。

Written by
編集部

亀田 治伸

Kameda Harunobu

  • Facebook->
  • X->
  • GitHub->

Share

Facebook->X->
Back
to list
<-