はじめに
この記事では、PythonでSlackのチャンネルにメンション付きで投稿する方法を載せています。
ローカル環境での実行だけでなく、ローカル環境で作ったイメージをAWS ECRリポジトリにUploadして、そのイメージを使って作ったAWS Lambdaでも実行出来るようにしています。
背景
Webスクレイピングなどをしていると、結果をslackやメールに送りたくなる時があります。
slackについてはメンション付きだと気付きやすいので、今回は、slackのチャンネルにメンション付きで投稿する方法についてまとめました。
目次
環境
-
ローカル
OS Windows11 Docker Dockerデスクトップ 開発ツール Visual Studio Code 言語 Python3.8 -
クラウド:AWS
- AWS Lambda
- Amazon Elastic Container Registry(ECR)
-
その他サービス:Slack
前提条件
下記の過去記事を参考に環境設定をしていることを前提条件とします。
また、過去記事で説明している部分は説明を省略します。
Windows&Docker開発環境で作ったImageをそのままAWS Lambdaにのせる方法
https://qiita.com/sasayakadopono/items/cfc7479fff3b685b3932
構成図
フォルダ構成
プロジェクトルート(D:\src\lambda_slack_notification)
├─.devcontainer
│ ├─ devcontainer.json
│ └─ settings.json
├─app
│ ├─ date_utility.py
│ ├─ lambda_function.py
│ └─__init__.py
├─ .dockerignore
├─ .env
├─ .gitignore
├─ awscli.sh
├─ delete-container-image.sh
├─ docker-compose.yml
├─ Dockerfile
├─ README.md
└─ requirements.txt
GitHub
手順
1.GitHubよりcloneする
-
cloneする
Git Bushgit clone git@github.com:sasayakado/lambda_slack_notification.git
-
VSCodeでプロジェクトルートを開く
-
.env_sampleを.envにreneame
-
.envに自分の環境変数を設定
AWS_ACCESS_KEY=★1
AWS_SECRET_ACCESS_KEY=★2
AWS_ACCOUNT_ID=★3
AWS_DEFAULT_REGION=★4
IMAGE_TAG=★5
DOCKER_IMAGE_NAME=★6
DOCKER_CONTAINER_NAME=★7
LAMBDA_FUNC_NAME=★8
SLACK_URL=★9
SLACK_USERID=★10
★ | 変数 | 設定内容 |
---|---|---|
1~8 | 説明省略 | 過去記事参照 |
9 | SLACK_URL | 後で説明 |
10 | SLACK_USERID | 特定の人へメンションする場合は後で説明 チャンネルにメンション(@channel)で投稿したい場合は '<!channel>'
|
↓ こんな風になる
AWS_ACCESS_KEY=★自分のAWS_ACCESS_KEY
AWS_SECRET_ACCESS_KEY=★自分のAWS_SECRET_ACCESS_KEY
AWS_ACCOUNT_ID=★自分のAWS_ACCOUNT_ID
AWS_DEFAULT_REGION=ap-northeast-1
IMAGE_TAG=latest
DOCKER_IMAGE_NAME=slack-image
DOCKER_CONTAINER_NAME=slack-container
LAMBDA_FUNC_NAME=slack-lambda
SLACK_URL=★https://hooks.slack.com/services/XXXなど
SLACK_USERID=★'<!channel>'など
2.Slackの設定
1.アプリの追加と確認
-
WebHook URLの「URLをコピーする」を押して、コピーしたのを.envの★9に貼り付ける
SLACK_URL=★9
↓
SLACK_URL=https://hooks.slack.com/services/XXX
警告
.envを修正した際には、一度開発コンテナを閉じて、既存コンテナ・イメージを削除後、再度開発コンテナを作り直してください。
delete-container-image.shを実行すれば既存コンテナ・イメージを削除出来ます。
2.メンション対象の取得と設定
SLACK_USERID=★10
↓
SLACK_USERID='<!UXXXXX>'
もし、特定の相手ではなくて、チャンネル全体に対してメンションして投稿したい場合は、'<!channel>'
を設定する
警告
.envを修正した際には、一度開発コンテナを閉じて、既存コンテナ・イメージを削除後、再度開発コンテナを作り直してください。
delete-container-image.shを実行すれば既存コンテナ・イメージを削除出来ます。
3.ローカル環境でSlackに投稿する
インフォメーション
ここから先は、AWS Lambdaで実行したい人だけが行ってください
4.AWS LambdaでSlackに投稿する
開発コンテナを閉じて、プロジェクトルートフォルダを開き、下記をgit bashで実行
source awscli.sh
その際、awscli.shの下記部分をコメントアウトしてから実行(Lambdaを作っていないのでエラーになる)
# ECRにプッシュしたイメージをlambdaに更新
#aws lambda update-function-code --function-name $LAMBDA_FUNC_NAME --image-uri #$AWS_ACCOUNT_ID.dkr.ecr.$AWS_DEFAULT_REGION.amazonaws.com/$DOCKER_IMAGE_NAME:$IMAGE_TAG > /dev/null 2> /tmp/aws_lambda_error.log
#if [ $? -eq 0 ]; then
# echo "lambda update success"
#else
# # エラーメッセージを表示する
# cat /tmp/aws_lambda_error.log
# exit 1
#fi
-
★10にチャンネルを設定した場合は、@channelとして投稿される
おしまい。
プログラム解説
lambda_function.py
PG | Slack |
---|---|
|
- ①メッセージを設定
msg = f'現在「{today_time_str}」です。 \nテストメッセージ'
- ②タイトルを設定
title = f"{today_str}テストタイトル"
- ②タイトルと、③メンション対象&①メッセージを引数に、send_slackを呼ぶ
send_slack(title, f"{SLACK_USERID}\n{msg}")
-
セカンダリ メッセージを送っている
参照:Reference: Secondary message attachments
https://api.slack.com/reference/messaging/attachments
-
④横棒の色を変えられる
"color": "#36a64f"
↓
"color": "#a63c36"
まとめ
エラーが起きた時の通知先をSlackにするとかが使い道として考えられそうです。
私はLambdaの定期実行を設定して、Webスクレイピングした結果を定期的にSlackに送ってます。