明けましておめでとうございます。
新年早々少し個人で開発したのでそのアウトプットとして投稿させていただきます。
全てのツールを無料枠で抑えて作ることができるので、個人で開発してデプロイまでしてみたいと思っている人に参考になれば良いなと思います。
作ったもの
草(commit)がされていない場合にはその日の夕方に通知を送ってくれるLineのBOTを作りました。
Githubリンク
作成動機
- 新たな年が始まって、より成長できる年にしたく継続を促せるようなものを作りたかった。
- これまで触れていないものを使って何か作ろう、自分の技術の幅を広げようと思ったから。(Goも含めて全て開発で使ったことはなかったです。)
使用技術・構成
- AWS Event Bridge (cron)
- AWS Lambda
- Line Notify
- Github GraphQL
- Golang
(コンテナ化(Docker)は図に乗っていますが、現在進行中です。。😅 別で続きとして記事にします。)
説明
Event Bridgeでcronの設定をし、1日に1回Lamdaの関数を発火させています。
LamdaではGoで作成した関数が走り、Github GraphQLから当日分のcommit数を取得し、草があるかを確認します。
ないことがわかった場合にはLine Notifyでユーザー(自分)に向けて通知を行なっています。
使用技術・参考記事の紹介
Lambda & Event Bridge
Lambdaは関数を定義して、イベントがその関数に対して走った際に、実行を行うサービスです。Event Bridgeは特定のイベントが検知された時や、定期実行(cron)などで設定している時間にイベントを実行してくれるサービスです。
この二つを組み合わせることで、関数の定期実行をすることができます。
実行のログがcloudWatchに自動的に保存されていたのでバグやエラーにも気がつくことができます。
EC2等でアプリケーションをデプロイするのに比較するとはるかに手間も少ないですし、どちらも1日1回程度だとお金はかからないのでぜひ使ってみていただきたいです!
少し躓いたところ
Lambdaデプロイ時に、コードをビルドしてバイナリを生成する必要があるのですが、筆者はM1のmacを使用しており、m1で生成されるバイナリはlambdaとの互換性がないことがわかりました。
ですのでm1ユーザーの方は以下のコマンドでLambda互換のものを生成する必要があります。
通常
GOOS=linux go build -o main
mac M1
GOOS=linux GOARCH=amd64 go build -o main
参考
Github GraphQL
GithubはRest APIとGraphQLからAPIを公開していますが、今回のように草を取得したい場合にはGraphQLの方を使う必要があります。
今回はその日のコミットがあるかを確認したかったので、contributionsCollectionのfromとtoをその日の最初と最後の時刻にすることで対応しました。
query := `
query($userName: String!, $from: DateTime!, $to: DateTime!) {
user(login: $userName) {
contributionsCollection(from: $from, to: $to) {
contributionCalendar {
totalContributions
weeks {
contributionDays {
contributionCount
date
}
}
}
}
}
}
`
variables := map[string]interface{}{
"userName": os.Getenv("GITHUB_USER"),
"from": startOfTodayStr,
"to": endOfTodayStr,
}
今回はuser情報の取得しかしていませんが、様々な用途に使えるので個人開発したい人にはおすすめです。
参考
Line Notify
Line Notifyは自分のLINEアカウントに対してメッセージを送信できるサービスです。
先ほどあげたデモの画像のように、メッセージやLINEスタンプを簡単に送信することができます。
Line Messaging APIのpush message機能を使うと料金がいくらかかかってしまう可能性があるので、お金をかけずに開発したいという人におすすめです。
参考
まとめ
今回様々なものを初めて使ってみましたが、どれも素晴らしいサービスだなと思いました。
自分ようなので無料で作れたのもまた良かったなと思います。
特にLine Notifyはめちゃめちゃ簡単だったので、様々なことにサクッと導入できそうだなと思いました。