AWS Lambda と Log4j2 で困った話

TD;TR maven-shade-plugin がハマりどころ 結構新しい問題だった AIも使いよう 何が起きたのか? 久し振りに、 AWS Lambda を触ったんです。 AWS EventBridge と組み合わせて、簡易なバッチとして動かそうと。 で、実際に Lambda Function を FatJARにしてデプロイしたら、あれ? log4j2.xml のパースに失敗して、起動できない??? ローカルでは動くのに…。 まず、 pom.xml に log4j2 の BOM を設定 <dependencyManagement> <dependencies> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-bom</artifactId> <version>2.23.1</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> 依存関係に log4j-slf4j2-impl と aws-lambda-java-log4j2 を足す。 <!-- Logging--> <dependency> <groupId>com.amazonaws</groupId> <artifactId>aws-lambda-java-log4j2</artifactId> <version>1.6.0</version> </dependency> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-slf4j2-impl</artifactId> </dependency> log4j2.xml は、公式にある、一番シンプルなもの1 を置く。 そうすれば slf4j → aws-lambda-java-log4j2 → log4j2 で行けるよね?? って思ってたら、上記の如く、起動しないのです。 結局のところ これは、自分で検索したりしてもダメっぽいな…、と思ったので、Windows11付属のAIアシスタント、Copilotに質問したのですが、要領を得ない解答で少々困ってしまって。 ハレーションを起こさなかっただけマシかもですが。
Read full post gblog_arrow_right

AWS Lambda FunctionでJavaを採用したい

承前 AWS Lambda Function を Java で作るというお仕事をしています 基本的に Spring-Boot がメインの現場です Spring-Framawaork はやめておけ、と公式でも言われてますね。1 Java で何かしらする時は、背骨(フレームワーク)欲しいですよね DI(DependencyInjection) 無いと、もう無理ですよね Guice/Dagger を使えと言われていますが、どっち使ったらいいの? 色々なケースがありますが 自分でやったこと 自分でやったこと google/guice Apache Geronimo Config google/guava で、どうやってビジネスロジック注入する?を考えて、やっぱり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.
Read full post gblog_arrow_right

2020年7月 Amazon Cognito経由でYahoo!Japanのユーザ認証をやりたかっただけだった。

TL;DR できません Amazon Cognitoの外部フェデレーテッドIDプロバイダとして、Yahoo!Japanを登録できますが、認証が通りません。 stateプロパティの値が長過ぎて、Yahoo!Japanからエラーで返ってきます。 Amazon Cognito とは - Amazon Cognito AWSって、以前、S3をちょっと触ったレベルだったので、全く浦島太郎状態だったんですね。 最新技術のキャッチアップを兼ねて、ちょっと小さいプロジェクトで試すかな。 それなら、初っ端に必要になるログインとか認証である、Amazon Cognitoから触ってみるか~、って触ってみたんです。 「…なるほど!! 全く分からん!!」 [Amazon Cognito] Facebook / Google / Amazon だけじゃない!独自の認証システムも利用可能になりました! | Developers.IO 【サーバーレスなユーザ管理基盤】Amazon Cognito ユーザープールにOpenID Connectを使ってLINEアカウントを連携させてみる | Developers.IO AWS CognitoにGoogleとYahooとLINEアカウントを連携させる - Qiita 上記記事を参考に、ちまちまいじっていて、なんとなく分かった!! 「Amazon Cognitoってアカウント管理してくれて、外部プロバイダとの連携とも整合をとってくれて、一意なIDを払い出してくれる。」 「Amazon Cognitoそれ自体は、OpenID Connect/OAuth2のプロバイダとして振る舞ってくれる」 なんですね!! 上記記事を参考に、試しにYahoo!JapanとのID連携やってみるかー、って思って、IDプロバイダの設定までは、サクサクできたんです。 でも、実際のログイン画面が出てきて、クリックすると、コールバックにエラーが返ってきます。 “state is too long value” って何??? Chromeのdev-toolで、リクエストとかを見ていると、確かにAmazon Cognitoが生成するstateって、1,200文字程度あります。 自分では、どっちが妥当か判断できないし、しゃーないので、Yahoo!デベロッパーネットワークのお問合せフォームから、質問投げちゃいましたよ…。 結局「stateの長さは1024文字までの仕様となっており、長さを伸ばすことができません。(大意)」という回答でしたね。 よくあるOpenID Connect/OAuth2のクライアントライブラリは、そこまで長いstateを生成しないのでしょう。 ですが、全世界で広く使われているAWSだと、そうもいかないのでしょうね…。 久々、Yak Shavingで不毛な時間を過ごしちゃったよなー、でも、これやらないとダメなのが、我々の人生だよなー、と言う感想でしたね。