AWS SNS with Telegram Bot

AWS SNS : Amazon Simple Notification Service
AWS的通知服務,後面可以串AWS上各種服務
例如:我是串在Route 53 > Health checks > 監控項目裡面的 Alarms

前陣子寫了篇PRTG串接Telegram(開新分頁)做異常警告通知,後來想想我本來都在用Email在收AWS的警告通知, 但是警告的Email常常淹沒在一大堆郵件裡面很容易被忽略了。所以從找到國外一篇文章介紹怎麼把利用SNS串接Telegram Bot發送警告
原文在此(開新視窗)。原文寫的比較簡略。我下面把比較詳細的步驟Step by Step寫出來。


原文有架構圖我這裡就不在重複了,大至上的架構是:
AWS SNS → Lambda function → Telegram Bot → Mobile Client / Telegram APP

設定上的詳細步驟如下:(如果孰悉AWS操作的,推薦您看原文)

01. 首先要先建立一個Telegram Bot並取得Token以及接收訊息TG帳號的Chat_ID
這部分在PRTG串接Telegram文章裡面有提到過我就不在敘述了

02. 打開AWS SNS Console切換到你SNS所使用的Region
自己取的名字,使用預設值建立一個Topic,然後先暫時放在這個畫面。

03. 用另一個分頁開AWS Lambda > Function > Create function

04. 建立Function,名稱自己取,Runtime : Python 3.7

05. Execution Role,點選下方的IAM Console然後Create role

06. 上面選AWS Service(預設),中間選Lambda,然後Next: Permissions。

07. 按Create policy

08. 選到 JSON 頁籤,把下面的code貼進去,然後Review policy.

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Action": [
        "logs:CreateLogGroup", "logs:CreateLogStream", "logs:PutLogEvents"
      ],
      "Resource": "arn:aws:logs:*:*:*",
      "Effect": "Allow"
    }
  ]
}

09. 取一個名字後,按下Create policy,請記住你剛剛取的名字。

10. 回到你剛剛Create role的畫面按一下右側重新整理得按紐,搜尋你剛剛建立的Policy
打勾>Next: Tags。

11. Tag部分可以跳過直接Next: Review

12. 給他一個名字,Create role,名字要記一下。

13. 回到Lambda這裡,下面選Use an existing role,在Existing role右邊按一下重新整理的按鈕然後選下拉選擇你剛剛建立的Role,接著Create function。

14. 在Function code裡面貼入程式碼(我這裡保持原作者的網址)

# CloudBriefly.com

import os
import json
from urllib import request, parse, error

def lambda_handler(event, context):
    url = 'https://api.telegram.org/bot%s/sendMessage' % os.environ['TOKEN']
    message = event['Records'][0]['Sns']['Message']
    data = parse.urlencode({'chat_id': os.environ['CHAT_ID'], 'text': message})

    try:
        # Send the SNS message (notification) to Telegram
        request.urlopen(url, data.encode('utf-8'))
    except error.HTTPError as e:
        print('Failed to send the SNS message below:\n%s' % message)
        response = json.load(e)
        if 'description' in response:
            print(response['description'])
        raise e

15.這裡要新增環境變數。準備好你剛剛申請到的Telegram Bot的token和Chat_id,按下Edit。

16. 按下Add environment variable

17. 請輸入你自己Telegram Bot的CHAT_ID和TOKEN,然後按SAVE。

18. 在Basic settings按下Edit

19. 把Timeout改成5秒,Save。

20.最後回到Lambda右上角按Save ,然後按一下上面ARN旁邊的複製符號,把這一串號碼複製起來。

21. 回到剛剛在AWS SNS建立的Topic。按下下面Create subscription

22.下拉選單
Protocol:AWS Lambda
Endpoint:選擇你剛剛建立的Lambda function

23. 完成。

24. 從左側選單回到你剛剛建立的Topic,按一下Publish message做一個測試。

25. 只要在下面的Message body輸入你想測試的文字

26. 輸入完成,按下Publish message,就可以看看Telegram Bot有沒有傳訊息給你了。

27. 上面會出現綠色告知你訊息傳送成功,同時你也會看到你的Telegram有訊息出現。
至此,至此完成SNS整合Telegram的階段。


後續你如果要做監控的部分,可以到Cloud Watch裡面去設定Alarm觸發時要透過SNS發送Telegram的訊息給你。