初めてのAPI-Gateway+Lambda

## 初めに
流行りのAWSの勉強をしているものの実際に動かしたことがなかったため手始めに5分で作れるレベルのアプリを作成してみました。
触ってみると理解が進むのと、作成も複雑ではないのでご活用ください。

## 対象の方
- AWSでLambdaを使って簡単なアプリを作成してみたい人
- API GatewayやLambdaを知っているものの動かしたことのない人

## やりたいこと
フロントからAPI-Gatewayに対してリクエストを投げ、API-GatewayからLambdaを呼び出し結果を返却するアプリの作成。
## 前提
- AWSのアカウントを作成済みであること。
## Lambda
- AWSマネジメントコンソールからLambdaで検索し、関数の作成を押下。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3480753/b63cab83-8521-7846-840b-a4ab90114759.png)
- 必要項目を入力し「関数の作成」を押下。
※関数名はお好みで指定してよいですが、今回はtestFunctionとします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3480753/b2f9a1a7-07f6-f5cc-7495-6f227143c303.png)
- 関数が作成されると以下の画面になります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3480753/288ed557-58f8-b954-f074-e38a0435fec2.png)

- 画面下にコードリソースがあるのでコードを編集します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3480753/12dd0432-c1cd-3d54-75f7-56b7d7733f0e.png)

デフォルトだとCORSの設定がないため、リクエストを投げてもCORSエラーとなります。
※本来はドメインを指定しますが、サンプルの為「*」での設定としてます。

:::note warn
Lambdaの設定を変更した際はDeployまで行わないと反映されないので注意してください。
:::

```python:Lambdaソース
import json

def lambda_handler(event, context):
    # TODO implement
    return {
        'statusCode': 200,
        'headers': {
            "Access-Control-Allow-Headers" : "Content-Type",
            "Access-Control-Allow-Origin": "*",
            "Access-Control-Allow-Methods": "POST"
        },
        'body': json.dumps('Hello from Lambda!')
    }
```
## API-Gateway
- 同様にAWSマネジメントコンソールから「API Gateway」で検索します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3480753/db009e8e-0f80-71a0-f588-9cb043294a5c.png)
- 下に表示されているREST APIの「構築」を押下します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3480753/0d4dfdf1-01e0-3e1c-87f5-eb92f118966b.png)
- 以下設定しAPIを作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3480753/54ee725e-dcde-ab02-0e76-9ad00ae7dcd1.png)
- 作成されると以下の画面に遷移するので「メソッドを作成」を押下します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3480753/2aae3383-9ebe-7265-06e6-95ebd1a9a41c.png)
- 先ほど作成したLambda関数をもとに設定を行い、メソッドの作成を押下します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3480753/6df31edc-389e-6357-c927-223482e797c9.png)
- 最後に「APIをデプロイ」を押下すると以下の画面になるので任意の値を設定してデプロイします。
:::note warn
Lambdaに変更を加えた場合はデプロイをしないと反映されないため注意してください
:::

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3480753/f023e7c8-af80-6a3f-fd30-8b70edc15535.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3480753/3331ca6f-1c92-7f8b-35ef-83683c0c31be.png)
- 正常にデプロイされると以下の画面になります。「URLを呼び出す」に記載のURLをコピペしておきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3480753/80817023-beda-8343-ce51-00f067f1c329.png)
- ここまで完了した後Lambdaの画面に戻ってみるとAPI Gatewayの設定がLambdaに反映されていることが確認できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3480753/f2792dcd-8fcc-2767-6b74-7ecaad793dd1.png)


## Front
- フロントはリクエストを投げられればいいので簡易なhtmlを作成しておきます。
- 先ほどデプロイしたAPI-GatewayのURLはここで張り付けてください。
```html:フロント
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>lambdaのデモ</title>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js"></script>
</head>
<body>
<form>
    <input type="text" id="text">
</form>
<button>送信する</button>
</body>
</html>
 
<script>
$(function () {
    $('button').on('click',function () {
       
       //formの値をjsonに変換
       var arr = [$('#text').val()];
       var submitData = JSON.stringify(arr);
       
        //ajaxで送信する
        $.ajax('ここにコピペしたURLを張り付ける', {
            type: 'post',
            data: submitData,
            dataType: "json",
        }).then(function (data) {
            console.log(data);
        }).fail(function (error) {
            console.log(error);
        })
    });
  });
</script>
```
## 実行
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3480753/3b419e72-acf0-23d3-7796-b00467f4823b.png)

## 最後に
今回はシンプルな構成でAPI Gateway+Lambdaを用いたアプリケーションの作成を行いました。
次はLambdaレイヤーやAPI Gatewayのステージ変数を用いた確認をしてみようと思います。
Lambdaは料金もほぼかからないレベルなのでぜひ試してみてください。
少しでも参考になれば幸いです。