AWS
RaspberryPi
AWSLambda

raspberry pi で動かしてたお天気ツイート用ボットをAWS Lambda に移行した話

お天気ツイートボット

raspberry pi で お天気ツイートボットを動かしてました。しかし、WiFiドングルの不調が続いてツイート信頼性が落ちてきたので、より安定したプラットフォーム無いかなぁということで、AWS Lambda を使う発想に至りました。

raspberry pi での構成はこんなかんじでした

image.png

cron で シェルスクリプト(twitter.sh)を定期実行しています。このシェルスクリプトの中では単に、bam-weather(バイナリファイル)を実行しているだけです。ツイート自身はbam-weatherで行います。ちなみに、bam-weatherはgolangで書かれています。

お天気ツイートボットのソースは以下に置いてあります。
https://github.com/bamchoh/bam-weather

それを今回はこんな感じにしました。

image.png

cron は CloudWatch Events で代替しました。Lambdaはgolangが実行できないみたいなので、javascript経由でバイナリファイルを実行することでbam-weatherを実行しています。そのjavascript の詳細は以下のサイトに記述されています。また、以下のサイトにはAWS Lambda 上で実行するgolangバイナリの作り方も書いてあります。

http://blog.0x82.com/2014/11/24/aws-lambda-functions-in-go/

構成としてはそんなに大したことはないのと、内容も他のブログポストの内容を見れば大体わかると思います。ここでは私が詰まったところをご紹介したいなと思います。

AWS コンソールにログインできない問題

はい、Lambdaとは全然関係ないところで一番初めに躓きました。前回ログインしたタイミングでルートアカウントの二段階認証をONにしていたにもかかわらず、認証用デバイスを登録していなかったというわけのわからないことをしてしまい、ログインできないという致命的な問題にぶちあたりました。一応、サポートのサイトから問い合わせを送ることで解決したのですが、シアトルから電話がかかってきて、一瞬ビビりましたが、そこはサポートのサイトに書いてある通り「Please support Japanese.」とカタコトでしゃべったら、何かを察してくれたようで、日本のAWSカスタマーサポートから再度電話がかかってきて、事なきを得ました(札幌からかかってきてビビったのはまた別のはなし)

上記のようなトラブルにぶち当たったら、以下の記事を見ましょう。私は解決してから、この記事を見つけました。つらい。。。
http://qiita.com/saku/items/a6ea19ca0acddefda2e9

バイナリ実行できない問題

zipアーカイブを上げて、保存してテストを実行すると何故かエラーに、ログを確認するとError: spawn EACCESなるエラーが確認できました。EACCES ということはパーミッション関係かな?と思い、Lambda のロールの権限を変える方法を色々調べていたんですが、そういうことではありませんでした。原因は Windows でバイナリファイルを作っていたから でした。Windows は実行権限をバイナリファイルに付与できないので、Macを使ってバイナリを作成し、zipアーカイブすることで事なきを得ました。こんなところにもOS依存な問題があるとは。。。

ログ吐けない問題

バイナリを実行するとまたエラーが、open bam-weather.log: read-only file system というエラーでした。そのままですね、bam-weather.log は作れないよって感じだと思います。しかたなく、logファイルに吐くのをやめて、標準出力に出すようにコードを変更しました。

https://github.com/bamchoh/bam-weather/commit/f8eb7eb815188ea9f413b0db4cd19b9152e4d6bb

タイムゾーンが日本じゃない問題

テストを動かして、ツイート/トゥートされる様子を見れたので、その日は就寝。朝起きたときにちゃんとツイートされているかなー?とドキドキとワクワクが入り混じりながら床に就きました。朝起きると、ツイートはされてるんですが、日付が一日前。なんでだろうと考えていると、タイムゾーンを設定していないことに気付きました。(CloudWatch Events を設定するときもUTCで設定したのでピンときました)

調べると、以下の記事の設定をすればよさそうです。
http://qiita.com/nullian/items/39ecf1f6d0194b72e8e6

これは今日設定したばかりなので、明日に結果がわかりますが、おそらくこれで問題なく動き続けてくれるはずです。そうあってほしい。お願い!

まとめ

私の知識の不十分さにより、この一週間ハマり通しでしたが、何とかツイートボッドをraspberry pi から AWS Lambda に移行することができました。単純な構成の中にも、色々な制約や知識が必要であるということを再認識させられる良い機会だったかな?とポジティブに捉えています。なんにせよ、楽しかったです。今後は何か色々なものをAWSを使って作っていけたらなぁと思います。また浮いたraspberry pi で何かしたいなぁとも思っていますので、その時はまたこちらで記事を書かせていただこうかな。ではまた。