はじめに
Lambda から Slack への通知は昔からこすられてるネタですが、わざわざ AWS SAM CLI
を使って検証している方は少ないように思います。そこで今回は Slack 通知の Lambda を AWS SAM CLI で簡単に作成してみようと思います。
対象環境とユーザー
- macOS Catalina
- Slack ユーザー
- Python ユーザー
- Docker がインストールされている(AWS SAM CLI を使うために必須)
手順
AWS CLI のインストール
私は Python の Pipenv で AWS CLI を管理しています。過去に記事を書いているので必要に応じて参照してもらえればです。
AWS SAM CLI をインストール
pipenv を前提にしていますがご了承ください。Pip でも基本的に変わらないので読み替えてください。
1$ pipenv install aws-sam-cli
2$ sam --version
3SAM CLI, version 0.45.0 # 2020/03時点
SAM のプロジェクトを作成
今回は Hello World の基本的なプロジェクト構成で初期化します。また、Lambda は Python で作成します。下記のハイライトの部分に注意して入力してもらえればです。
1$ sam init
2
3Which template source would you like to use?
4 1 - AWS Quick Start Templates
5 2 - Custom Template Location
6Choice: 1
7
8Which runtime would you like to use?
9 1 - nodejs12.x
10 2 - python3.8
11 3 - ruby2.7
12 4 - go1.x
13 5 - java11
14 6 - dotnetcore2.1
15 7 - nodejs10.x
16 8 - python3.7
17 9 - python3.6
18 10 - python2.7
19 11 - ruby2.5
20 12 - java8
21 13 - dotnetcore2.0
22 14 - dotnetcore1.0
23Runtime: 2
24
25Project name [sam-app]: sample
26
27Cloning app templates from https://github.com/awslabs/aws-sam-cli-app-templates.git
28
29AWS quick start application templates:
30 1 - Hello World Example
31 2 - EventBridge Hello World
32 3 - EventBridge App from scratch (100+ Event Schemas)
33Template selection: 1
34
35-----------------------
36Generating application:
37-----------------------
38Name: sample
39Runtime: python3.8
40Dependency Manager: pip
41Application Template: hello-world
42Output Directory: .
43
44Next steps can be found in the README file at ./sample/README.md
Slack API で Incomming Webhooks を作成
私がだらだら説明するより公式の手順を見てもらえればです。ただし、注意していただきたいのは OAuth & Permissions
で chat:message
API を作成するのではなく、今回は Incomming Webhooks
で Slack に通知することを対象としています。ここら辺はこちらの記事が大変参考になるので、是非ご一読ください。
AWS SAM で作成された template.yaml を編集
初期状態の template.yaml をそのままデプロイしてしまうと API Gateway などの不要なリソースが作成されてしまうので下記のように編集してもらえればです。コメントや api を作成する event を削除して、CodeUri
を Sample/
に変更しています。
1AWSTemplateFormatVersion: "2010-09-09"
2
3Transform: AWS::Serverless-2016-10-31
4
5Description: >
6 sample
7
8 SAM Template for SlackNotification
9Globals:
10 Function:
11 Timeout: 3
12
13Resources:
14 SampleFunction:
15 Type: AWS::Serverless::Function
16 Properties:
17 CodeUri: Sample/
18 Handler: app.lambda_handler
19 Runtime: python3.8
20
21Outputs:
22 SampleFunctionId:
23 Description: "Sample Lambda Function Logical Id"
24 Value: !Ref SampleFunction
また、 template.yaml に添うようにプロジェクト内の hello_world/
ディレクトリを Sample/
に変更してください。
1$ cd sample
2$ mv hello_world Sample
Slack 通知用の Lambda を作成
今回は requests ライブラリは使わず標準ライブラリの urllib を使っています。WEBHOOK_URL
は先ほど作成した Incomming Webhooks を設定してください。
1import json
2import urllib.request
3
4
5WEBHOOK_URL = "https://hooks.slack.com/services/***/***/******"
6
7def lambda_handler(event, context):
8
9 try:
10
11 send_data = {
12 "text": "test",
13 }
14
15 send_text = "payload=" + json.dumps(send_data)
16
17 request = urllib.request.Request(
18 WEBHOOK_URL,
19 data=send_text.encode('utf-8'),
20 method="POST"
21 )
22
23 with urllib.request.urlopen(request) as response:
24 response_body = response.read().decode('utf-8')
25
26 except requests.RequestException as e:
27
28 print(e)
29 raise e
SAM を Build して試しに通知テスト
ソースや template.yaml を編集した場合は、sam build
を必ずするようにして下さい。基本的なことですが、編集が反映されず何故か動かないみたいな初歩的なことを防げます 💦
sam local invoke
でローカル環境から Slack に通知するテストが行えます。(内部的には AWS 環境をコンテナ起動して、コンテナ上で用意したリソースを展開しているようです)
1$ sam build
2
3# ローカル環境でテストしたい場合
4$ sam local invoke
SAM をデプロイして本番環境で通知テスト
ローカルで Slack に通知できた場合は、SAM を AWS にデプロイします。初期のデプロイ時は -g
を引数として与えます。下記でハイライトした部分を必要に応じた項目を入力して下さい、基本的には Stack Name
を適当なものに変更すればそのままで良いと思います。
1$ sam deploy -g
2
3Configuring SAM deploy
4======================
5
6 Looking for samconfig.toml : Not found
7
8 Setting default arguments for 'sam deploy'
9 =========================================
10 Stack Name [sam-app]: sample
11 AWS Region [us-east-1]: ap-northeast-1
12 #Shows you resources changes to be deployed and require a 'Y' to initiate deploy
13 Confirm changes before deploy [y/N]: N
14 #SAM needs permission to be able to create roles to connect to the resources in your template
15 Allow SAM CLI IAM role creation [Y/n]: Y
16 Save arguments to samconfig.toml [Y/n]: Y
17
18 Looking for resources needed for deployment: Found!
19
20 Managed S3 bucket: aws-sam-cli-managed-default-samclisourcebucket-e5okhc6znmgs
21 A different default S3 bucket can be set in samconfig.toml
22
23~~以下略~~
デプロイ後に、コンソールから Lambda の管理画面に移動してテスト通知して見てください。