散々既出ですが、自分の備忘録を兼ねてメモを残しておきます。
構成
Webクライアント - API Gateway - Lambda (Python) - S3
S3上にあるjsonオブジェクトを単純に返すだけのシンプルなAPIです。
S3にjsonを配置する
Bucket名は何でも良いですがグローバルでユニークである必要があるので適当な数字をつけるなど工夫して下さい。
今回はtest-lambda-api-12345
としました。(※1)
以下のようなjsonを作り、hello.json
という名前でBucket上に保存します。
{
"greeting": "Hello, World!"
}
Lambda関数の設定
Lambda>関数の作成に進みます。
関数名を適当に指定します。今回はtest-lambda-get-s3-12345
としました。(※2)
ランタイムはPythonの最新版を選択します。執筆時はPython 3.8が最新でした。
その他は何も変更せず、「一から作成」を選択し、関数の作成を押下します。
ロールを一から作る場合、10-20秒程度待つ必要があります。
関数ができると以下のような画面になります。
関数コードのlambda_function.py
の中に、APIを処理を実装していきます。
今回は以下をコピペします。
import json
import boto3
# バケット名,オブジェクト名
BUCKET_NAME = '※1'
OBJECT_KEY_NAME = 'hello.json'
s3 = boto3.resource('s3')
def lambda_handler(event, context):
bucket = s3.Bucket(BUCKET_NAME)
obj = bucket.Object(OBJECT_KEY_NAME)
response = obj.get()
body = response['Body'].read()
return {
'statusCode': 200,
'body': body.decode('utf-8')
}
※1は、上記で作成したS3 Bucket名を指定してください
コードの説明は不要だとは思いますが、S3からオブジェクトを取得し、botyをjsonで返しているだけです。
コードが出来たら、オレンジ色の「Deploy」を押下してください。
私はこれを忘れてしまっていて、バグを修正しても治らない・・・とか30秒くらい悩みました。
Deployが完了すると、すぐ右にあるステータス「Changes not deployed」が緑色の「Changes deployed」に変わります。
LambdaからS3 Getの疎通確認
ここまで出来たら、右上の「テスト」を押下してみましょう。
「実行結果: 成功」と出力されたらOKです。
失敗と表示されたら以下を確認してください。
- Bucket名
- ファイル名
- ロールで権限が割り当てられているか
下のほうに「Execution Results」としても実行結果が表示されていますので、よく読めば解決できます。
API Gateway の設定
右上にある「APIを作成」を押下します。
今回はREST APIで作成します。「構築」を押下します。
API名は適当にtest_lambda_api
としました。
エンドポイントタイプは、リージョンとして全世界に公開です。
※重要:テスト後は、エンドポイントタイプを「プライベート」にするか、このAPIを削除してください。
呼び出されまくるとAWS利用料金が痛いことになります。
アクションから「リソースの作成」を選択します。
リソース名は適当に「test」として作成します。
アクションから「メソッドの作成」を選択します。
httpメソッドは「GET」を選択します。
統合タイプは「Lambda関数」を選択したまま、Lambda関数に、※2で設定したLambda関数名を指定します。
以下のような画面が表示されます。
クライアントの「テスト(稲妻アイコン)」をクリックします。
APIのデプロイ
デプロイされるステージは「新しいステージ」を選択します。
ステージ名に「test」を入れて、「デプロイを押下します。
このURLは/ステージ/までとなっていますので、最後に/リソース/まで指定してブラウザアクセスが可能です。
まとめ
画面ポチポチするだけで、サーバレスなAPIを公開することが出来ました。便利な世の中になりましたね。
動作確認するレベルであればこの手順で良いですが、本番で使う時は、ポリシーやネーミング設定など、本番に則した設定としてください。