LoginSignup
0
0

More than 1 year has passed since last update.

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

Last updated at Posted at 2021-08-12

やりたいこと

自分のS3バケット上にjsonファイルを作ったり、中身を書き換えたりできるapiをlambdaとapi gatewayつかって作る予定です!!言語はjava11です!!!
といっても今回はlambda動かすところまで。

s3とかapi gateway周りは次回(あるといいなあった)

環境

  • windows 10
  • java11
  • gradle
  • intelij idea community

リージョンについて

僕の場合、lmabda、api gatewayはオハイオ(us-east-2)で作成しました。
場所は多分どこでもよいと思いますが、両方とも揃えないと連携できない気がします。
S3はリージョン指定できないので気にする必要ないです。

Inkedスクリーンショット 2021-08-12 104325_LI.jpg

lambdaにコードをアップロードして動かすまで

lambda関数を作る

  1. AWSコンソールからサービス⇒コンピューティングサービス⇒lambdaを選択
    (お気に入りにしとくと良いかも)スクリーンショット 2021-08-12 101453.png

  2. 関数の作成を選択スクリーンショット 2021-08-12 101328.png

  3. 一から作成、関数名はgetJsonFromS3、ランタイムはjava11、他はいじらずに作成します。(後から撮影したのでスクショでは怒られてます。。)スクリーンショット 2021-08-12 103110.png

  4. こんな感じになったら完成スクリーンショット 2021-08-12 103501.png

  5. テストのタブ⇒テスト(オレンジ色のボタン)でテスト実行 スクリーンショット 2021-08-12 105111.png

  6. 動いたら多分OK!!、詳細を見るとHello from Lambda!!と来ているはずです。スクリーンショット 2021-08-12 105301.png

コードを書く

とりあえずeventを返してほしい。
公式を参考にした結果下記のようになりました。
クラス名はGetEventとしました。

GetEvent.class
import com.amazonaws.services.lambda.runtime.Context;
import com.amazonaws.services.lambda.runtime.RequestHandler;

import java.util.Map;

public class GetEvent implements RequestHandler<Map<String, String>, String> {
    @Override
    public String handleRequest(Map<String, String> event, Context context) {

            //eventを返すだけ
            return event.toString();
    }
}

build.gradleを書く

gradleを使ってビルドします。

build.gradle
plugins{
    id 'java'
}

repositories {
    mavenCentral()
}

tasks.withType(JavaCompile) {
    options.encoding = 'UTF-8'
}

dependencies {
    implementation 'com.amazonaws:aws-java-sdk-core:1.12.32'
    implementation 'com.amazonaws:aws-lambda-java-core:1.2.1'
    implementation 'com.amazonaws:aws-lambda-java-events:3.9.0'
}

task buildZip(type: Zip) {
    from compileJava
    from processResources
    into('lib') {
        from configurations.runtimeClasspath
    }
}

build.dependsOn buildZip

追記2021/08/12
古すぎたのでバージョンを書き換えました。

この設定でビルドしてdistributionsファイルにzipファイルが出来上がると思います。

(intelij ideaで開発したので、他の場合だと記述が違うかもしれません。
)
(出来上がってくれ。。)

Lambdaにアップロードする

distributionsファイルに出来上がったzipをlambdaにアップロードします。

アップロードはlambdaのコードタブから⇒アップロード元⇒.zipまたは.jarファイルで行います。

(S3からやってもいいと思います。)
(そもそもこのプロセスを自動化できるっぽい。。)
スクリーンショット 2021-08-12 115234.png

Lambdaを動かしてみよう

このままでは動きません。

lambdaのコードのタブから下の方にあるランタイム設定へ移動
編集ボタンから、ハンドラを変更する必要があります。
スクリーンショット 2021-08-12 120756.png

デフォルトだと
example.Hello::handleRequest
となっていると思います。これは

パッケージ名.クラス名::関数名
のような対応関係になっています。
僕の場合はパッケージなし、クラス名はGetEvent、関数名はhandleRequestなので

GetEvent::handleRequest
となります。

スクリーンショット 2021-08-12 122357.png

設定したらテストを実行だ!!
デフォルトだとテンプレートhello-worldがeventに渡されるはずです。
スクリーンショット 2021-08-12 133402.png

テスト実行するとそのまま表示されます。
スクリーンショット 2021-08-12 133426.png

入れ子jsonを受け取れるようにする

入れ子.json
{
   "key1":"value1",
   "key2":{"Key3":"value2"}
}

こういうのをeventで受け取りたいとき
このまま入れ子になっているjsonを入れるとエラーになります。
これはeventMap<String,String>型として受け取っているためです。

スクリーンショット 2021-08-12 134804.png

eventMap<String><Object>型とすることで受け取ることが可能になります。
受け取り方としては

GetEvent.class
import com.amazonaws.services.lambda.runtime.Context;
import com.amazonaws.services.lambda.runtime.RequestHandler;

import java.util.Map;

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

            //各々キャストして取得、決め打ち
            String text = (String) event.get("key1");
            Map<String,String> innerText = (Map<String, String>) event.get("key2");

            return text + innerText.toString();
        }
}

(もっと賢い方法ありそうですが。。。わからん。。)
で、ビルドして、アップロードして、もう一回テストすると。

スクリーンショット 2021-08-12 141721.png

はい!受け取れました!!
key1は???仕様変わってんじゃねーーか!!!!

一旦終わり

これJsonでっかくなったらやばそう。。。
Json周りはちゃんとした方法POJO?Gson??があるらしいですがよくわかってないので本シリーズはアホアホコードで今後も頑張ります。

とりあえずここまででlambdaは動くようになった。
次回はapigateway と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