[Java] AWS Lambda + API gateway + S3でjsonファイルをいじるだけ (２)


[前回](https://qiita.com/regaeve/items/f5863d7d059782f9c2a9)はlambdaでeventを受け取るところまでやりました。

今回はAPI gatewayとの連携をやっていきます。（S3は次回で。。疲れちゃった。）

# 環境
- windows 10
- java11
- gradle
- intelij idea community

# API gatewayからlambdaを呼び出す

## API gatewayでAPIを構築する

1. AWSコンソールから`サービス`⇒`ネットワーキングとコンテンツ配信`⇒`API gateway`を選択
![スクリーンショット 2021-08-12 170811.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/240124/b31f1a24-ebb8-6f43-acf9-bd6467639f87.png)

1. `APIを作成`⇒REST APIを`構築`を選択(僕はプライベートじゃない方で作りました。)
![スクリーンショット 2021-08-12 172125.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/240124/5bb611a2-cf4b-4689-d90d-9375f0c2ec3b.png)
![スクリーンショット 2021-08-12 172233.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/240124/9dfc5857-4298-77c9-00df-75bd838c69a9.png)
1. API名は`CrudJsonFromS3`としました。他は変更しないで`APIの作成`を選択します。

1. 出来上がるとこんな画面になります。![Inkedスクリーンショット 2021-08-12 172736_LI.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/240124/f2492ac1-64a4-916a-fb94-52f9fc0daa68.jpeg)

## API gatewayからlambdaを呼び出す

1. `アクション`⇒`メソッドの作成`を選択
![スクリーンショット 2021-08-13 092023.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/240124/85c443b7-ef59-430f-c217-28da8e3dc35c.png)

1. `Get`を作成する⇒lambda関数の名前を打ち込む⇒`保存`
![スクリーンショット 2021-08-13 092328.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/240124/4c98e32a-1dbe-e219-3748-c8435c6a93cb.png)

1. `保存`を押すとこんなのが出てきます。書いてある通りです。`OK`を選択する
![Inkedスクリーンショット 2021-08-13 092343_LI.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/240124/91775906-8223-ac3f-09fe-5aa7fe98c2b8.jpeg)

1. 最終的にこんな画面になります（`Get`を選択している状態）
![Inkedスクリーンショット 2021-08-13 094703_LI.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/240124/3c8663fa-4dfc-0427-b9f5-5ec5db72fded.jpeg)

1. `クライアント`のところにある`テスト`を選択
![InkedInkedスクリーンショット 2021-08-13 094703_LI.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/240124/c5fc0ccc-5fe2-9db9-bec9-8fc04fd1c02d.jpeg)

1. 画面の下の方にある`テスト`を押す![スクリーンショット 2021-08-13 095516.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/240124/26cdab56-4981-67d4-a665-c3e4e8e8c5a1.png)

1. Lambda関数`getJsonFromS3`が呼び出されますが、`event`になにも渡していないので怒られます。とりあえず呼び出すことはできましたね![スクリーンショット 2021-08-13 095638.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/240124/ef7f1587-28c7-559e-bafd-8dd2b9153b42.png)

(気分が悪い方はとりあえずlambdaのコードを`return "hogehoge"`だけにでもしておいてください、すぐ書き換えますが。。。)![Inkedスクリーンショット 2021-08-13 100522_LI.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/240124/6bceda63-79da-0fde-fdb3-f144e383412c.jpeg)

## API gatewayからクエリ文字列をlambdaに渡す

将来的に`getJsonFromS3`には指定したファイルをS3から取ってきてほしいので、そのためにS3の`bucketName`と`bucketKey`をlambdaに渡したい

今回はAPI gatewayのクエリ文字列を使って`bucketName`と`bucketKey`をlambdaに渡す
(全部POSTにした方がいいのかなぁ。。。)

1. この画面から`メソッドリクエスト`を選択![Inkedスクリーンショット 2021-08-13 094703_LI.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/240124/79bd76cc-2883-c68c-fd12-9f52c3156da3.jpeg)

1. `URLクエリ文字列パラメータ`⇒`クエリ文字列の追加`を選択![スクリーンショット 2021-08-13 102932.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/240124/ff031284-7c5d-b4d9-5201-09e709ea4bd6.png)
1. `クエリ文字列の追加`から`bucketName`と`bucketKey`を追加する![スクリーンショット 2021-08-13 105203.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/240124/71cb660e-5874-474f-c3f7-ff60ca924bf3.png)
1. 戻ってから`統合リクエスト`を選択![スクリーンショット 2021-08-13 094703.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/240124/6337b966-3bf5-f64a-64cd-ad0fc5ae7399.png)
1. 下の方にある`マッピングテンプレート`⇒`マッピングテンプレートの追加`を選択![スクリーンショット 2021-08-13 110013.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/240124/a51ac6c6-9e97-2027-db21-cb0f469af6c1.png)
1. 空欄には`appilication/json`と打ち込みチェックマークを押す![スクリーンショット 2021-08-13 110954.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/240124/5cf795c9-73d4-2e2f-5e83-19db956e7a78.png)

1. こんなのが出てきます。書いてある通りです。`はい`を選択
![スクリーンショット 2021-08-13 110357.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/240124/94098529-1a70-a431-6747-4ee49506de35.png)

1. さらに下の方にある空欄に以下を記述して`保存`

```json:
{
    "bucketName":"$input.params('bucketName')",
    "bucketKey":"$input.params('bucketKey')"
}
```

![スクリーンショット 2021-08-13 111231.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/240124/bc5feb0f-6d9e-931d-dc73-dcd3907a720c.png)

[公式ガイド](https://docs.aws.amazon.com/ja_jp/apigateway/latest/developerguide/models-mappings.html#models-mappings-mappings)によるとここにかける言語は[Velocity Template Language](https://velocity.apache.org/engine/devel/vtl-reference.html)といって結構複雑なこともできるようです。。。

ここまでやればAPI gatewayからクエリ文字列を渡せるようになります。
しかし、lambda側のコードが対応していないので対応するように書き直します。

```java:GetEvent.class
public class GetEvent implements RequestHandler<Map<String, Object>, String> {
    @Override
    public String handleRequest(Map<String, Object> event, Context context) {

            String bucketName = (String) event.get("bucketName");
            String bucketKey = (String) event.get("bucketKey");

            return "bucketName:" + bucketName + ",bucketKey:" + bucketKey;
        }
}
```

コードを書き直したら、ビルドしてアップロードしてください
(もし名前を変えたりしたなら、lambdaのハンドラ名を編集することをお忘れなく)

## テスト実行してみる

1. `テスト`へ移動
![InkedInkedスクリーンショット 2021-08-13 094703_LI.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/240124/0bbcc868-8cd1-2421-4431-b19fd32b1680.jpeg)

1. `クエリ文字列`のところに以下の文字列を入力
![スクリーンショット 2021-08-13 114332.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/240124/0352b6cd-4014-bdb9-adbb-c2edb3411c6c.png)
`bucketName=ApplePie&bucketKey=KoKodayo~`
1. `テスト`を選択
![スクリーンショット 2021-08-13 114536.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/240124/8c6af9fd-2445-11f3-a79b-76010dcba171.png)
1. 実行するとちゃんと読み込めてますね（読み込めててくれ）
![スクリーンショット 2021-08-13 115016.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/240124/df0031b1-df1d-84d5-8b97-f18a418ac4e3.png)

## ここまで
- API gatewayからlambda関数を呼び出す
- API gatewayからlambda関数にクエリ文字列を渡す

ができるようになりました。
[前回](https://qiita.com/regaeve/items/f5863d7d059782f9c2a9)でS3とAPI gatewayをやるといったな。。あれは嘘だ。
S3をやろうと思ったのですが疲れたのでここまでで一旦終わります。

次回こそはS3をやります。。