🧑‍💻

AWS API GatewayとLambdaでシンプルなREST APIを作る

2024/09/21に公開

こんにちは。株式会社DeLTの栗田です。

シンプルなAPIを作りたいけど、環境構築が面倒であったり維持費をかけたくない、けどローカルでも動かしたい場合に私がAWS Lambdaを使ってよく行う方法をメモしておきます。

環境

開発言語

  • python 11
  • ryeでパッケージ管理
  • ローカルの環境変数管理は.envrcを使用

AWS

  • lambda
  • API Gateway

コード

とりあえずOpenAIのAPIを叩くだけのシンプルなコードを用意します。

https://github.com/mk1018/SampleLambdaFunction

POST想定で、inputというパラメータをbodyから取得し、openaiに投げているだけです。

https://github.com/mk1018/SampleLambdaFunction/blob/main/functions/lambda_function.py

AWSの設定

Lambda

テキトウに関数を用意します。

デフォルトのタイムアウト時間が3秒なので「一般設定」からタイムアウト時間を伸ばしておいてください。

サンプルコードではAPI KEYを環境変数にしているので、Lambdaの環境変数にも設定します。

API Gateway

「トリガーを追加」からAPI Gatewayを指定します。

この辺の設定は自身の環境に合わせてください。

作成するとエンドポイントができるので試しに叩いてみます。

デフォルトの結果が返ってきたのでオッケーです。

コードのデプロイ

github actionsを使ってデプロイします。
まずはAWSのアクセスキーをsecretsにセットします。

functionsディレクトリにpythonのライブラリをつっ込んでzipでアップロードしているだけです。
※Labmda Layerは使ってません。

https://github.com/mk1018/SampleLambdaFunction/blob/main/.github/workflows/deploy_to_lambda.yml

actionsから実行します。

デプロイ完了です。

Layer分けせず、全てのライブラリををまとめているのでもちろんAWSのコンソールでコードは表示できません。

お試し実行

[mk1018:~]
$ curl -X POST https://<独自のURL>.ap-northeast-1.amazonaws.com/default/SampleLambdaFunction \
-H "Content-Type: application/json" \
-d '{"input":"こんにちは。"}' | jq .
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100   194  100   164  100    30    252     46 --:--:-- --:--:-- --:--:--   298
{
  "result": "こんにちは!今日はどんなことをお手伝いできますか?"
}

レスポンスが返ってきたのでオッケーです。

最後に

使う場面は、お試しでシンプルなAPIを作りたい時くらいかと思います。

ここ以外にも記述記事書いてます。
https://delt.co.jp/article

Discussion