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的訊息給你。