やりたいこと
自分の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はリージョン指定できないので気にする必要ないです。
lambdaにコードをアップロードして動かすまで
lambda関数を作る
コードを書く
とりあえずeventを返してほしい。
公式を参考にした結果下記のようになりました。
クラス名はGetEventとしました。
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を使ってビルドします。
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からやってもいいと思います。)
(そもそもこのプロセスを自動化できるっぽい。。)
Lambdaを動かしてみよう
このままでは動きません。
lambdaのコードのタブから下の方にあるランタイム設定へ移動
編集ボタンから、ハンドラを変更する必要があります。
デフォルトだと
example.Hello::handleRequest
となっていると思います。これは
パッケージ名.クラス名::関数名
のような対応関係になっています。
僕の場合はパッケージなし
、クラス名はGetEvent
、関数名はhandleRequest
なので
GetEvent::handleRequest
となります。
設定したらテストを実行だ!!
デフォルトだとテンプレートhello-worldがeventに渡されるはずです。
入れ子jsonを受け取れるようにする
{
"key1":"value1",
"key2":{"Key3":"value2"}
}
こういうのをevent
で受け取りたいとき
このまま入れ子になっているjsonを入れるとエラーになります。
これはevent
をMap<String,String>型
として受け取っているためです。
event
をMap<String><Object>型
とすることで受け取ることが可能になります。
受け取り方としては
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();
}
}
(もっと賢い方法ありそうですが。。。わからん。。)
で、ビルドして、アップロードして、もう一回テストすると。
はい!受け取れました!!
key1は???仕様変わってんじゃねーーか!!!!
一旦終わり
これJsonでっかくなったらやばそう。。。
Json周りはちゃんとした方法POJO?Gson??があるらしいですがよくわかってないので本シリーズはアホアホコードで今後も頑張ります。
とりあえずここまででlambdaは動くようになった。
次回はapigateway とs3をやる。