読者です 読者をやめる 読者になる 読者になる

そごうソフトウェア研究所

SOA、開発プロセス、ITアーキテクチャなどについて書いています。Twitterやってます@rsogo

AWS DataPipeline TaskRunnerのJava8での実行エラー

Data Pipelineを検証しています。

Data Pipelineのマニュアルはこちら。 docs.aws.amazon.com

やりたいことはデータ分析用のバッチを夜間に実行したい。

実行するためのEC2インスタンスを指定します。指定の仕方は次の2パターン。

  1. RunOnオプションを指定して、インスタンスを起動させて実行する
  2. WorkGroupオプションを指定して、既存のインスタンス上で実行する

既存インスタンスで実行するためには、TaskRunnerを実行する必要があります。

で、Java8で実行すると下記の問題があります。

$ java -jar TaskRunner-1.0.jar  --workerGroup=ec02_dev --region=ap-northeast-1 --config=./credencials.json 
log4j:WARN No appenders could be found for logger (amazonaws.datapipeline.objects.PluginModule).
log4j:WARN Please initialize the log4j system properly.
log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.
Starting log pusher...
Not enabling task runner logging as given log uri null is invalid
Initializing drivers...
Starting task runner...
private.com.amazonaws.services.s3.model.AmazonS3Exception: AWS authentication requires a valid Date or x-amz-date header (Service: Amazon S3; Status Code: 403; Error Code: AccessDenied; Request ID: XXXXXXX), S3 Extended Request ID: XXXXXXX
    at private.com.amazonaws.http.AmazonHttpClient.handleErrorResponse(AmazonHttpClient.java:1182)
    at private.com.amazonaws.http.AmazonHttpClient.executeOneRequest(AmazonHttpClient.java:770)
    at private.com.amazonaws.http.AmazonHttpClient.executeHelper(AmazonHttpClient.java:489)
    at private.com.amazonaws.http.AmazonHttpClient.execute(AmazonHttpClient.java:310)
    at private.com.amazonaws.services.s3.AmazonS3Client.invoke(AmazonS3Client.java:3604)
    at private.com.amazonaws.services.s3.AmazonS3Client.createBucket(AmazonS3Client.java:792)
    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:497)
    at private.com.amazonaws.services.datapipeline.retrier.RetryProxy.invokeInternal(RetryProxy.java:36)
    at private.com.amazonaws.services.datapipeline.retrier.RetryProxy.invoke(RetryProxy.java:48)
    at com.sun.proxy.$Proxy24.createBucket(Unknown Source)
    at amazonaws.datapipeline.logpusher.Uploader.ensureBucketExists(Uploader.java:86)
    at amazonaws.datapipeline.logpusher.Uploader.compressAndUploadToS3(Uploader.java:49)
    at amazonaws.datapipeline.logpusher.LogPusher.uploadPart(LogPusher.java:404)
    at amazonaws.datapipeline.logpusher.LogPusher.pushFile(LogPusher.java:397)
    at amazonaws.datapipeline.logpusher.LogPusher.pushItem(LogPusher.java:226)
    at amazonaws.datapipeline.logpusher.LogPusher.finishAndRemoveLogItem(LogPusher.java:108)
    at amazonaws.datapipeline.taskrunner.TaskPoller.executeRemoteRunner(TaskPoller.java:144)
    at amazonaws.datapipeline.taskrunner.TaskPoller.executeTask(TaskPoller.java:105)
    at amazonaws.datapipeline.taskrunner.TaskPoller$1.run(TaskPoller.java:81)
    at private.com.amazonaws.services.datapipeline.poller.PollWorker.executeWork(PollWorker.java:76)
    at private.com.amazonaws.services.datapipeline.poller.PollWorker.run(PollWorker.java:53)
    at java.lang.Thread.run(Thread.java:745)

公式のフォーラムでも話題になっていますが、まだ正式には解決していなさそう。 https://forums.aws.amazon.com/thread.jspa?messageID=688746

Jodaの入れ替え

TaskRunner-1.0.jarを解凍して、joda-time-2.9.1.jarのクラスファイルと入れ替えます。 ここにあります。

TaskRunner-1.0/org/joda/time

入れ替えたら、再アーカイブ。実行可能なjarにするために、マニフェストファイルを指定しています。

$ jar cfm ../TaskRunner-1.0.sogo.jar META-INF/MANIFEST.MF ./*

TaskRunnerの実行

$ java -jar TaskRunner-1.0.sogo.jar  --workerGroup=ec02_dev --region=ap-northeast-1 --config=./credencials.json

これで作ったjarはサポートされる訳は無いと思うので、公式な解決を待ちたいところです。 古いJavaを入れて、TaskRunnerは古いJavaで動かしてもいいんだけど、TaskRunnerだけのために余計なもの入れたくなかったんだよなー。