CodeBuildでSlackへ株価をお知らせ

AWS運用自動化サービス「Cloud Automator」

こんにちは

弊社は2019/03/13東証マザーズへ上場しました。

社員の中には、自社が市場でどう思われてるか気になる人もいたりするもんです。

というわけで、Slackへその日の株価(始値/高値/安値/終値)をお知らせしています。

構成

平日19時前にビルドを実行してSlackへ通知しています。

当初はLambda(Python)で通知していたのですが、どのライブラリもうまく動かず、終値を手動で通知していました。

検証してみるとRのquantmodというパッケージであれば当日の株価も取得できることが判明。

というわけでCodeBuildにて、Dockerコンテナを動かし、Rのスクリプトを実行して通知することにしました。

ナゼCodeBuildか?

ところで、なぜCodeBuildなのかというと。。。

DockerなのでFargateでもいいのですが、VPC内起動するがパブリックIPがつかない!なのでNAT Gatewayが必要になりますが、1日1回SlackへPOSTするだけなのにNAT Gatewayはコスパが悪いので却下。うそです、つけれます。

AutoScalingが便利になったECSでええやんと、検証しましたがEC2インスタンスの1台 → 0台のスケールインがうまくいかない(絶賛検証中)。

Lambdaのカスタムランタイムはやったことがないので却下。

というわけでCodeBuildになりました。

Dockerなので後々ECS/Fargateへの移行もできちゃいます。

スクリプト

用意してCodeCommitへpushしたファイルは以下の3つのみ。これらをCodeCommitのリポジトリにプッシュしておきます。

  • buildspec.yml
  • Dockerfile
  • stock-price.R

1つずつみていきましょう。

buildspec.yml

CodeBuild のカスタム Docker イメージのサンプルちょっといじっただけです。

Dockerfile

ksmn/stock-baseというイメージをあらかじめ作成し、Docker hubへpushしておきました。このイメージには必要なライブラリはインストール済み、Rのパッケージはquantmod, XML, httr, 後々なにかに使えるのでは?とforecastも、もちろんその他依存関係のあるパッケージもインストール済みです。

事前に用意したのはRのパッケージインストールのときにコンパイル等で時間がかかるためです。

stock-price.R

Dockerfile内でENTRYPOINTに指定してるstock-price.Rはこんな感じ。当日と前日の株価を取得し(1日だけとろうとするとエラーになる)、当日のもののみincoming webhookでSlackチャンネルへPOSTします。URLとチャンネル名べた書きなのはご愛敬。

CodeBuild

まあ大した設定はしてないですが、1つだけ注意点が。

Dockerイメージをビルドする場合は特権付与をTureにしないといけません。

結果

CodeBuildがCloudWatch Eventで発火すると以下のように投稿されます。以下の画像は2020/01/24のものです。

まとめ

いかがしたでしょうか。CodeBuildはCIツールというイメージが強いかもしれませんが、結構いろんなことができちゃうもんです。私もCodeBuildの利用は初めてでしたが設定も簡単なので、これからどんどん使っていこうと思います。

AWS運用自動化サービス「Cloud Automator」