GitHub.com 上でコメントでメンションした相手に Slack DM 通知をする機能を構築する severless framework プロジェクトです。
-
Nodejs 8.10.0
- nodenv で調整可能です。
- v8.10.0 は 2019.02 時点 AWS Lambda Nodejs 最新バージョンです。
-
serverless framework インストール
npm install -g serverless
-
aws-sdk インストール
npm install
-
yaml_vault インストール
bundle install -j4 --path vendor/bundle
-
direnv インストール
こちらはあくまで 1 方法ですので、その他方法があればそちらを採用ください。echo -n 'export AWS_ACCESS_KEY_ID=HOGEFUGA' >> .envrc echo -n 'export AWS_SECRET_ACCESS_KEY=BUDOUBAR' >> .envrc direnv allow .
Organization の Webhook を作成します。
設定項目 | 内容 |
---|---|
Playload URL | 仮設定で良いです (ex. https://hoge )。 後ほど設定します。 |
Content type | application/json |
Secret | 認証の際に必要なパスワード情報です。 適当なランダム値を設定してください。 |
以下イベントを対象としました。
- Commit comments
- Issue Commit
- Pull requests
- Pull request reviews
- Pull request review comments
- KMS キー作成
aws kms create-key
{
"KeyMetadata": {
"AWSAccountId": "123456789012",
"KeyId": "yyyyyyyyyyyyyyyyyyyyyyyy",
"Arn": "arn:aws:kms:ap-northeast-1:xxxxxxxxxxx:key/yyyyyyyyyyyyyyyyyyyyyyyy",
"CreationDate": 1549615619.872,
"Enabled": true,
"Description": "",
"KeyUsage": "ENCRYPT_DECRYPT",
"KeyState": "Enabled",
"Origin": "AWS_KMS",
"KeyManager": "CUSTOMER"
}
}
- キーエイリアス作成
aws kms create-alias \
--alias-name alias/github2slack \
--target-key-id yyyyyyyyyyyyyyyyyyyyyyyy
- GITHUB_WEBHOOK_SECRET の暗号化
aws kms encrypt \
--key-id arn:aws:kms:ap-northeast-1:xxxxxxxxxxx:key/yyyyyyyyyyyyyyyyyyyyyyyy \
--plaintext "<GITHUB_WEBHOOK_SECRET>" \
--query 'CiphertextBlob' \
--output text
- SLACK_INCONMING_WEBHOOK_URL 暗号化
aws kms encrypt \
--key-id arn:aws:kms:ap-northeast-1:xxxxxxxxxxx:key/yyyyyyyyyyyyyyyyyyyyyyyy \
--plaintext "<SLACK_INCONMING_WEBHOOK_URL>" \
--query 'CiphertextBlob' \
--output text
上記の値を以下に設定します。
- secrets.yml
GITHUB_WEBHOOK_SECRET_ENCRYPTED: hogehoge...
SLACK_INCONMING_WEBHOOK_URL_ENCRYPTED: mogemoge....
AWS_KMS_KEY_ARN: arn:aws:kms:ap-northeast-1:xxxxxxxxxxx:key/yyyyyyyyyyyyyyyyyyyyyyyy
env \
AWS_ACCESS_KEY_ID=${AWS_ACCESS_KEY_ID} \
AWS_SECRET_ACCESS_KEY=${AWS_SECRET_ACCESS_KEY} \
bundle exec yaml_vault encrypt \
--cryptor=aws-kms \
--aws-region=ap-northeast-1 \
--aws-kms-key-id=alias/githubcom2slack \
secrets.yml -o secrets.yml.enc
env \
AWS_ACCESS_KEY_ID=${AWS_ACCESS_KEY_ID} \
AWS_SECRET_ACCESS_KEY=${AWS_SECRET_ACCESS_KEY} \
bundle exec yaml_vault decrypt \
--cryptor=aws-kms \
--aws-region=ap-northeast-1 \
--aws-kms-key-id=alias/githubcom2slack \
secrets.yml.enc -o secrets.yml
env \
AWS_ACCESS_KEY_ID=${AWS_ACCESS_KEY_ID} \
AWS_SECRET_ACCESS_KEY=${AWS_SECRET_ACCESS_KEY} \
bundle exec yaml_vault decrypt \
--cryptor=aws-kms \
--aws-region=ap-northeast-1 \
--aws-kms-key-id=alias/githubcom2slack \
secrets.yml.enc -o secrets.yml
sls deploy -v
sls info
Service Information
service: githubwebhook2slack
stage: production
region: ap-northeast-1
api keys:
None
endpoints:
POST - https://xxxxxxxxxxx.execute-api.ap-northeast-1.amazonaws.com/production/webhook
functions:
githubWebhookListener: githubwebhook2slack-production-githubWebhookListener
はじめに作成した GitHub Webhook の Playload URL
に
上記 https://xxxxxxxxxxx.execute-api.ap-northeast-1.amazonaws.com/production/webhook
を設定してください。
GitHub.com のプルリクエストでメンションします。
するとすぐに Slack DM 通知がきます。
Lambda のログが CloudWatch Logs に流れてますので、ログを確認してください。
そもそもログが出ていないのであれば、 Webhook の設定忘れや URL に誤りがある等チェックしてみてください。
以上です。