misc.tech.notes

主に技術的な雑記的な

特定のAMIイメージの最新情報を簡単に取得できるGemを作りました

背景

まず、この辺の記事がネットで流れてきました。

qiita.com

「へー、便利だなー」と思った反面、以下の様なことを感じました。

「こんな複雑なシェル覚えられる気がしない」
「これ、分かったとしてその後どうするの?コピペ?」

ということで、より使いやすくプログラマブルな形で取れると良いかなと思い作ってみました。
やってることは至極単純なので、昼休み中に何とか終わったw

github.com

amino | RubyGems.org | your community gem host

使い方

$ gem install amino

$ pry
[1] pry(main)> require 'amino'
=> true
[2] pry(main)> Amino('name' => 'amzn-ami-hvm-*-gp2', 'virtualization-type' => 'hvm').last.image_id
=> "ami-1ecae776"

簡単ですね :-)

この例では、リージョンはus-east-1になってます。
リージョンや認証情報はaws-sdkを使っているので、同じ方法で変更できます。
第2引数に以下の様にHashで渡すとその場で指定もできます。

Amino(
  {'name' => 'amzn-ami-hvm-*-gp2', 'virtualization-type' => 'hvm'},
  {'region' => 'ap-northeast-1', 'aws_key_id' => 'xxxxxxxx', 'aws_secret_key' => 'XXXXXX'}
)

たぶん、使わないと思いますがfirstも一応ありますw

これ、もしかして

Kumogata先生と組み合わせたらめっちゃ便利なんじゃね?

Google Spreadsheet Add-on「AWS Priceing Helper」を新しいリザーブド購入オプションに対応させました #jawsug

もっと早くやれよ、今更かよ、って話なんですが。。。

AWS Priceing Helper #とは

Google SpreadsheetにAWSの料金見積もりをするために、料金を勝手に埋めてくれる便利なカスタム関数群を追加するアドオンです。
詳しくは、今更見られるとちょっと恥ずかしい昔書いたブログをば。 blog.memolib.com

追加した関数群

関数名の意味

  • 末尾ADAdvanced paymentで前払い金額
  • 末尾HOURはまんま時間課金の金額
  • NONo Upfrontなので前払いなし
  • PARTPartial Upfrontなので一部前払い
  • ALLAll Upfrontなので全額前払いなし

ちな、時間課金の金額は公式ページには乗ってない情報だったりします。
月額が書いてあるので1年に均して割返せば分かるんですけど(っていうかアドオンでもそうやって出してる)

なぜ今更?

転職して自分で見積もりとかあんまりやらなくなっちゃったので。。。
と思ってたら、こんな感じになりまして。

あと、Google SpreadsheetのAPI的な制限に引っかかるようになっちゃった部分とかがあっt(モゴモゴ

ちなみに

ダウンロード数とかけっこう多い割に使ってる人ほとんどみたことないので、
最近GithubのStarとかPRくれたのも外人さんだし、海外で意外と使われてるみたいですw

github.com

どうぞ、ご査収ください。

JAWS Days 2015でAuroraの話をしてきました(あと、企業サポーターも)

題の通り、貴重な機会を貰って話してきました。

僕の本格的なAWS及びJAWSとの出会いは2年前のJAWS Daysでした。
あれから2年、今度は話す立場と企業サポーターとして参加した形になります。
当日は(特に企業サポーターの方が右も左も分からなくて)余裕がなくて実感ありませんでしたが、終わってみるとなかなか感慨深いものがありました。

発表について

まずは経緯とお礼から

事前に秋田支部の武田さんから「北海道・東北ブロックの代表として」と登壇の打診を受けました。僕が代表とか恐れ多いですが、チャンスを掴まない手はないので、当然ながら二つ返事でOKしました。この後も武田さんには色々フォローしていただき、感謝してもしきれないです。本当にありがとうございました。

その他にもAuroraのプレビューが来なくて切羽詰まっていた時に、青森の立花さんが自分のアカウントのIAMユーザの提供を打診してくれたり、同じく青森の石澤さんが東北プレイベントで僕のセッションの宣伝をしてくれたり、東北メンバーの方々がとても良くしてくれました。本当にありがとうございました。
(東北メンバーの方々の名前出しちゃったけど、大丈夫ですよね?w)

北海道と東北って、どっちも広いですし、海も挟んでいるので、結構物理的にも交通的にも距離があるんですよね。*1
なので、北海道・東北グループとして連携するような話になった時、最初は「いやいや、そんなん言っても連携なんて難しいでしょ?」とか思ってたんです。
全然、そんなことないですね。やはり、クラウドの世界に物理的な距離は関係ないですね。

使用したスライド

www.slideshare.net

反省など

まずは、プレビューが全然来なくて、内容は控えますが最後の手段を講じてなんとか5日前とかにゲットしまして、そういう訳で圧倒的に時間が足りなかったのですが、その中でも「まずParameterGroupを隅々見る」とか「実行計画を見る」とか基本的なアプローチを疎かにして、いきなり「仮説の検証」から入ってしまったのが失敗でした。やっていれば、もう少しためになる情報を出せたように思います。

次に、最初の概要とbioとかの提出のタイミングでは制限があるだろうことは把握していたのですが、思った以上に公開制限が厳しかったことが誤算でした。*2
なので、あくまで「公開情報を元に立てた仮説であり、答えは言えないけど、検証はしてるので見当外れではないはずだから自分で試してみてね」というギリギリのラインを攻めたつもりです。
ですが、答えを期待されていた方にはだいぶ物足りなかったかもしれませんね。申し訳ありません。

あと、Deep Diveの方ってことだったので、RDS及びMySQLある程度知っていることを前提に、お互いの特徴を僕なりの目線で比較して解説しようというのが大筋の趣旨でした。
ですが、聞いてくれた知人の話ではけっこう( ゚д゚)ポカーンとしてる人が多かったそうです。
その辺り、今後は前提知識が必要な話をするときは最初にアンケートを取ってその場で比重を調節するみたいなプレゼンに慣れた方々がやるようなことができるように心がけたいなと思います。

今後

終わった後に日本でAuroraを担当をしているSAの@con_mameさんから、Auroraについての内部的なお話やAuroraへの熱い想いを聞きました。
それに感化されたというのと、久々にがっつりDB関係を触って自分の中の熱も上がってきたので、今後もAuroraは色々触ってフィードバックなりできるようにしたいなと思いました。*3

企業サポーターについて

右も左もわからず、スタッフの方々等に色々ご迷惑を掛けました。申し訳ありません…

ただ、今回で会社としてAWSJAWSに対してよりコミットしていく兆しが見えてきました。
あと、個人的に社内向けな裏ミッションであった「名前とお金だけ出すのと、実際にコミットするのとでは全然違う」っていうことを身を持って示すことができたと思うので、良かったです。*4

最後に感想

JAWS Daysはもちろんのこと、JAWS Daysとは直接関係ない部分でも、今回の出張では今後が楽しみになるような出会いがありました。
そんな流れで、一応JAWSの中では若者の部類に入るので、今後新しい風を起こすような活動ができれば良いなと思います。

運営の皆様、本当にありがとうございました。お疲れ様でした。
去年からそうなんですが、お手伝いしたい気持ちはあるのですが、気がついた時にはだいぶ進んでしまっていて運営の方はちゃんと輪に入れずにいるので、是非早めにお声がけいただければと思いますm(__)m*5

*1:北海道新幹線が全線開通すればもう少し良くなる気がしますが

*2:というか、基本的にプレビューで知り得たことは全部ダメ

*3:無料で使える間は

*4:ぶっちゃけ僕は会社の宣伝とかはあんまり興味が無いんですけど、それで色んなイベントに参加しやすくなると良いというのと、面白い仕事や面白い同僚と出会えるキッカケになるならというのが動機

*5:物理的な距離ゆえにできないこともありますが、できることは積極的にやりたい

AWS SDK for Goで貧者のためのEC2バックアップCLIツールを作ってみた

AWS SDK for Go(のベータ版)が出たので触ってみたくて作ってみました。

最近の(自分の周りの)EC2バックアップ事情

EC2の定期バックアップは特に受託案件だとほぼ必須で各社・各個人で色々な方法でやっていることと思います。

最近だとお金があるなら「Cloud Automator使え」ってなるんですが、僕らのような貧者は昔からEC2のタグを見てバックアップを行うスクリプトをcronで回していたり、Jenkinsおじさんにお願いしたりするわけです。

で、一括管理できるようにアカウント横断で共用サーバ上で回すのが楽なわけですが、必ずしもそうできないような場面も会って、そうなるとスクリプトを別のサーバに仕込むわけです。

ただ、そうやってバックアップスクリプトが増殖していくと、そのうちAPI仕様変更とかSDKのバージョン違いによるバグ踏んじゃったりとか、Chefとかがあるとはいえそのためだけに何かしらの言語ランタイム入れないと…とか、ツラい未来(一部現在進行形)が色々想像できちゃうわけです。

Goで書いてみた理由

その点、Goなら言語ランタイムは要らないし、API仕様変更は無理ですがSDKのバージョン違いによるバグはテスト済みでコンパイルされたバイナリを使っている限り起きえませんし、万が一何かあってもバイナリ差し替えるだけなので楽です。

WindowsでもLinuxでも同じコードベースで動くのでWindows Server一台案件とかでも問題ありません。

あと、今までのはこのへんを参考に作っていたりするのですが、Nameタグを制御に使うのは微妙だと前々から思っていたので書き直したかった。

ということで作ってみました。

marcy-go/ec2backup · GitHub

使い方

前提

以下の権限のIAM Roleを有するEC2インスタンス

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "ec2:CreateImage",
        "ec2:CreateSnapshot",
        "ec2:CreateTags",
        "ec2:DeleteSnapshot",
        "ec2:DeregisterImage",
        "ec2:DescribeImages",
        "ec2:DescribeInstances",
        "ec2:RegisterImage"
      ],
      "Resource": [
        "*"
      ]
    }
  ]
}
1. バックアップ対象のEC2にBackup-Generationタグを設定

f:id:FumblePerson:20150217232147p:plain
※Valueはバックアップ世代数

2. バイナリを取得してEC2上に配置
バージョン ダウンロード元
HEAD Downloads | ec2backup
Release Releases · marcy-go/ec2backup · GitHub

※実行するOSとArch(amd64 or 386)によってバイナリが別なので注意

3. コマンド実行
/path/to/ec2backup self
  • Linuxアカウント全体
/path/to/ec2backup all
C:¥path¥to¥ec2backup.exe self
C:¥path¥to¥ec2backup.exe all

今後対応したいやつ

  • credentialsファイル指定、profile切り替え
  • Backup-Generationタグを無視するオプション
  • コマンドからの Backup-Generationタグ設定

以上です。
お金がある方はCloud Automator、無い方は良かったら使ってみてください。

Azure Job Scheduler + AWS Lambdaで定期的に大量のジョブを並列で実行させるためのパターンを考えてみる

前回の Azure Job Scheduler + AWS Lambdaで夢のサーバレス定期ジョブを実現する - Miscellaneous notes 続きです。
今回はまだ考察・アイデアレベルでまだ試してません(そもそも、このアイデアについてのコメントなどいただけることを期待していたりいなかったりw)

実際にやりたいジョブはそう単純じゃない

単一または少ない数の単純なジョブであれば、S3バケットと1:1で紐づけてやっても良いかと思います。
でも、実際にやりたいことはそうじゃなかったりします。
複数のジョブをまとめて実行したかったり、対象が多いために並列で一気に処理したかったりするわけです。

Azure Job Schedulerに登録できるJob数にもS3バケット数にも上限がありますし、大量のJobを効率的に管理する必要があります。

従来では

ジョブの発行者(Publisher)と実行者(Worker)を分け、その間をSQSなどのキューで繋ぐ方法があります。
Workerを増やすことで並列度を上げることができ、Auto Scalingを適用すればある程度のコスト最適化も図れます。

また、ここでもAzure Job Schedulerを利用することで、以下のようにSPOFの無い構成を作ることができるかと思います。
(Azureのアイコン群で作ってみましたが、青だけだと分かりにくい気がするのはAWSに慣れすぎたせいでしょうか?w)

f:id:FumblePerson:20150119125441p:plain

従来の方法の問題点

  1. 管理すべきサーバが多い
  2. Auto Scalingの閾値が難しい
  3. 極端に多くなった場合に、分散処理できないPublisherが限界を迎える可能性がある
  4. Auto Scalingといえど、やはり並列定期ジョブでは無駄が生じる

1,2はそのままの意味です。
3は、さらにキュー(とWorker)を挟んだりすることで解決する方法もありますが、複雑になります。
そして、一番の問題は4です。
要は例を挙げて説明すると、
「5分に一度1分以内に大量のジョブを処理したい」と思ったときに、ピークは明らかに最初の1分だけであるにも関わらず、Auto Scalingではそこまで細かな制御ができないため、「最初の1分に合わせた台数のサーバが必要になる」ということです。

じゃあ、どうしたら良いだろうか?

答え:それ、全部Lambdaでやっちゃいましょう

こんなのはどうでしょう?

f:id:FumblePerson:20150119123502p:plain

  1. ジョブをグループ化して、それぞれ適切な単位で別々のリストとして保存します。
  2. Azure Job SchedulerからグループIDをURLに含んだPUTリクエストを投げます。
    前回はURLに認証文字列を含みましたが、任意のヘッダを指定できるのでUser-Agentあたりにすると良さそうです。S3 Bucket PolicyUser-Agentでの許可設定が可能です。もちろん、S3 Event Notificationには更新されたオブジェクトのキー情報が含まれています。
  3. グループIDに対応するリストの数だけPublisherとなるLambdaを起動し、処理すべきリストを与えます。
  4. 起動されたPublisherはそれぞれ与えられたリストの中身を見て、その中のジョブ数分だけ一気にLambdaを起動し、Jobを実行させます。

必ずしもこの方法である必要はありません

要点としては以下のような点です。

  • リクエスト処理ジョブ発行ジョブ実行を全て分離する
  • 後ろに行くにつれ並列処理が必要となるが、それぞれが必要な分だけ起動できるようにする
  • 段階的に起動数を増して、粒度を細かくしていくことで、最終的な並列度を極限まで上げる

これによってどうなるか?

  • 管理すべきサーバが存在しない
  • ジョブのリスト分割方法を変えるだけで起動数を調節できる
  • Lambdaの課金は起動リクエスト数100msec単位の実行時間で、適宜必要な分だけ起動して最小の処理で終了して破棄できるため無駄がない
  • 並列度をいくらでも上げられる

最後に

こういう感じの新しいサービスに対応した新しいCDP(Cloud Design Pattern)が欲しい感じする。
MCDP(Multi Cloud Design Pattern)とか収集つかなくなりそうだけど、面白そうw
是非、ご意見お待ちしておりますm(__)m

Azure Job Scheduler + AWS Lambdaで夢のサーバレス定期ジョブを実現する

GoAzureがやっていたので、フラフラとAzureのWebサイトを見ていたりしました。

で、Azureのサービスの中に、AWSには無いJob Schedulerのサービスがあって、

これずっと欲しかったやつや!

ってなったので、ちょっと調べてました。

余談ですが、Jobの発行元の可用性担保と実行保証って面倒くさいんですよね。二重発行させる訳にもいかないですし、そのためだけにHA組む?みたいな所もあり…
発行されたJobを実行する所ではSQSとかELBとか挟めばどうとでもなるんですけど…
そんな訳で、フルマネージドなJob Schedulerはとても魅力的なわけです。

で、まず思ったのが「ここからLambdaキックできたらサーバレス定期ジョブでアツいなー」ってことです。

Job Schedulerができることは大別して以下の2つです。

  1. 同じAzureのStorage Queueへのメッセージキューイング
  2. HTTP(S)リクエスト

この内、2のHTTPリクエストがGET,POST,PUTメソッドに対応しています。
どれも、動的にリクエストの内容は組み立てられないのでLambda:InvokeAsyncAPIをコールするのは無理です。
ただ、一個だけ(?)Lambdaを静的なリクエストで起動する方法があります。

S3 event notifications(S3更新通知)です。

認証付きのSOAP APISDKから呼ぶやつ)ではなく、REST APIPUTなら単純な静的リクエストから更新ができます。

手順など

まず、PUTするS3バケットを作成し、以下のようなバケットポリシーを適用します。

S3 BucketLamda Functionのリージョンが同じになるよう注意しましょう。

{
    "Version": "2008-10-17",
    "Id": "PolicyLambdaScheduler",
    "Statement": [
        {
            "Sid": "StmtLambdaScheduler",
            "Effect": "Allow",
            "Principal": {
                "AWS": "*"
            },
            "Action": [
                "s3:PutObject"
            ],
            "Resource": "arn:aws:s3:::lambda-scheduler-sample/<random-strings>/*",
            "Condition": {
                "IpAddress": {
                    "aws:SourceIp": "0.0.0.0/0"
                }
            }
        }
    ]
}

許可するのは、万が一のイタズラを考えて十分に長いランダム文字列を含んだパス等にすると良いかと思います。

次に、Lambda Functionを登録します。

lambchopというgemが手元のスクリプトをサクッと上げれて、実行結果のログをtailするように見られて素敵なので、使わせていただいてます。

lambchop 0.0.2: Invoke AWS Lambda function from local as normally script - so what

こんな感じで適当です。

#!/usr/bin/env lambchop
/*
function_name: lambda-scheduler
runtime: nodejs
mode: event
description: 'Lambda scheduled job publish from Azure Job Scheduler'
timeout: 3
memory_size: 128
role: arn:aws:iam::<your-account-number>:role/lambda_exec_role
handler: lambda-scheduler.handler
*/
console.log('Loading event');
var aws = require('aws-sdk');
var s3 = new aws.S3({apiVersion: '2006-03-01'});
require('date-utils');

exports.handler = function(event, context) {
   var d = new Date();
   console.log('Received event:');
   console.log(JSON.stringify(event, null, '  '));
   console.log('DateTime:',d.toFormat("YYYY-MM-DD HH24:MI:SS"));
   console.log('Invoked from Azure Job Scheduler!!');
};

登録したLambda FunctionをS3 event notificationsで起動するよう設定します。

Lambdaのメニューを開きます。

f:id:FumblePerson:20150117003946p:plain

変更します。

f:id:FumblePerson:20150117003616p:plain

そして、Azure Job Schedulerのジョブを作成します

Job Schedulerを選択します。

f:id:FumblePerson:20150117004156p:plain

先ほどS3のバケットポリシーで許可したURLを入力して作成します。

f:id:FumblePerson:20150118002810p:plain

とりあえず、2分毎で。
※無料トライアル枠の無い方は1時間より大きい周期でないと有料です。

f:id:FumblePerson:20150117004658p:plain

暫く、lambchopの出力を眺めると…

f:id:FumblePerson:20150117005238p:plain

f:id:FumblePerson:20150117005243p:plain

2分毎に起動してる!!

夢のサーバレス定期ジョブや!!

Azure良いかも

良さそうなサービスがけっこうあって、ちょっとAWSを使い始めた頃のワクワクが蘇った感じがしてて良いかもです。
AWSはもちろん素晴らしいし、これからも使っていきますが、色んなクラウドの良いサービスはガンガン使って、組み合わせて良いものが作れるように精進していきたいと思います。

KCL for Pythonを試してみる

この記事は、AWS Advent Calendar 2014 - Qiitaの8日目(もう9日になっちゃいましたが)の記事です。

これからPythonをやることになったので、 兼ねてより気になっていたKCL(Kinesis Client Library) for Pythonを試してみようかと思いやってみました。

試しに何か作ってみようってことで安易なんですが、

Twitter Streaming APIからストリームデータを取得してKinesisへ流す
②KCLで受けて特定のワードが出てきたらGraphiteに送信
③グラフ化

という感じの(準)リアルタイムトレンドグラフみたいなものを考えました。

こんな感じですね。

f:id:FumblePerson:20141209102913p:plain

…が、大半できた所で謎のエラーでハマり、時間切れになりましたorz
原因追求して追試したいと思いますが…
やってみて、けっこうコレつらいやつなのではと思いましたw

手順とか

まず、使用したソースコード等はコチラになります。

marcy-terui/aws-kclpy-adcal · GitHub

基本的に、Vagrant + Chefで環境構築していますので、
細かい手順はソースコードを読んでいただく形になります。ご了承ください。

Streamを作成

以下のコマンドを実行します(要aws-cli

aws kinesis create-stream --region us-east-1 --stream-name aws-kclpy-adcal --shard-count 1

Python + boto(SDK for Python) + tweepy のworkerインスタンスを作成

supermarket(Chef公式)のPython Cookbookでそれぞれインストールし、
supervisordで起動する形です。
こちらはプログラム含め、サクっとできました。

python Cookbook - Chef Supermarket

boto/boto · GitHub

tweepy/tweepy · GitHub

③Graphiteインスタンスを作成

こちらは、以前自分で作ったCookbookがあったのでコレを利用しました。

marcy-cookbooks/graphite · GitHub

http://graphite.wikidot.com/

Graphite - Scalable Realtime Graphing - Graphite

Python + KCL for Pythonインスタンスを作成

同じく、supermarketのPython Cookbookでインストールし、supervisordで起動。

marcy-cookbooks/graphite · GitHub

awslabs/amazon-kinesis-client-python · GitHub

ちなみに、起動コマンドはKCL for PythonのREADMEにも書いていますが、
以下のようなコマンドを叩くとクソ長い実行コマンドが「出力」されます。

/usr/local/bin/amazon_kclpy_helper.py --print_command --java /usr/bin/java --properties /vagrant/kcl/kcl.properties

えっと、、、なんで出力なんでしょうね?w
そのまま「実行」してくれるオプションは無いのでしょうか…

ちなみにこんなんが出ます。

/usr/bin/java -cp /usr/local/lib/python2.7/site-packages/amazon_kclpy-1.0.0-py2.7.egg/amazon_kclpy/jars/commons-codec-1.3.jar:/usr/local/lib/python2.7/site-packages/amazon_kclpy-1.0.0-py2.7.egg/amazon_kclpy/jars/jackson-annotations-2.1.1.jar:/usr/local/lib/python2.7/site-packages/amazon_kclpy-1.0.0-py2.7.egg/amazon_kclpy/jars/commons-logging-1.1.1.jar:/usr/local/lib/python2.7/site-packages/amazon_kclpy-1.0.0-py2.7.egg/amazon_kclpy/jars/httpcore-4.2.jar:/usr/local/lib/python2.7/site-packages/amazon_kclpy-1.0.0-py2.7.egg/amazon_kclpy/jars/jackson-databind-2.1.1.jar:/usr/local/lib/python2.7/site-packages/amazon_kclpy-1.0.0-py2.7.egg/amazon_kclpy/jars/jackson-core-2.1.1.jar:/usr/local/lib/python2.7/site-packages/amazon_kclpy-1.0.0-py2.7.egg/amazon_kclpy/jars/httpclient-4.2.jar:/usr/local/lib/python2.7/site-packages/amazon_kclpy-1.0.0-py2.7.egg/amazon_kclpy/jars/joda-time-2.4.jar:/usr/local/lib/python2.7/site-packages/amazon_kclpy-1.0.0-py2.7.egg/amazon_kclpy/jars/amazon-kinesis-client-1.2.0.jar:/usr/local/lib/python2.7/site-packages/amazon_kclpy-1.0.0-py2.7.egg/amazon_kclpy/jars/aws-java-sdk-1.7.13.jar:/vagrant/kcl com.amazonaws.services.kinesis.multilang.MultiLangDaemon kcl.properties

はい、クソ長いですね。
そして、お気づきでしょうか?

Javaを実行してますね。

このKCL for Python、実はJavaのKCLが用意している、
MultiLangDaemonのインターフェースを実装しているだけなんです。

で、このエラー。

12 08, 2014 5:47:55 午後 com.amazonaws.services.kinesis.multilang.MultiLangRecordProcessor stopProcessing
重大: Failed to start client executable
java.io.IOException: Cannot run program "/vagrant/kcl/word_count_to_graphite.py": error=2, そのようなファイルやディレクトリはありません
    at java.lang.ProcessBuilder.start(ProcessBuilder.java:1048)
    at com.amazonaws.services.kinesis.multilang.MultiLangRecordProcessor.startProcess(MultiLangRecordProcessor.java:274)
    at com.amazonaws.services.kinesis.multilang.MultiLangRecordProcessor.initialize(MultiLangRecordProcessor.java:112)
    at com.amazonaws.services.kinesis.clientlibrary.lib.worker.InitializeTask.call(InitializeTask.java:74)
    at com.amazonaws.services.kinesis.clientlibrary.lib.worker.MetricsCollectingTaskDecorator.call(MetricsCollectingTaskDecorator.java:48)
    at com.amazonaws.services.kinesis.clientlibrary.lib.worker.MetricsCollectingTaskDecorator.call(MetricsCollectingTaskDecorator.java:23)
    at java.util.concurrent.FutureTask.run(FutureTask.java:266)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    at java.lang.Thread.run(Thread.java:745)
Caused by: java.io.IOException: error=2, そのようなファイルやディレクトリはありません
    at java.lang.UNIXProcess.forkAndExec(Native Method)
    at java.lang.UNIXProcess.<init>(UNIXProcess.java:187)
    at java.lang.ProcessImpl.start(ProcessImpl.java:134)
    at java.lang.ProcessBuilder.start(ProcessBuilder.java:1029)
    ... 9 more

12 08, 2014 5:47:55 午後 com.amazonaws.services.kinesis.multilang.MultiLangRecordProcessor stopProcessing
重大: Encountered error while trying to shutdown
java.lang.NullPointerException
    at com.amazonaws.services.kinesis.multilang.MessageWriter.close(MessageWriter.java:163)
    at com.amazonaws.services.kinesis.multilang.MultiLangRecordProcessor.childProcessShutdownSequence(MultiLangRecordProcessor.java:186)
    at com.amazonaws.services.kinesis.multilang.MultiLangRecordProcessor.stopProcessing(MultiLangRecordProcessor.java:249)
    at com.amazonaws.services.kinesis.multilang.MultiLangRecordProcessor.initialize(MultiLangRecordProcessor.java:118)
    at com.amazonaws.services.kinesis.clientlibrary.lib.worker.InitializeTask.call(InitializeTask.java:74)
    at com.amazonaws.services.kinesis.clientlibrary.lib.worker.MetricsCollectingTaskDecorator.call(MetricsCollectingTaskDecorator.java:48)
    at com.amazonaws.services.kinesis.clientlibrary.lib.worker.MetricsCollectingTaskDecorator.call(MetricsCollectingTaskDecorator.java:23)
    at java.util.concurrent.FutureTask.run(FutureTask.java:266)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    at java.lang.Thread.run(Thread.java:745)

「そのようなファイルやディレクトリはありません」って、あるんですけど…

PythonやってるつもりがJavaのエラーと格闘する羽目になってつらい…

ということで、明日(というか今日)9日目はmaroon1stさんです!

AWS Advent Calendar 2014 - Qiita