LoginSignup
0
1

More than 3 years have passed since last update.

SIGNING_REGION:NoSuchFieldError について

Last updated at Posted at 2019-06-20

発生したエラー

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へのアクセスに関するソースでは、認証情報とリージョンをそれぞれ以下のように設定していました。

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へアクセスできるようになりました。

qiita_20190619.png

.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

参考

【超初心者向け】Maven超入門
SDK for Java 1.11.x と 2.x の相違点

0
1
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
1