slack投稿時にlambdaを実行させる。その後、投稿内容をS3に保存
1, lambda関数を作って、関数URLでWeb公開
APIゲートウェイ無しで出来るから楽!
https://XXXXXXXXXXXX.lambda-url.ap-northeast-1.on.aws/
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
import json def lambda_handler(event, context): # Slackからのリクエストのbodyを取得し、JSONとして解析 slack_event = json.loads(event['body']) # Slack からのイベントの検証(URL検証) if 'challenge' in slack_event: # challenge 値をレスポンスとして返す return { 'statusCode': 200, 'headers': { 'Content-Type': 'application/json', }, 'body': json.dumps({'challenge': slack_event['challenge']}) } |
2, slackアプリを作って、Event Subscriptionsを有効にし、Lambda 関数のエンドポイント URL を指定
https://api.slack.com/apps
VerifiedになればOK。チャレンジ・レスポンス処理は、最初のURL入力時だけで、後は不要。
チャレンジ(最初の検証)が失敗すると、以下のように表示されるので、lambda関数を作り直し
Request URL Your URL didn’t respond with the value of the challenge parameter.
読み取り権限も付与
Subscribe to events on behalf of usersの
Add Workspace Eventボタンを押して、message.channels(公開チャネルの投稿メッセージ)を追加。
このアプリをインストールしたワークスペースでの公開チャネルにメッセージ投稿されるたびに、lambdaがコールされるようになる。
3, 投稿内容を保存するS3バケットを生成
4, lambdaにS3保存ポリシーを作成して、lambdaロールに付与
アクションは、PutObjectだけ
arn:aws:s3:::your-backet-name
5, lambdaコードを書き換えて、テストコードを実行してみる。S3にファイルが保存されていればOK!
※ユーザIDをファイル名にしているので、毎回上書きされる…。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
import json import boto3 import urllib.parse # S3 クライアントを初期化 s3_client = boto3.client('s3') bucket_name = '' # S3 バケット名を指定 def lambda_handler(event, context): try: # Slack からのイベントを処理 slack_event = json.loads(event['body']) message = slack_event['event']['text'] # メッセージの内容を取得 user_id = slack_event['event']['user'] # ユーザー ID を取得 # ファイル名として使用するためにユーザー ID をエンコード file_name = urllib.parse.quote_plus(user_id) + '.txt' # S3 にメッセージ内容を保存 s3_client.put_object(Bucket=bucket_name, Key=file_name, Body=message) # Slack に処理成功を通知 return { 'statusCode': 200, 'body': json.dumps('Message saved to S3') } except Exception as e: print(f"Error saving message to S3: {str(e)}") # エラーが発生した場合は、Lambda関数の実行結果としてエラーメッセージを返す return { 'statusCode': 500, 'body': json.dumps(f"Error saving message to S3: {str(e)}") } |
lambdaのテストJSON
s3にファイル保存されるか確認する
1 2 3 |
{ "body": "{\"token\":\"あなたのアプリの検証トークン\",\"team_id\":\"T0001\",\"api_app_id\":\"A0001\",\"event\":{\"type\":\"message\",\"user\":\"U2147483697\",\"text\":\"Hello world\",\"ts\":\"1234567890.123456\",\"channel\":\"C2147483705\",\"event_ts\":\"1234567890.123456\",\"channel_type\":\"channel\"},\"type\":\"event_callback\",\"event_id\":\"Ev08MFMKH6\",\"event_time\":1234567890,\"authed_users\":[\"U2147483697\"]}" } |
6, 実際のslack投稿がS3保存されるようにする
作成したSLACKアプリを、自分のワークスペースにインストールする必要がある。