0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

PythonでSlackのチャンネルにメンション付き投稿

Posted at

はじめに

この記事では、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

構成図

構成図.png

フォルダ構成

プロジェクトルート(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する

  1. cloneする

    Git Bush
    git clone git@github.com:sasayakado/lambda_slack_notification.git
    
    
  2. VSCodeでプロジェクトルートを開く

  3. .env_sampleを.envにreneame

  4. .envに自分の環境変数を設定

.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>'

  ↓ こんな風になる

.env
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.アプリの追加と確認

  • Slackを開いて、ワークスペースの横にある下矢印をクリックして「App」を選択する
    slcak_1.png

  • 検索ウィンドウに「webhooks」と入力して検索し、「Incoming WebHooks」を追加する
    slcak_2_2.png

  • Slackに追加をクリックする
    slcak_3_2.png

  • 投稿したいチャンネル(今回は、「random」)を選択する
    slcak_4_2.png

  • 利用規約を読んで、問題なければ、「Incoming WebHookインテグレーションの追加」をクリックする
    slcak_5_2.png

  • WebHook URLの「URLをコピーする」を押して、コピーしたのを.envの★9に貼り付ける

SLACK_URL=★9

 ↓
SLACK_URL=https://hooks.slack.com/services/XXX
slcak_7_2.png

警告
.envを修正した際には、一度開発コンテナを閉じて、既存コンテナ・イメージを削除後、再度開発コンテナを作り直してください。
delete-container-image.shを実行すれば既存コンテナ・イメージを削除出来ます。

  • 変更したい場合は、名前とアイコンをカスタマイズする
    slcak_8_2.png

  • 実際に設定されたか確認するために、「App」を選択し、カスタマイズした名前のアプリをクリックする
    slcak_9_2.png

  • 「設定」をクリックする
    slcak_10_2.png

  • 「設定」タブを開いて、カスタマイズした名前、投稿したいチャンネル名、アイコンが合っているか確認する
    slcak_11_2.png

  • チャンネルの「random」を開くと、「このチャンネルに次のインテグレーションを追加しました:カスタマイズした名前」と出ている
    slcak_12_2.png

2.メンション対象の取得と設定

  • メンション対象を指定するために、メンションしたい人のプロフィールを開く
    slcak_13_2.png

  • メンバーIDをコピーして、.envの★10に貼り付ける。

SLACK_USERID=★10


SLACK_USERID='<!UXXXXX>'
もし、特定の相手ではなくて、チャンネル全体に対してメンションして投稿したい場合は、'<!channel>'を設定する

警告
.envを修正した際には、一度開発コンテナを閉じて、既存コンテナ・イメージを削除後、再度開発コンテナを作り直してください。
delete-container-image.shを実行すれば既存コンテナ・イメージを削除出来ます。

slcak_14_2.png

3.ローカル環境でSlackに投稿する

  • 開発コンテナを起動して、lambda_function.pyを実行する
    slcak_16_2.png
    ターミナルでの実行結果
    slcak_17_1.png

  • Slackの対象チャンネルに、メンション付きで投稿されているのを確認する
    slcak_15_2.png

インフォメーション
ここから先は、AWS Lambdaで実行したい人だけが行ってください

4.AWS LambdaでSlackに投稿する

  • ECRにプライベートリポジトリを作る。
    slcak_20_2.png

開発コンテナを閉じて、プロジェクトルートフォルダを開き、下記を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

実行結果
slcak_19_2.png

  • ECRにイメージが出来るので、そのイメージを選択したLambdaを作る
    slcak_21_1.png

  • Lambda設定タブで、環境変数に、.envにある★9と★10を設定する
    slcak_22_2.png

  • Lambdaをテスト実行する
    slcak_23_1.png

  • Slackの対象チャンネルに、メンション付きで投稿されているのを確認する
    slcak_24_2.png

  • ★10にチャンネルを設定した場合は、@channelとして投稿される
    slcak_25_2.png

おしまい。

プログラム解説

lambda_function.py

PG Slack
slcak_26_2.png slcak_26_2.png
slcak_26_4.png
  • ①メッセージを設定
lambda_function.py
msg = f'現在「{today_time_str}」です。 \nテストメッセージ'
  • ②タイトルを設定
lambda_function.py
title = f"{today_str}テストタイトル"
  • ②タイトルと、③メンション対象&①メッセージを引数に、send_slackを呼ぶ
lambda_function.py
send_slack(title, f"{SLACK_USERID}\n{msg}")
lambda_function.py
"color": "#36a64f"

 ↓

lambda_function.py
"color": "#a63c36"

slcak_27_2.png

まとめ

エラーが起きた時の通知先をSlackにするとかが使い道として考えられそうです。
私はLambdaの定期実行を設定して、Webスクレイピングした結果を定期的にSlackに送ってます。

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?