0
0

More than 3 years have passed since last update.

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

Last updated at Posted at 2021-08-13

前回は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

  2. APIを作成⇒REST APIを構築を選択(僕はプライベートじゃない方で作りました。)
    スクリーンショット 2021-08-12 172125.png
    スクリーンショット 2021-08-12 172233.png

  3. API名はCrudJsonFromS3としました。他は変更しないでAPIの作成を選択します。

  4. 出来上がるとこんな画面になります。Inkedスクリーンショット 2021-08-12 172736_LI.jpg

API gatewayからlambdaを呼び出す

  1. アクションメソッドの作成を選択
    スクリーンショット 2021-08-13 092023.png

  2. Getを作成する⇒lambda関数の名前を打ち込む⇒保存
    スクリーンショット 2021-08-13 092328.png

  3. 保存を押すとこんなのが出てきます。書いてある通りです。OKを選択する
    Inkedスクリーンショット 2021-08-13 092343_LI.jpg

  4. 最終的にこんな画面になります(Getを選択している状態)
    Inkedスクリーンショット 2021-08-13 094703_LI.jpg

  5. クライアントのところにあるテストを選択
    InkedInkedスクリーンショット 2021-08-13 094703_LI.jpg

  6. 画面の下の方にあるテストを押すスクリーンショット 2021-08-13 095516.png

  7. Lambda関数getJsonFromS3が呼び出されますが、eventになにも渡していないので怒られます。とりあえず呼び出すことはできましたねスクリーンショット 2021-08-13 095638.png

(気分が悪い方はとりあえずlambdaのコードをreturn "hogehoge"だけにでもしておいてください、すぐ書き換えますが。。。)Inkedスクリーンショット 2021-08-13 100522_LI.jpg

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

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

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

  1. この画面からメソッドリクエストを選択Inkedスクリーンショット 2021-08-13 094703_LI.jpg

  2. URLクエリ文字列パラメータクエリ文字列の追加を選択スクリーンショット 2021-08-13 102932.png

  3. クエリ文字列の追加からbucketNamebucketKeyを追加するスクリーンショット 2021-08-13 105203.png

  4. 戻ってから統合リクエストを選択スクリーンショット 2021-08-13 094703.png

  5. 下の方にあるマッピングテンプレートマッピングテンプレートの追加を選択スクリーンショット 2021-08-13 110013.png

  6. 空欄にはappilication/jsonと打ち込みチェックマークを押すスクリーンショット 2021-08-13 110954.png

  7. こんなのが出てきます。書いてある通りです。はいを選択
    スクリーンショット 2021-08-13 110357.png

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

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

スクリーンショット 2021-08-13 111231.png

公式ガイドによるとここにかける言語はVelocity Template Languageといって結構複雑なこともできるようです。。。

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

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

  2. クエリ文字列のところに以下の文字列を入力
    スクリーンショット 2021-08-13 114332.png
    bucketName=ApplePie&bucketKey=KoKodayo~

  3. テストを選択
    スクリーンショット 2021-08-13 114536.png

  4. 実行するとちゃんと読み込めてますね(読み込めててくれ)
    スクリーンショット 2021-08-13 115016.png

ここまで

  • API gatewayからlambda関数を呼び出す
  • API gatewayからlambda関数にクエリ文字列を渡す

ができるようになりました。
前回でS3とAPI gatewayをやるといったな。。あれは嘘だ。
S3をやろうと思ったのですが疲れたのでここまでで一旦終わります。

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

0
0
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
0
0