⛩️
API GatewayとLambdaで簡単なAPI作成してみた。
AWSもアソシエイト3冠取り終えたのでぼちぼちハンズオンもやっていこうかなということで、めちゃくちゃ簡単なAPIを作成しました。
構成図も初めて作ってみた。(あっているのかは不明。笑)
Lambdaで関数を作成する
1. AWSマネジメントコンソールにログインし、「Lambda」サービスに移動します。
2. 「Create function」をクリック
3. 「Author from scratch」 を選択
4. Basic Information
関数名は適当に決めて、ランタイムはPythonへ。
Architectureはx86_64とarm64が選べるが、依存関係のことを考えると基本的にはx86_64がいいと思う。
5. Permissions
このセクションでは実行ロールのオプションを選択します。
今回は1で進めます。
-
基本的なLambdaの権限を持つロールを新規作成 (Create a new role with basic Lambda permissions)
- Lambdaは、CloudWatch Logsにログをアップロードする権限を持つ新しいIAMロールを作成します。
-
既存のロールを使用 (Use an existing role)
- 既に作成されたIAMロールがある場合、そのロールを選択できます。
-
AWSポリシーテンプレートから新しいロールを作成 (Create a new role from AWS policy templates)
7. Advanced settings
その他詳しい設定があるけれども今回はスルー
Create function」で関数を新規作成します。
8. 作成したLambdaのダッシュボードに移動
9. 作成したいAPIの関数を記述する
今回私は腎機能の指標であるCCRの計算式をAPI化します。
import json
def lambda_handler(event, context):
# リクエストボディをJSONオブジェクトに変換
body = json.loads(event['body'])
# ボディからデータを取得
age = body.get('age')
weight = body.get('weight')
gender = body.get('gender')
serum_creatinine = body.get('serum_creatinine')
if gender.lower() == 'female':
gender_factor = 0.85
else:
gender_factor = 1.0
ccr = ((140 - age) * weight * gender_factor) / (72 * serum_creatinine)
return {
'statusCode': 200,
'body': json.dumps(f"Calculated CCR: {ccr}")
}
記述したらDeploy!!!!!!
10. コンソールから関数が動作するかテスト
-
テスト送信したいJSONを記述して、TESTをクリック
-
成功するといい感じの成功っぽい画面が返ってきます。失敗したらデバッグしましょう。
API Gatewayでエンドポイントを作成する
1. マネジメントコンソールで「API Gateway」サービスに移動します。
HTTPとREST APIがあるのなんでって思ったけどRESTの方がより複雑な設定ができるみたい。
今回はHTTPでを選択しました。
2. API GatewayとLambdaを統合する設定をします。
3. ルーティングの設定を行う
今回はPOSTでデータを投げるのでPOSTを選択します。
4. ステージング環境を複数設定できる
めっちゃ便利やん。
Nextで確認画面があったOKしたら作成される。
LambdaとAPI Gatewayの連携ができたら、Function overviewのDiagramが更新されてました。
これで設定完了!!!!
最後にターミナルからリクエスト送ってみる
$ curl -X POST https://zzzzzzzzzzzzzzzzzzzzz.amazonaws.com/ccr_calc \
-H "Content-Type: application/json" \
-d '{"age": 60, "weight": 70, "gender": "male", "serum_creatinine": 1.2}'
"Calculated CCR: 64.81481481481482"
成功しました。
感想
AWSのコンソール直感的でわかりやすいなぁと思った次第です。
引き続きハンズオンで色々作ってみたいと思います。
Discussion