AWS DataPipeline TaskRunnerのJava8での実行エラー
Data Pipelineを検証しています。
Data Pipelineのマニュアルはこちら。 docs.aws.amazon.com
やりたいことはデータ分析用のバッチを夜間に実行したい。
実行するためのEC2インスタンスを指定します。指定の仕方は次の2パターン。
既存インスタンスで実行するためには、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だけのために余計なもの入れたくなかったんだよなー。