Amazon SNSからSlackに通知する仕組みを導入した話(概要編)

宮下(mizzy)です。

タレンティオ社内で、Amazon SNSにPublishするとSlackに通知できる仕組みを導入しました。このような仕組みの事例は検索するとたくさんでてきますが、タレンティオではこうやってますよ、という例としてご紹介したいと思います。

このエントリでは、利用者視点で具体的にどのようにSNSにPublishし、どのような通知が得られるのか、について解説します。実装の詳細についてはAmazon SNSからSlackに通知する仕組みを導入した話(実装編)で解説します。


通知の投げ方

AWS CLIを利用する場合は、次のようにSNSにPublishします。

aws sns publish \
  --topic-arn arn:aws:sns:ap-northeast-1:xxxxxxxxxxxx:slack-notification \
  --subject 'Message from CLI' \
  --message '{
    "SlackApp": "TalentioRuboty",
    "SlackChannel": "mizzy-test"
  }'

タレンティオではRubyをメインで利用しているのですが、Rubyの場合は次のようにPublishします。

require 'aws-sdk-sns'

sns = Aws::SNS::Client.new

sns.publish(
  {
    topic_arn: 'arn:aws:sns:ap-northeast-1:xxxxxxxxxxxx:slack-notification',
    subject: 'Messagge from Ruby',
    message: JSON.dump(
      {
        SlackApp: 'TalentioRuboty',
        SlackChannel: 'mizzy-test',
      }
    ),
  }
)

このようにPublishすると、次のように通知されます。


通知内容のカスタマイズ

各種パラメーターを指定することで、通知内容カスタマイズすることが可能です。

Status

Statusを指定すると、タイトルの先頭の絵文字を変えることができます。

aws sns publish \
  --topic-arn arn:aws:sns:ap-northeast-1:xxxxxxxxxxxx:slack-notification \
  --subject 'Message from CLI' \
  --message '{
    "SlackApp": "TalentioRuboty",
    "SlackChannel": "mizzy-test",
    "Status": "Warning"
  }'

このようにStatusWarningを指定すると、次のように通知されます。

Statusに指定するパラメータによって、アイコンは以下のように変わります。

  • 何も指定しない場合はℹ️
  • Successの場合は✅
  • Failの場合は❌
  • Warningの場合は⚠️

Parameters

Parametersでは、任意で表示したい内容を、キーと値の形で指定します。キーや値は文字列であれば何でも大丈夫です。

aws sns publish \
  --topic-arn arn:aws:sns:ap-northeast-1:xxxxxxxxxxxx:slack-notification \
  --subject 'Message from CLI' \
  --message '{
    "SlackApp": "TalentioRuboty",
    "SlackChannel": "mizzy-test",
    "Status": "Success",
    "Parameters": {
       "Date": "2023/06/28",
       "Area": "Kanagawa",
       "Weather": ":sun_behind_rain_cloud:"
    }
  }'

このようにPublishすると、次のように通知されます。

User

Userで指定したユーザに対してメンションします。

aws sns publish \
  --topic-arn arn:aws:sns:ap-northeast-1:xxxxxxxxxxxx:slack-notification \
  --subject 'Message from CLI' \
  --message '{
    "SlackApp": "TalentioRuboty",
    "SlackChannel": "mizzy-test",
    "Status": "Fail",
    "Parameters": {
       "Date": "2022/09/15",
       "Area": "Kanagawa",
       "Weather": ":sun_behind_rain_cloud:"
    },
    "User": "mizzy"
  }'

このようにPublishすると、次のように通知されます。

Url

指定したURLを表示します。Parametersの中に入れても良いのですが、見にくくなりそうなので独立したブロックに表示するようにしています。

aws sns publish \
  --topic-arn arn:aws:sns:ap-northeast-1:xxxxxxxxxxxx:slack-notification \
  --subject 'Message from CLI' \
  --message '{
    "SlackApp": "TalentioRuboty",
    "SlackChannel": "mizzy-test",
    "Status": "Success",
    "Parameters": {
       "Date": "2022/09/15",
       "Area": "Kanagawa",
       "Weather": ":sun_behind_rain_cloud:"
    },
    "User": "mizzy",
    "Url": "https://www.talentio.co.jp/"
  }'

このようにPublishすると、次のように通知されます。


おわりに

元々、このような仕組みを導入したのは、AWS Step Functionsから簡単に通知できるようにしたかったからです。

Step Functionsを実際の運用でどのように利用して、どのように通知しているか、という具体例については、また後日ご紹介できればと思います。