やること
Lambda 上の Express にアクセスできるようにする。
学べること
- サーバレス Express アプリケーションの作り方
- Lambda へのデプロイ
- API Gateway と Lambda の連携
扱わないこと
- Infrastructure as Code
- TypeScript
- CI/CD
STEP 1 : Serverless Express
1-1. 適当なディレクトリに Node.js プロジェクトを作成し、必要なパッケージをインストールします。
$ npm init -y
$ npm i express @vendia/serverless-express
Node.js
がインストールされている必要があります。
n
という Node.js のバージョン管理ライブラリを使用するのがおすすめです。
Mac を使用している方で、Homebrew がインストール済みの方は、以下のコマンドで Node.js をインストールできます。
$ brew install n
$ n latest
express
と一緒にインストールした @vendia/serverless-express
が重要です。これがないと、API Gateway から渡されたイベントを、Lambda にある Express でルーティングできません。
1-2. JavaScript ファイルを作成して、コードを書き込みます。
$ touch index.js
const serverlessExpress = require('@vendia/serverless-express')
const app = require('express')()
app.use('/', (req, res) => res.send(`root`));
app.use('/hello', (req, res) => res.send(`hello`));
// ローカル確認用
if (process.env.NODE_ENV === `develop`) app.listen(3000)
exports.handler = serverlessExpress({ app })
1-3. 以下のコマンドを実行し、http://localhost:3000 にアクセスすると root
、 http://localhost:3000/hello にアクセスすると hello
と表示されます。
$ NODE_ENV=develop node index.js
1-4. Lambda へアップロードするために、プロジェクト全体を圧縮した zip ファイルを作成しておきます。(普通に Finder とかエクスプローラーでやって大丈夫です。)
$ zip serverless-express.zip .
STEP 2: Lambda
2-1. AWS Lambda ダッシュボードの 関数を作成
ボタンをクリックします。
2-2. 種類は「一から作成」、関数名は適当に「serverless-express-lambda」として、関数の作成
ボタンをクリックします。
2-3. 「コード」タブの アップロード元
ドロップダウンから、.zip ファイル
を選択し、1-4で作成したzipファイルをアップロードします。
STEP 3: API Gateway
3-1. API Gatewayのダッシュボードから、APIを作成
ボタンをクリックします。

3-2. APIタイプは HTTP API
を使用します。構築
ボタンをクリックしてください。

3-3. 「統合」は、STEP 2 で作った Lambda 関数を選択してください。API 名は適当に「serverless-express-api」とします。次へ
ボタンをクリックしてください。

3-4. 「ルートを設定」は、リソースパスを /{proxy+}
に書き換えます。これにより、全てのパスへのリクエストを STEP 2 で作成した lambda 関数に流すことができます。

3-5. 「ステージを設定」は変更せず、そのまま 作成
してください。
STEP 4: 権限を付与する
/
や /hello
のような静的なルーティングでは問題なかったのですが、/{proxy+}
を使用すると、API GatewayからLambda関数へのアクセスできなかったので、このステップで権限を付与します。
4-1. API Gateway コンソールで、先ほど作成した API の詳細ページを開きます。左のタブから、「統合」を選択してください。

4-2. /{proxy+}
内のANY
を選択して、「ルートの統合の詳細」を表示してください。

4-3. ポリシーステートメントの例
をクリックして展開し、下の図に赤枠で示したarn:aws: ... /{proxy+}
の部分をコピーしておいてください。

4-4. Lambdaダッシュボードを開いて、設定
> アクセス権限
にアクセスします。

4-5. 「リソースベースポリシー」内の アクセス権限を追加
をクリックします。

4-6. AWSのサービス
を選択し、下の画像のように入力して保存します。ソースARN
には、4-3 でコピーした ARN をペーストしてください。

STEP 5 : アクセスしてみる
5-1. API Gatewayから、API の詳細ページに移動します。「URLを呼び出す」の下にある URL にアクセスすると、root
と表示されます。


5-2. URLの末尾に hello
を追加してアクセスすると、hello
と表示されます。

ここまでできたら完成です!お疲れ様でした🙇♂️