発生したエラー
Maven build で生成した jar を S3 に配置し、Lambdaファンクションの実行ソースとしていました。
各ファンクション用クラスはStepFunctionsのステートマシンに定義として記載し、さらにステートマシンをCloudWatchEvent経由で呼び出す構成でした。
各クラスは RequestHandler を実装していたのですが、その中でも S3を参照する処理のみ、タイトル通りのエラーが発生しました。
java.lang.NoSuchFieldError: SIGNING_REGION
at com.amazonaws.services.s3.AmazonS3Client.createRequest(AmazonS3Client.java:4660)
at com.amazonaws.services.s3.AmazonS3Client.createRequest(AmazonS3Client.java:4636)
at com.amazonaws.services.s3.AmazonS3Client.getObject(AmazonS3Client.java:1433)
at com.sompo_swt.integraph.common.S3StorageManager.getS3Object(S3StorageManager.java:58)
<中略>
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
調査時
S3へのアクセスに関するソースでは、認証情報とリージョンをそれぞれ以下のように設定していました。
S3StorageManager() {
client = AmazonS3ClientBuilder
.standard()
.withRegion(Regions.AP_NORTHEAST_1)
.withCredentials(new AWSStaticCredentialsProvider(getCredentials()))
.build();
}
private AWSCredentials getCredentials() {
return new BasicAWSCredentials(
rb.getString("accessKey")
, rb.getString("secretKey"));
}
リージョン情報は定数、アクセスキーとシークレットキーはプロパティファイルに書き出して管理しています。
試しに.withRegion(Regions.AP_NORTHEAST_1)
部分をコメントアウトしましたが、解消せず。。。
お手上げ状態でした。
対応方法
NoSuchFieldError: SIGNING_REGION について調べたところ、どうやらこのエラーは
「バージョンの異なるSDKコアが混在していること」が原因で発生する、とのこと。
今回の場合は、該当のLambdaファンクションをステートマシン経由で実行した際に参照する aws-java-sdk-core のバージョンがCloudWatchイベント経由での呼び出し時に参照するバージョンと異なっていたことが原因(?)だと考えました。
pom.xml を参照すると、それらしい部分のバージョンが想定通り古いものになっていたため、
当該部分の aws-java-sdk-core のバージョンをpom.xml 内の最新のバージョンに合わせると、無事にS3へアクセスできるようになりました。

.withRegion(Regions.AP_NORTHEAST_1)
が悪さをして発生するパターンもあるようですが、今回はsdk-coreの異なるバージョンが混在していたことが原因でした。
pom.xml は以下のように修正しました。
<dependency>
<groupId>com.amazonaws</groupId>
<artifactId>aws-java-sdk-stepfunctions</artifactId>
<version>1.11.274</version>
</dependency>
<dependency>
<groupId>com.amazonaws</groupId>
<artifactId>aws-java-sdk-stepfunctions</artifactId>
<version>1.11.572</version>
</dependency>
(※スクリーンショット取得時には大半が 1.11.574 にアップデートされていますが、修正後の 1.11.572 というバージョンは修正時の最新バージョンです)
今回の事象に関しては、あたりをつけて行った対処法がヒットしてしまったので、理解が曖昧なままです。。。
異なるバージョンのSDKが混在している場合の Java on Lambda について、類似の問題が発生した方や
より詳細を理解しておられる方がいましたら、なぜこの事象が発生するのかなど、コメントお願いします。m(_ _)m