タイトルどおりですが、AWS Lambdaを使って、GitHubのWatchやアクティビティをTwitterに投げるlambda functionを書きました。

こんな感じでTwitterにGitHubのNotification(Watch)、アクティビティが流れます。

on Twitter

⚠ 注意: メインで使ってるGitHubアカウントのPersonal Tokenを使うとそのアカウントのNotificationとタイムラインが流れるので、privateの情報とかもなげられてしまうので注意です。

ローカルだけで完結したい場合は以下のようなクライアントで動くタイプのものを利用したほうが良いです。

GitHubのWatchやアクティビティは読むのが困難なデザインなので、基本読み飛ばしていいTwitterにまとめてしまうと楽な感じがしたので作りました。

自分が関係するような見逃したくない情報は、別の方法で見たほうがいいと思います。

導入はREADME通りにやっても動かない場合がありそうなので、そこは頑張って…(Pull Request下さい)

必要なもの

  • Apexのインストール
  • GitHub token(情報元)
  • Twitter token(ポスト先)
  • AWSのアカウント
  • lambda
  • dynamodb

インストール

 git clone https://github.com/azu/github-to-twitter-lambda.git
cd github-to-twitter-lambda/functions/notifications
npm install
npm run init
# dynamodbのテーブルを作る

dynamodbをロックファイル代わりというか、前回実行した時間の記録だけに使っています。 lambdaとdynamodbは毎月無料枠があるので、基本的にこのlambda functionでかかる費用は $0から$1以内になる感じです。 (2分に1回実行した場合)

Config

サンプルの設定があるのでコピーして編集します。

cp project.example.json project.json
  • role はApexのドキュメントに書かれてるようにlambdaの実行するRoleです
    • 後述するpolicyを持ったRoleを作って指定しています。
  • environmentは環境変数的な感じですが、ここにToken類を入れています。
    • 実行時に環境変数でも行けるはず
    "role": "arn:aws:iam::xxxxxxxxxxxx",
    "defaultEnvironment": "dev",
    "environment": {
        "GITHUB_TOKEN": "GitHub Person token need repo/notification/user",
        "TWITTER_CONSUMER_KEY": "app key",
        "TWITTER_CONSUMER_SECRET": "app secret",
        "TWITTER_ACCESS_TOKEN_KEY": "token key",
        "TWITTER_ACCESS_TOKEN_SECRET": "token  secret"
    }

Lambda role policy

Lambda(role": "arn:aws:iam::xxxxxxxxxxxx")のroleは次のpolicyをもたせています。 "lambda:*""cloudwatch:*"があればとりあえず動く気がします。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Action": [
                "dynamodb:*",
                "lambda:*",
                "logs:*",
                "cloudwatch:*",
                "autoscaling:Describe*"
            ],
            "Effect": "Allow",
            "Resource": "*"
        }
    ]
}

Deploy

Apexを使ってデプロイします。 aws configure とかで awsのAPIキーとかを設定しておかないと当然デプロイできません。

apex deploy notifications

詳細はApexのドキュメントや以下を見て下さい。

Test

ローカルでdry-runしたい場合は test.js というのがあるのでそれを実行するといけます(実際にpostはしない)

cd functions/notifications
npm test

Apexを使って、手元からlambdaを叩いてテストもできます。

apex invoke notifications

Cron

lambdaはデフォルトだと1回実行して終わりなので繰り返し実行させて動かします (lambdaの実行回数による料金は基本無料枠で納まります)

スケジュールされたイベントでの AWS Lambda の使用 - AWS Lambdaを使うことで、Cron的に繰り返し実行を設定できます。

自分は2分に一度とかに設定しています。

image

まとめ

  • GitHubのWatchは破綻してる
  • GitHub -> Twitter
  • TwitterでGitHubを読めるようにした
  • Slackは未読に厳しい
  • 未読を読み飛ばしやすいのはやっぱりTwitterかRSSリーダー
  • RSSリーダーもコンテキストが異なる物量には弱い
  • TweetIrcGatewayっぽい
  • それぞれのコンテキストにあった読みやすさがあるので、読みやすい場所に読みたいものを置く
  • そういう土管ツールが簡単につくれるともっと良さそう
  • hoist.io とかそういうサービスの類