📝

API Gateway を使用せずに EC2 を API サーバーにしてみた

に公開

以下の構成で Lambda を呼び出してみました。

Lambda 関数の作成

以下の設定で作成しました。

  • ランタイム: Python 3.13
  • コード: デフォルトコード

EC2 インスタンスの作成

以下の設定で作成しました。

  • プラットフォーム: Amazon Linux 2023
  • デフォルト VPC のパブリックサブネット
  • デフォルトのセキュリティグループ
    • マイ IP からの通信は全許可
  • EC2 インスタンスプロファイル: AdministratorAccess 権限を付与した IAM ロール

EC2 インスタンス起動後、セッションマネージャーまたはインスタンスコネクトで EC2 インスタンスに接続し、以下のコマンドを実行します。

$ curl -fsSL https://rpm.nodesource.com/setup_18.x | sudo bash -
$ sudo yum install -y nodejs

$ mkdir lambda-proxy && cd lambda-proxy

# Express アプリを作成
$ npm init -y
$ npm install express aws-sdk

$ nano index.js
# 以下のコードを貼り付けて保存 (FunctionName は Lambda 関数名)
const express = require('express');
const AWS = require('aws-sdk');
const app = express();
const port = 3000;

const lambda = new AWS.Lambda({ region: 'ap-northeast-1' });

app.get('/', async (req, res) => {
  const params = {
    FunctionName: 'MyTestFunction',
    Payload: JSON.stringify({})
  };

  try {
    const result = await lambda.invoke(params).promise();
    const payload = JSON.parse(result.Payload);
    res.send(payload);
  } catch (err) {
    console.error(err);
    res.status(500).send('Lambda invocation failed');
  }
});

app.listen(port, () => {
  console.log(`Server running at http://localhost:${port}`);
});

# サーバーを起動
$ node index.js

動作確認

今回はブラウザから以下の URL にアクセスしました。

  • http://<EC2のパブリックIP>:3000/

以下の通り、Lambda 関数からのレスポンスを取得できました。

EC2 を使用するケース

API Gateway はマネージドサービスであるためサーバーの管理が不要な点などがメリットですが、以下のようなケースでは EC2 を使用することもあると思われます。

  • API サーバーとして、サーバーの管理もする必要がある
  • OS などサーバーのカスタマイズが必要
  • API Gateway では提供されていない機能が必要

まとめ

今回は API Gateway を使用せずに EC2 を API サーバーにしてみました。
どなたかの参考になれば幸いです。

Discussion