特定のAMIイメージの最新情報を簡単に取得できるGemを作りました
背景
まず、この辺の記事がネットで流れてきました。
「へー、便利だなー」と思った反面、以下の様なことを感じました。
「こんな複雑なシェル覚えられる気がしない」
「これ、分かったとしてその後どうするの?コピペ?」
ということで、より使いやすくプログラマブルな形で取れると良いかなと思い作ってみました。
やってることは至極単純なので、昼休み中に何とか終わったw
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
追加した関数群
- EC2_LINUX_RI_NO_AD
- EC2_LINUX_RI_PART_AD
- EC2_LINUX_RI_ALL_AD
- EC2_WINDOWS_RI_NO_AD
- EC2_WINDOWS_RI_PART_AD
- EC2_WINDOWS_RI_ALL_AD
- EC2_LINUX_RI_NO_HOUR
- EC2_LINUX_RI_PART_HOUR
- EC2_LINUX_RI_ALL_HOUR
- EC2_WINDOWS_RI_NO_HOUR
- EC2_WINDOWS_RI_PART_HOUR
- EC2_WINDOWS_RI_ALL_HOUR
関数名の意味
- 末尾
AD
はAdvanced payment
で前払い金額 - 末尾
HOUR
はまんま時間課金の金額 NO
がNo Upfront
なので前払いなしPART
がPartial Upfront
なので一部前払いALL
がAll Upfront
なので全額前払いなし
ちな、時間課金の金額は公式ページには乗ってない情報だったりします。
月額が書いてあるので1年に均して割返せば分かるんですけど(っていうかアドオンでもそうやって出してる)
なぜ今更?
転職して自分で見積もりとかあんまりやらなくなっちゃったので。。。
と思ってたら、こんな感じになりまして。
けっこうな規模の見積もりレビューしてくれってSimple Monthly Calculatorのリンク送られてきて、クソ見づらいから某アレをちゃんと整備して展開すべきか…ってなってる
— Marcy Terui (@marcy_terui) 2015, 4月 14
あと、Google SpreadsheetのAPI的な制限に引っかかるようになっちゃった部分とかがあっt(モゴモゴ
ちなみに
ダウンロード数とかけっこう多い割に使ってる人ほとんどみたことないので、
最近GithubのStarとかPRくれたのも外人さんだし、海外で意外と使われてるみたいですw
どうぞ、ご査収ください。
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
企業サポーターについて
右も左もわからず、スタッフの方々等に色々ご迷惑を掛けました。申し訳ありません…
ただ、今回で会社としてAWSやJAWSに対してよりコミットしていく兆しが見えてきました。
あと、個人的に社内向けな裏ミッションであった「名前とお金だけ出すのと、実際にコミットするのとでは全然違う」っていうことを身を持って示すことができたと思うので、良かったです。*4
最後に感想
JAWS Daysはもちろんのこと、JAWS Daysとは直接関係ない部分でも、今回の出張では今後が楽しみになるような出会いがありました。
そんな流れで、一応JAWSの中では若者の部類に入るので、今後新しい風を起こすような活動ができれば良いなと思います。
運営の皆様、本当にありがとうございました。お疲れ様でした。
去年からそうなんですが、お手伝いしたい気持ちはあるのですが、気がついた時にはだいぶ進んでしまっていて運営の方はちゃんと輪に入れずにいるので、是非早めにお声がけいただければと思いますm(__)m*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
タグを制御に使うのは微妙だと前々から思っていたので書き直したかった。
ということで作ってみました。
使い方
前提
以下の権限の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
タグを設定
※Valueはバックアップ世代数
2. バイナリを取得してEC2上に配置
バージョン | ダウンロード元 |
---|---|
HEAD | Downloads | ec2backup |
Release | Releases · marcy-go/ec2backup · GitHub |
※実行するOSとArch(amd64 or 386)によってバイナリが別なので注意
3. コマンド実行
- Linux自分のみ
/path/to/ec2backup self
- Linuxアカウント全体
/path/to/ec2backup all
- Windows自分のみ
C:¥path¥to¥ec2backup.exe self
- Windowsアカウント全体
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)
従来の方法の問題点
- 管理すべきサーバが多い
- Auto Scalingの閾値が難しい
- 極端に多くなった場合に、分散処理できないPublisherが限界を迎える可能性がある
- Auto Scalingといえど、やはり並列定期ジョブでは無駄が生じる
1,2はそのままの意味です。
3は、さらにキュー(とWorker)を挟んだりすることで解決する方法もありますが、複雑になります。
そして、一番の問題は4です。
要は例を挙げて説明すると、
「5分に一度1分以内に大量のジョブを処理したい」と思ったときに、ピークは明らかに最初の1分だけであるにも関わらず、Auto Scalingではそこまで細かな制御ができないため、「最初の1分に合わせた台数のサーバが必要になる」ということです。
じゃあ、どうしたら良いだろうか?
答え:それ、全部Lambdaでやっちゃいましょう
こんなのはどうでしょう?
- ジョブをグループ化して、それぞれ適切な単位で別々のリストとして保存します。
Azure Job Scheduler
からグループIDをURLに含んだPUTリクエストを投げます。
前回はURLに認証文字列を含みましたが、任意のヘッダを指定できるのでUser-Agent
あたりにすると良さそうです。S3 Bucket Policy
でUser-Agent
での許可設定が可能です。もちろん、S3 Event Notification
には更新されたオブジェクトのキー情報が含まれています。- グループIDに対応するリストの数だけ
Publisher
となるLambda
を起動し、処理すべきリストを与えます。 - 起動された
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つです。
- 同じAzureの
Storage Queue
へのメッセージキューイング - HTTP(S)リクエスト
この内、2のHTTPリクエストがGET
,POST
,PUT
メソッドに対応しています。
どれも、動的にリクエストの内容は組み立てられないのでLambda:InvokeAsync
APIをコールするのは無理です。
ただ、一個だけ(?)Lambda
を静的なリクエストで起動する方法があります。
S3 event notifications(S3更新通知)です。
認証付きのSOAP API(SDKから呼ぶやつ)ではなく、REST APIのPUT
なら単純な静的リクエストから更新ができます。
手順など
まず、PUT
するS3バケットを作成し、以下のようなバケットポリシーを適用します。
S3 Bucket
とLamda 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のメニューを開きます。
変更します。
そして、Azure Job Schedulerのジョブを作成します
Job Scheduler
を選択します。
先ほどS3のバケットポリシーで許可したURLを入力して作成します。
とりあえず、2分毎で。
※無料トライアル枠の無い方は1時間より大きい周期でないと有料です。
暫く、lambchop
の出力を眺めると…
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に送信
③グラフ化
という感じの(準)リアルタイムトレンドグラフみたいなものを考えました。
こんな感じですね。
…が、大半できた所で謎のエラーでハマり、時間切れになりました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
③Graphiteインスタンスを作成
こちらは、以前自分で作ったCookbookがあったのでコレを利用しました。
marcy-cookbooks/graphite · GitHub
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さんです!