📝
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