AWS Lambda FunctionでJavaを採用したい
AWS Lambda Function
をJava
で作るというお仕事をしています- 基本的に
Spring-Boot
がメインの現場です Spring-Framawaork
はやめておけ、と公式でも言われてますね。1
- 基本的に
Java
で何かしらする時は、背骨(フレームワーク)欲しいですよねDI(DependencyInjection)
無いと、もう無理ですよね
Guice
/Dagger
を使えと言われていますが、どっち使ったらいいの?- 色々なケースがありますが
で、どうやってビジネスロジック注入する?を考えて、やっぱりgoogle/guiceかなぁって。
設定注入は、Apache Geronimo Configかな 2
Dagger
はコンパイル時DI、Guice
実行時DI。コンパイル時にDI設定やればそっちの方が速いと思いがちですが、実際やってみると、Java
は起動するとかなり速いので、あまり差が無いのですね。
まぁ、そもそも AWS Lambda Function
って、プロダクション的に小さいですし 3
そうすると、コードや設定少ないGuice
の方がいいですよね。
よくあるケースですが、 API Gateway
で、何かを送ってもらって、何かをやるみたいなことをやってみましょうか。
public class App implements RequestHandler<APIGatewayProxyRequestEvent, APIGatewayProxyResponseEvent> {
private final AnyService anyService;
@Override
public APIGatewayProxyResponseEvent handleRequest(APIGatewayProxyRequestEvent input, Context context) {
this.anyService.execute(input);
APIGatewayProxyResponseEvent res = ... // do something
return res;
}
public App() {
Injector injector = Guice.createInjector(new AppModule());
this.anyService = injector.getInstance(AnyService.class);
}
}
@Singleton
public class AnyService {
public APIGatewayProxyResponseEvent execute(APIGatewayProxyRequestEvent input) {
// do something and return something
}
}
public class AppModule extends AbstractModule {
@Override
protected void configure() {
bind(AnyService.class);
// bind microprofile-config.properties
final Map<String, String> props = new HashMap<>();
Sets.newLinkedHashSet(ConfigProvider.getConfig().getConfigSources())
.stream()
.map(ConfigSource::getProperties)
.forEach(props::putAll);
Names.bindProperties(this.binder(), props);
}
}
まぁー、こんな感じですかね?4
-
JavaEE MicroProfile Config の実装参照なので、まぁ廃れることはないでしょう 第6回 お手軽便利MicroProfile Config | 豆蔵デベロッパーサイト ↩︎
-
小さく作るべきですよね ↩︎
-
たまに、こういう(所謂)「黒魔術」成分少ない、手組みのものを作ると、本当に勉強になります ↩︎