【Python】AWSのAPI GatewayとLambdaを使ってREST APIを書いてみた

# はじめに
AWS の API Gateway と Lambda をつかって REST API を書いてみたのでメモしておきます。
API Gateway と Lambda を組み合わせて使うことで、EC2でサーバを立てなくて済むかな？

# 手順
1. Lambda 関数の作成
2. API Gateway で API の作成
3. 作成した API のデプロイ

# Lambda 関数の作成
## Lambda の画面へ
　まずは、AWS のマネージメントコンソールにサインインして、そのあと AWS Lambda を選択してください。Lambda 関数を作成したことがない場合は「Get Started Now」ボタンを選択してください。
![get-started.JPG](https://qiita-image-store.s3.amazonaws.com/0/77079/daa859be-9ebe-ab8b-595a-bca0c656dd67.jpeg)

## Lambda 関数の作成
　「Get Started Now」ボタンを押すと、Lambda 関数のサンプルリストが表示されます。今回は新しく作るので、右下の「Skip」ボタンを選択してください。
![skip.JPG](https://qiita-image-store.s3.amazonaws.com/0/77079/079ff917-6b9f-6d25-d59c-af45507bde80.jpeg)

　「Skip」ボタンを選択すると、Lambda 関数を作成する画面になるので詳細を記述していきます。
![configure.JPG](https://qiita-image-store.s3.amazonaws.com/0/77079/44d4649b-a71e-3a82-e2e7-50a69cc270c1.jpeg)

### 関数名と言語の入力
　まずは関数名と言語を指定します。関数名に「hello_world」、言語は「Python2.7」と指定してください。
![func_name.JPG](https://qiita-image-store.s3.amazonaws.com/0/77079/d04ee42b-7ef8-573a-6198-dc64fbfd7e5c.jpeg)

### コードの入力
　次に実際のコードです。以下のコードをインラインエディタの中に貼り付けてください。{'message': 'Hello World!'} と返すだけの簡単なコードです。

```py
import json


def lambda_handler(event, context):
    return {'message': 'Hello World!'}
```

### ロールの選択
　続いて、ロールを設定します。既に存在するロールを使うこともできますが、今回は新しく作ります。Roleのドロップダウンを選択して「Basic execution role」を選択してください。
![select_role.jpg](https://qiita-image-store.s3.amazonaws.com/0/77079/81d122b3-f1d2-9b40-34bb-9fd998535e0a.jpeg)

### ロールの作成
　「Basic execution role」を選択すると以下のような画面が開きます。ここでは、IAMロールとして「新しいIAMロールの作成」、ロール名として「lambda_basic_execution」とします。入力が終わったら「許可」ボタンを選択してロールを作成します。
![create_role.JPG](https://qiita-image-store.s3.amazonaws.com/0/77079/bf701779-7c2c-3875-9aa3-3f4246815a49.jpeg)

### 最終確認
　「許可」ボタンを押すと元の画面に戻ります。今回はメモリやタイムアウト時間の設定はしないので、そのまま「Next」ボタンを選択してください。

　「Next」ボタンを選択すると確認画面が表示されます。「Create Function」ボタンを選択して、Lambda Function を作成します。
![review1.JPG](https://qiita-image-store.s3.amazonaws.com/0/77079/44405119-ab70-eb5e-0dfd-3d84b16d67bf.jpeg)

## 作成した Lambda 関数のテスト
　以上でLambda 関数の作成は完了しました。「Test」ボタンを選択して、「Execution Result」が以下のようになっているか確認します。


```py
{
  "message": "Hello World!"
}
```

# API Gateway で API の作成
## API Gateway の画面へ
　Lambda 関数を作成したら、マネージメントコンソールのホーム画面に戻って、API Gatewayを選択してください。API を作成したことがなかった場合は「Get Started Now」ボタンを選択してください。
![get-started-api.JPG](https://qiita-image-store.s3.amazonaws.com/0/77079/2fcca350-3231-b758-5121-7ed5cbbc3c0a.jpeg)

## API名の入力
　API名を入力する画面になるので、API name に「Hello API」と入力した後、「Create API」ボタンを選択します。
![new-api.JPG](https://qiita-image-store.s3.amazonaws.com/0/77079/39387bc7-4415-d900-786c-ac07f3b6b5e3.jpeg)

## リソースを作成
　次にリソースを作成します。「Create Resource」ボタンを選択してください。そのあと、Resource Name に「Hello」と入力して「Create Resource」ボタンを選択します。
![create_resource.JPG](https://qiita-image-store.s3.amazonaws.com/0/77079/b39bc4cb-17a8-3031-3203-1d5cfac8ce8a.jpeg)

## メソッドを作成
　リソースを作成したら、作成したリソースに対してメソッドを割り当てます。作成した「/hello」が選択されていることを確認したら、「Create Method」ボタンを選択します。そうすると「/hello」の下にドロップダウンが現れるので「GET」を選択します。
![create_method.jpg](https://qiita-image-store.s3.amazonaws.com/0/77079/feb7588e-9f42-10e3-ce69-1522e544fdd7.jpeg)

　その後、メソッド名の右にあるチェックボタン（☑）を選択すると、Integration TypeとしてLambda Function や HTTP Proxy が選択できるようになるので、Lambda Function を選択します。Lambda Region は Lambda 関数を作成したリージョンを選択し、Lambda Function には先ほど作成した Lambda 関数の名前である「hello_world」を入力します。すべて設定し終わったら、「Save」ボタンを選択します。
![save_api.JPG](https://qiita-image-store.s3.amazonaws.com/0/77079/950ef00a-e11e-d158-e7d6-6952281eb302.jpeg)

「Add Permission to Lambda Function」と出たら、「OK」を選択します。これで作成は完了です。

## 作成した API のテスト
　「Test」ボタンを選択して作成した API をテストしてみてください。Response Bodyを見ると Lambda 関数が実行されていることがわかるはずです。

```py
{
  "message": "Hello World!"
}
```

# API のデプロイ
　画面左側の「Deploy API」ボタンを選択します。
![deploy_api.JPG](https://qiita-image-store.s3.amazonaws.com/0/77079/21124197-2049-5ad0-e090-aad96ae4007e.jpeg)

　「Deploy API」ボタンを選択すると以下のような画面が出てきます。Deployment Stageとして「New Stage」、Stage nameとして「beta」と入力し、「Deploy」ボタンを選択します。
![deploy.JPG](https://qiita-image-store.s3.amazonaws.com/0/77079/fed0fba6-e77a-2104-f336-3751c69cdb0b.jpeg)

 Invoke URLが表示されます。
![url.JPG](https://qiita-image-store.s3.amazonaws.com/0/77079/34466b0f-d3b1-6c97-e45f-4868be3a2d92.jpeg)

URLにあるbetaの後ろに「/hello」と付け足してからアクセスしてください。以下のように表示されたら成功です。お疲れ様でした。

```py
{"message": "Hello World!"}
```