2
1

More than 3 years have passed since last update.

コピペで出来る!LambdaとAPI Gatewayを使って簡単にAPIを作る手順

Last updated at Posted at 2021-02-21

散々既出ですが、自分の備忘録を兼ねてメモを残しておきます。

構成

Webクライアント - API Gateway - Lambda (Python) - S3

S3上にあるjsonオブジェクトを単純に返すだけのシンプルなAPIです。

S3にjsonを配置する

Bucket名は何でも良いですがグローバルでユニークである必要があるので適当な数字をつけるなど工夫して下さい。
今回はtest-lambda-api-12345としました。(※1)

b1511a8403885c4bf3f5877875cee810.png

以下のようなjsonを作り、hello.jsonという名前でBucket上に保存します。

{
    "greeting": "Hello, World!"
}

58babbdd034fd474d69597578ffa5436.png

Lambda関数の設定

Lambda>関数の作成に進みます。

関数名を適当に指定します。今回はtest-lambda-get-s3-12345としました。(※2)
ランタイムはPythonの最新版を選択します。執筆時はPython 3.8が最新でした。

c0399ceb7fba9d285f24618c464660c6.png

その他は何も変更せず、「一から作成」を選択し、関数の作成を押下します。

ロールを一から作る場合、10-20秒程度待つ必要があります。

関数ができると以下のような画面になります。
関数コードのlambda_function.pyの中に、APIを処理を実装していきます。

d3a35790d61d26406f4649d51aa96c46.png

今回は以下をコピペします。

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」に変わります。

9bd924eade3ec1970835e903010b269d.png
a76251730f537f1c7c167b13f1c9a0e5.png

LambdaからS3 Getの疎通確認

ここまで出来たら、右上の「テスト」を押下してみましょう。
「実行結果: 成功」と出力されたらOKです。
1b8a17077cb5f6a41ccda99a2bd4a2ec.png

失敗と表示されたら以下を確認してください。
- Bucket名
- ファイル名
- ロールで権限が割り当てられているか

下のほうに「Execution Results」としても実行結果が表示されていますので、よく読めば解決できます。

API Gateway の設定

右上にある「APIを作成」を押下します。
今回はREST APIで作成します。「構築」を押下します。

09923ad03935c8015fc2f28e5ccaebc5.png

API名は適当にtest_lambda_apiとしました。
エンドポイントタイプは、リージョンとして全世界に公開です。
※重要:テスト後は、エンドポイントタイプを「プライベート」にするか、このAPIを削除してください。
 呼び出されまくるとAWS利用料金が痛いことになります。
91f8eca439a95b42ac38e2578f20b660.png

アクションから「リソースの作成」を選択します。

b64224ce1a4e84ac8799933d4384ccbc.png

リソース名は適当に「test」として作成します。
dc81387d847f07ff8cffc3e13f6be789.png
アクションから「メソッドの作成」を選択します。
1e5edde6b50558ef31c01730ba595ea2.png
httpメソッドは「GET」を選択します。

513cb34865eb5eccb3bf9cc21812238c.png

統合タイプは「Lambda関数」を選択したまま、Lambda関数に、※2で設定したLambda関数名を指定します。
443cb1ff94e8a66418f6224319cbf0a4.png

権限追加を確認されますので、OKを押下します。
5f1da67721c71069fe1a4be3efb596dd.png

以下のような画面が表示されます。
クライアントの「テスト(稲妻アイコン)」をクリックします。
e6c52802f59e0e8ae322645206efab5d.png

何も設定せず「テスト」を押下します。
4e444b0811b37d4b48d0b2b0a26d78b2.png

テスポンスが返ってきたら成功です。
2d11f6d8764203be43bad5a358ea4168.png

APIのデプロイ

アクションから「APIのデプロイ」を選択します。
b83545340722aed2d4b8fb6fb8f2d3ef.png

デプロイされるステージは「新しいステージ」を選択します。
ステージ名に「test」を入れて、「デプロイを押下します。

87d3d01b588be5bfb6c4846491db782a.png

以下のように、公開されたAPIのURLが表示されます。
d2287fa93963a84e6c8a66e31482f6ce.png

このURLは/ステージ/までとなっていますので、最後に/リソース/まで指定してブラウザアクセスが可能です。
8ccc4f7c9062c1c7f71a7fb36b1511bf.png

まとめ

画面ポチポチするだけで、サーバレスなAPIを公開することが出来ました。便利な世の中になりましたね。
動作確認するレベルであればこの手順で良いですが、本番で使う時は、ポリシーやネーミング設定など、本番に則した設定としてください。

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1