[Talend]TalendにおけるS3アクセス時のAWS署名バージョン対応について調べてみた

はじめに

こんにちは。DI部の大高です。

以下の記事にも記載されている通り、S3へのアクセス時に「AWS署名バージョン2」が利用できなくなります。これについてはtS3系のコンポーネントを利用しているTalendのジョブも影響範囲に含まれます。

【超重要】対応しないと使えなくなるかも?!今、全S3ユーザがチェックすべき署名バージョン2の廃止について

そこで、TalendのtS3系コンポーネントではどのバージョンのAWS SDKが利用されているかを調査し、実際にAWS署名バージョンはどうなっているのか確認をしてみました。

調査対象について

Talendの製品版においては、下記のページに記載のある通りに販売・サポートの期限が「EOL(End Of Life)」として記載されています。

Support Statements - Talend Real-Time Open Source Data Integration Software

今回はこちらに沿って直近リリースの「v7.1.1」から、最近EOLを既に迎えた「v6.1.2」までを調査してみました。

対象製品はオープン版である「Talend Open Studio for Big Data」で検証しています。

おさらい

まずはおさらいです。Talendのジョブは内部ではJavaのコードになりますので、以下のドキュメント内の表における「AWS SDK for Java v1」を参照すればよさそうです。

署名バージョン 2 から署名バージョン 4 への移行 | AWS SDK、CLI、Explorer の使用 - Amazon Simple Storage Service

こちらの表では、SDKは「Java 1.11.x あるいは v2 in Q4 2018 にアップグレード。」とあります。また、「Sigv4 を使用するために、クライアントでコード変更が必要ですか。」については「はい」となっていますが、参照先のドキュメントによれば「2016 年 5 月以前にリリースされた AWS SDK を使用する場合」には追加で以下のコードを書くか、JVM引数の設定が必要とのことでした。

System.setProperty(SDKGlobalConfiguration.ENABLE_S3_SIGV4_SYSTEM_PROPERTY, "true");
-Dcom.amazonaws.services.s3.enableV4

具体的に「2016 年 5 月以前にリリースされた AWS SDK」がどのバージョンを指すかは記載がありませんが、こちらを踏まえて検証していきます。

調査方法

tS3系コンポーネントは色々ありますが、基本となる「tS3Connection」コンポーネントを対象として調査しました。コンポーネントの定義は「[コンポーネント名]_java.xml」に定義されています。この定義ファイル内にそれぞれ利用ライブラリも定義されているので、こちらを調査していきます。具体的には以下のようなパス、および、ファイルの箇所です。

\plugins\org.talend.designer.components.localprovider_x.y.z.yyyymmdd_xxxx\components\tS3Connection
   <CODEGENERATION>
    <IMPORTS>
       <IMPORT NAME="aws-java-sdk-1.11.406.jar" MODULE="aws-java-sdk-1.11.406.jar"
			MVN="mvn:com.amazonaws/aws-java-sdk/1.11.406"
			REQUIRED="true" />

調査結果

調査結果は以下の通りでした。Talend7系はSDKバージョンからして問題なさそうですが、6系はSDKが少し古いので影響がありそうですね。

Talendバージョン SDKバージョン
7.1.1 aws-java-sdk-1.11.406.jar
7.0.1 aws-java-sdk-1.11.269.jar
6.5.1 aws-java-sdk-1.10.52.jar
6.4.1 aws-java-sdk-1.10.52.jar
6.3.2 aws-java-sdk-1.10.52.jar
6.2.2 aws-java-sdk-1.10.52.jar
6.1.2 aws-java-sdk-1.9.13.jar

実際の署名バージョンはどうなっているのか?

では、実際にS3へのアクセス時にはどの署名バージョンを利用しているのでしょうか?それぞれのTalendバージョンで試してみました。ジョブとしては単純に「tS3Put」を配置したジョブで、JVM引数設定があり・なしの2パターンで検証してみました。バケットは「東京(ap-northeast-1)」にあります。

署名バージョンは以下の記事を参考にCloudTrailを利用して確認します。

【Amazon S3を利用しているすべての人が安心して2019/06/24を迎えるために】CloudTrailとAthenaを用いたS3の署名バージョンの確認方法

ジョブ

ジョブは以下のような2つのジョブです。1つは単純なtS3Putのみ、もう1つはそれに加えてJVM引数を設定しています。

tS3Put_Sig

tS3Put_SigV4

tS3Put_SigV4

結果

以下のような結果となりました。想定通り7系では問題なし、6系はすべてSigV2となっていました。

Talendバージョン JVM引数設定無し JVM引数設定有り
7.1.1 SigV4 SigV4
7.0.1 SigV4 SigV4
6.5.1 SigV2 SigV2
6.4.1 SigV2 SigV2
6.3.2 SigV2 SigV2
6.2.2 SigV2 SigV2
6.1.2 SigV2 SigV2

対策は?

一番簡単な対策としては、Talendのバージョンアップになるかと思います。Talend Open Studioを利用しているのであれば比較的簡単にTalend Version7への移行が出来ると思います。

問題は商用版です。商用版の場合には「Talend Administration Center」や、「Job Server」、「Runtime Server」を利用してサーバ環境を構築していると思いますので気軽にはバージョンアップができません。この場合には大変ですが個別にジョブを精査し、S3アクセスを行っているジョブに対してはAWS SDKライブラリの「1.11.x」以上を読み込ませるようにする必要があるでしょう。

また、ルーチンで個別にSDKを読み込んでいる場合やサブジョブを利用している場合には、更に状況は複雑になるかと思います。

一方で、今回のような単純なジョブの場合には、一例として以下のような回避策があります。Talendジョブをエクスポートしてbatファイルを開くと以下のようになっています。

%~d0
cd %~dp0
java -Xms256M -Xmx1024M -cp .;../lib/routines.jar;../lib/aws-java-sdk-1.10.52.jar;../lib/commons-codec-1.6.jar;../lib/commons-logging-1.1.3.jar;../lib/dom4j-1.6.1.jar;../lib/httpclient-4.5.1.jar;../lib/httpcore-4.4.3.jar;../lib/jackson-annotations-2.5.3.jar;../lib/jackson-core-2.5.3.jar;../lib/jackson-databind-2.5.3.jar;../lib/joda-time-2.8.1.jar;../lib/log4j-1.2.16.jar;ts3put_sig_0_1.jar; sandbox.ts3put_sig_0_1.tS3Put_Sig --context=Default %* 

batに記載のとおり、クラスパスで「../lib/aws-java-sdk-1.10.52.jar」を読み込みにいっているので、参照先のパスにダウンロードしてきた「aws-java-sdk-1.11.534.jar」を配置してクラスパスを以下のように書き換えます。

%~d0
cd %~dp0
java -Xms256M -Xmx1024M -cp .;../lib/routines.jar;../lib/aws-java-sdk-1.11.534.jar;../lib/commons-codec-1.6.jar;../lib/commons-logging-1.1.3.jar;../lib/dom4j-1.6.1.jar;../lib/httpclient-4.5.1.jar;../lib/httpcore-4.4.3.jar;../lib/jackson-annotations-2.5.3.jar;../lib/jackson-core-2.5.3.jar;../lib/jackson-databind-2.5.3.jar;../lib/joda-time-2.8.1.jar;../lib/log4j-1.2.16.jar;ts3put_sig_0_1.jar; sandbox.ts3put_sig_0_1.tS3Put_Sig --context=Default %* 

すると、署名バージョンは「SigV4」を利用するようになります。

もちろん、これは単純なケースなので実際に商用で利用しているジョブには単純に適用できないと思いますが、1つの方法としてはあるのではないでしょうか。

まとめ

以上、TalendにおけるS3署名バージョン対応についての調査結果でした。

実際の対応においては、対応前後でAWS署名バージョンが問題なく変更されたかの確認や、ジョブが問題なく動いているかの確認など確認事項は多いと思いますが、頑張っていきましょう。

この記事がどなたかのお役に立てば幸いです。それでは!