サイトアイコン

toLog

AWS SAM CLIでSlack通知のLambdaを簡単に開発・デプロイ

  • 更新日:
  • 投稿日:
サムネイル

この記事は最終更新日から4年以上が経過しています。

はじめに

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 & Permissionschat:message API を作成するのではなく、今回は Incomming Webhooks で Slack に通知することを対象としています。ここら辺はこちらの記事が大変参考になるので、是非ご一読ください。

AWS SAM で作成された template.yaml を編集

初期状態の template.yaml をそのままデプロイしてしまうと API Gateway などの不要なリソースが作成されてしまうので下記のように編集してもらえればです。コメントや api を作成する event を削除して、CodeUriSample/ に変更しています。

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 の管理画面に移動してテスト通知して見てください。

参考文献


プロフィール画像

canji

とにかく私的にサービスを作りたい発作を起こしている。お腹はペコペコ。

  • toLog Tools icon
  • dots icon