【Slack】新しいチャンネルが作成されたら通知できるようにしてみた!
社内でもSlackを導入しているのですが
新しいチャンネルが作成されても気づくことができず
後にこんなチャンネルがあったのか!?
ということがしばしばあったので
新しいチャンネルが作成されたら通知する仕組みを作ってみました😊
作成した構成
プログラムを書いてそれをサーバに配置しておくというパターンではなく
Slack Appを使用し、さらにサーバレスで実装してみました!
⑴API GatewayとLambdaの設定
API Gateway
* メソッドは「POST」
* 統合リクエストの「統合タイプ」は「Lambda関数」を設定
Lambda
* 言語は「Node.js 6.10」
* Slack Appとの連携確認が必要なため、一旦下記のコードで作成
exports.handler = (event, context, callback) => { context.succeed(event["body-json"]); };
⑵Slack Appを作成
下記URLにアクセスし、「Start Building」をクリック
https://api.slack.com/
「App Name」と「Development Slack Team」を入力し、「Create App」をクリックすると…
アプリケーションが作成されました!
⑶Slack Appの設定 −その1− Bot User
続けてアプリケーションの設定をしていきます
メニューから「Bot Users」を選択
「Default username」にBotのユーザ名を入力
Botをリアルタイムに処理させるため
「Always Show My Bot as Online」を「On」にする
最後に「Add Bot User」をクリックして保存します
⑷Slack Appの設定 −その2− Event Subscriptions
メニューから「Event Subscriptions」を選択
「Enable Events」を「On」にして
「Request URL」に⑴API GatewayとLambdaを設定するで作成した
API Gatewayのエンドポイントを入力します
しばらくして「Verified」になればOKです!
ここで「Verified」にならなければLambdaのコードか
API Gatewayの設定にミスがあるかもしれませんーーー😥
少し下にいって「Subscribe to Bot Events」に
「channel_created」のイベントを追加します
最後に「Save Changes」をクリックして保存します
⑸Slack Appの設定 −その3− Install App
メニューから「Install App」を選択
「Install App to Team」をクリック!
アプリケーションインストールの確認画面が表示されるので
問題なければ「Authorize」をクリックします
インストールされるとSlackの画面で
アプリケーションが起動しているのを確認できます
⑹プログラムの作成
作成された新しいチャンネルを通知するコードを書いていきますー
その前に…Botのtokenが必要なのでそれをメモしておきます
メニューから「OAuth & Permissions」を選択して
「Bot User OAuth Access Token」に書かれているtokenをメモメモ。。
いよいよコードの作成!
今回はBotkitを使って作成しました
Botkitのインストール方法はこちらの記事を参考にさせていただきました!
http://blog.duck8823.com/entry/2016/05/20/005734
コードはいたってシンプル↓
# vi index.js //slack settings var Botkit = require('botkit'); var controller = Botkit.slackbot({ debug: true }); var bot = controller.spawn({ token: <メモしたBotのtoken> }); // slack new channnel exports.handler = (event, context, callback) => { var channelName = event["body-json"]["event"]["channel"]["name"] bot.say({ text: 'new channel: #' + channelName, link_names: 1, channel: 'C2XXXX' //通知するチャンネルID }); };
作成したコードをzipにします
# zip -r xxxx.zip index.js node_modules
zipファイルをLambdaにアップロードすれば完了です!
⑺新しいチャンネルを作成すると通知されるか確認
早速動作するか確認しましょう
おっ!無事に新しいチャンネルの通知が来ました〜
感想
今回作成したものはPublicチャンネルのみ通知されます
もともとPrivateチャンネルは通知されないみたいです
Botのアクションをトリガーにして
他にも様々な仕掛けを作ることができそうです🤗
JAWS DAYS 2017で登壇してきました!
VPC内からLambdaを実行する際のハマりどころ
VPC内のLambdaからEC2 Run Commandを実行しようとしたら、下記のエラーが出ました
Request has been terminated Possible causes: the network is offline, Origin is not allowed by Access-Control-Allow-Origin, the page is being unloaded, etc.
また、ログを確認すると、時間めいいっぱい使っている様子
Task timed out after 300.00 seconds.
試しにマネジメントコンソールから実行すると、即「Success」が返ってきたので 権限周りやコードに問題はなさそう…
しばらくして気が付きました
Lambdaがプライベートサブネット内にいる!
つまり、LambdaがEC2 Run Commandを実行する際に インターネットに接続できる環境でないとダメ!!
ということで、この場合はパブリックサブネットに NATサーバ or NAT Gatewayを立てれば問題なしでした^^
というか、サブネットの選択を間違えたかな。。 この場合はパブリックサブネットにLambdaを置くのがベストプラクティスになるのでしょうかー
【JAWS-UG CLI】 #64 ALB入門 に参加しました!
Lambdaで最新AMIを取得する!(Python)
Lambda(python)で最新AMI IDを取得するプログラムを書きました。
Windowsは「Windows Servier 2012 R2 Base」、Linuxは「Amazon Linux」の最新AMI IDを取得してます。 Filters部分をカスタマイズしてもらえれば、その他にも使えると思います!
import boto3 def lambda_handler(event, context): client = boto3.client('ec2') response = client.describe_images( Owners=['amazon'], Filters=[ { 'Name': 'root-device-type', 'Values': ['ebs'] }, { 'Name': 'architecture', 'Values': ['x86_64'] }, { 'Name': 'name', 'Values': ['Windows_Server-2012-R2_RTM-Japanese-64Bit-Base*'] } ] ) list = [] for x in response["Images"]: name = x["Name"] ami_id = x["ImageId"] list.append([name, ami_id]) list.sort(key=lambda x:x[0], reverse=True) print list[0][1]
import boto3 def lambda_handler(event, context): client = boto3.client('ec2') response = client.describe_images( Owners=['amazon'], Filters=[ { 'Name': 'root-device-type', 'Values': ['ebs'] }, { 'Name': 'architecture', 'Values': ['x86_64'] }, { 'Name': 'block-device-mapping.volume-type', 'Values': ['standard'] }, { 'Name': 'name', 'Values': ['amzn-ami-hvm*'] } ] ) list = [] for x in response["Images"]: name = x["Name"] ami_id = x["ImageId"] list.append([name, ami_id]) list.sort(key=lambda x:x[0], reverse=True) print list[0][1]
【備忘録】CloudWatchLogsのロググループ作成とログ保持期間を変更するワンライナー
以前、【備忘録】CloudWatchLogsのログ保持期間を変更するワンライナーを投稿しましたが、 今回は、少しバージョンアップして、CloudWatchLogsのロググループ作成とログ保持期間を変更するワンライナーです!
for LOGGROUPNAME in $(cat <CloudWatchLogsのロググループ名を入れたファイル>) ;do aws logs create-log-group --region ap-northeast-1 --log-group-name ${LOGGROUPNAME} && aws logs put-retention-policy --region ap-northeast-1 --log-group-name ${LOGGROUPNAME} --retention-in-days <ログ保持期間>;done
※事前に<CloudWatchLogsのロググループ名を入れたファイル>を作成しておいてください!
【備忘録】CloudWatchLogsのログ保持期間を変更するワンライナー
CloudWatchLogsのログ保持期間を変更するワンライナーです。
aws logs describe-log-groups --region ap-northeast-1 --query 'logGroups[].logGroupName' --output text| tr '¥t' '¥n' | while read LOGGROUP; do aws logs put-retention-policy --region ap-northeast-1 --log-group-name ${LOGGROUP} --retention-in-days 7; done
ロググループが50個ほどあったので楽チンに変更できました(°∀° )/