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


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

## 構成

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

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

## S3にjsonを配置する

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

![b1511a8403885c4bf3f5877875cee810.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/229008/717354c4-829d-511b-fe2c-e638aab2eab4.png)

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

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

![58babbdd034fd474d69597578ffa5436.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/229008/e35be02b-bc7a-c6f2-fcd6-6f54d7cf4cf3.png)

## Lambda関数の設定

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

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

![c0399ceb7fba9d285f24618c464660c6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/229008/ff806ff4-0cc3-89b6-0a75-7cc0afcee352.png)

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

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

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

![d3a35790d61d26406f4649d51aa96c46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/229008/98a06de3-743e-9142-e3a5-c91b867a2629.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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/229008/28dacc0d-e74c-8d8d-47e9-2ec45a7a1014.png) 
![a76251730f537f1c7c167b13f1c9a0e5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/229008/ae65c140-4299-d6c5-9f83-fb26004ad7c3.png)


## LambdaからS3 Getの疎通確認

ここまで出来たら、右上の「テスト」を押下してみましょう。
「実行結果: 成功」と出力されたらOKです。
![1b8a17077cb5f6a41ccda99a2bd4a2ec.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/229008/58797b28-cb6f-d129-9896-3ead4bf4be50.png)

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

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

## API Gateway の設定

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

![09923ad03935c8015fc2f28e5ccaebc5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/229008/41811946-edad-4710-3263-6765afd7be80.png)

API名は適当に```test_lambda_api```としました。
エンドポイントタイプは、リージョンとして全世界に公開です。
※重要：テスト後は、エンドポイントタイプを「プライベート」にするか、このAPIを削除してください。
　呼び出されまくるとAWS利用料金が痛いことになります。
![91f8eca439a95b42ac38e2578f20b660.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/229008/1c937553-154d-a9bb-86f8-a89ad4b0b83c.png)

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

![b64224ce1a4e84ac8799933d4384ccbc.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/229008/e9a02cc3-e6de-35be-c805-5de3dab4f0cf.png)

リソース名は適当に「test」として作成します。
![dc81387d847f07ff8cffc3e13f6be789.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/229008/aa1d48a9-c3aa-bfff-9891-dcb1664b7391.png)
アクションから「メソッドの作成」を選択します。
![1e5edde6b50558ef31c01730ba595ea2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/229008/4bbfb0ad-e260-c195-38cb-78f71ec15403.png)
httpメソッドは「GET」を選択します。

![513cb34865eb5eccb3bf9cc21812238c.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/229008/08504a31-7090-a614-2bde-371b7b4680c7.png)

統合タイプは「Lambda関数」を選択したまま、Lambda関数に、※2で設定したLambda関数名を指定します。
![443cb1ff94e8a66418f6224319cbf0a4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/229008/4146a122-9925-9fe5-671b-ab5c47572b9b.png)


権限追加を確認されますので、OKを押下します。
![5f1da67721c71069fe1a4be3efb596dd.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/229008/56ff06f0-ccb9-bd93-161e-71a6409e77ef.png)

以下のような画面が表示されます。
クライアントの「テスト(稲妻アイコン)」をクリックします。
![e6c52802f59e0e8ae322645206efab5d.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/229008/4222e317-c9e2-7e2d-03db-f2e2b1a3f437.png)

何も設定せず「テスト」を押下します。
![4e444b0811b37d4b48d0b2b0a26d78b2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/229008/10883f3a-2e74-5f01-bd6a-a8b6ded529a8.png)

テスポンスが返ってきたら成功です。
![2d11f6d8764203be43bad5a358ea4168.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/229008/b9ce8999-55f3-72c0-0611-0dabdc6c29be.png)

## APIのデプロイ

アクションから「APIのデプロイ」を選択します。
![b83545340722aed2d4b8fb6fb8f2d3ef.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/229008/72597abd-3342-c016-29e4-1e00efdeaafe.png)

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

![87d3d01b588be5bfb6c4846491db782a.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/229008/baabdeb2-ac7e-95d1-efe8-f29a181c640b.png)

以下のように、公開されたAPIのURLが表示されます。
![d2287fa93963a84e6c8a66e31482f6ce.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/229008/24e46b34-8a0e-bf8f-88ba-6791bf04b1aa.png)

このURLは/ステージ/までとなっていますので、最後に/リソース/まで指定してブラウザアクセスが可能です。
![8ccc4f7c9062c1c7f71a7fb36b1511bf.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/229008/48a3b563-1de0-dd76-a2cf-5bd316219b4e.png)

## まとめ

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