AWS 札記 (4) — 利用 AWS SNS 建立訂閱模式(還有試用 GitHub Copilot)

3LexW
Nov 7, 2021

--

前面幾篇扎記,我們成功制作了一個自動在網上獲取資料,並將資料轉成需要格式的流程。現在,處理好的資料都安安靜靜的放到 AWS S3 上。不過,通常要處理好的數據,也是因為有用家需要。在這篇扎記,我記錄了要如何使用 AWS SNS 服務來建立起一套服務訂閱者機制。以便在每當運行一次新的數據獲取之後,就會自動通知用家下載資料。

AWS SNS

SNS 全名 Simple Notification Service,是 AWS 提供的無伺服器訂閱訊息推送服務。服務以 Topic 為單位,一個 Topic 的訂閱者就可以接收 Topic 管理者所發出的訊息。最常用的案例包括發送警告或者通知、或者配合 SQS 來進行更多處理。

首先,我們來創作第一個 SNS Topic:

在 AWS SNS 主畫面,建立「Medium_SNS」的 Topic。

SNS Topic 類型

首先要選擇類型。

SNS 提供兩種服務,分別是 FIFO 和 Standard。

Standard 擁有最快的處理能力,但有可能出現訊息重覆推送的問題(保證最少一次)。因此,有可能需要配合不同的服務(例如數據庫)作出重覆訊息防範機制。可傳送的對象包括 Lambda、SQS、HTTP、SMS 短訊、電郵和手機程式通知。

FIFO 則會嚴格執行先入先出原則,將訊息按順序傳送出去,但會有每秒訊息上限,可傳送對象亦只有 SQS。常見於一個訊息可以供多個服務使用的 Fan-out 設計模式時使用。

這次我們採用 Standard 模式,送個電郵並不需要在時間次序上面嚴格,可以送到就好。

加密

SNS 預設訊息在傳出時加密,但訊息在 SNS 運行環境中,預設不會加密。在這邊我們開啟加密,並獲得一個預設的金鑰。AWS KMS 只會在使用金鑰時收費,保存則不會收費。(如果是測試就可以暫時不用開啟)

存取設定

預設是只有 Topic 的擁有者可以推送訊息和訂閱訊息,你也可以設定某些 AWS 帳戶或者透過進入某個節點(例如 REST API)進行訂閱,現在我們設定只有自己就好。

預設是只有 Topic 的擁有者可以推送訊息和訂閱訊息,你也可以設定某些 AWS 帳戶或者透過進入某個節點(例如 REST API)進行訂閱,現在我們設定只有自己就好。

傳送失敗機制

如果訊息傳送失敗應該如何處理呢? SNS 可以提供自動重試機制,但亦可能因此會出現多次推送的情況。

記錄檔

我們可以利用 CloudWatch,將 SNS 的工作情況以記錄檔形式傳送,以供審查。但現在只可以針對上面提供的選擇(例如 Lambda、SQS)作記錄。

標記

嗯…… 整理用的。

訂閱 Topic

建立 Topic 之後,我們會看到 Topic 的主畫面。在下方可以重新進行前面提到的設定,而且可以增加訂閱者。

點擊 Create subscription 來新增訂閱者
首先設定傳送資料的方式,以及目標郵箱。
然後,我們為這個接收者設定訊息過濾機制,如果訊息 format 是 CSV 的話才會收到訊息。
訊息丟失處理方法,如果啟用的話,則把訊息傳送到一個 AWS SQS 隊伍中等候後續處理。
設定好之後,目標電郵就會接收到一封確認電郵,在確認之後才可以接收訊息。

傳送第一封訊息

建立 Topic 之後,就會出現 Topic 主畫面,點擊右上可以發放訊息,
我們提供一個標題(在電郵的情況則是電郵主旨),TTL 主要用於手機通知,可以在 TTL 之後收回。
設定訊息內文,我們可以向所有接收端傳送一樣的訊息,或者向特定的接收端傳送不同的訊息。
設定訊息情報,我們要提供 format 為 CSV,才可以讓目標接收到訊息。
目標成功接收來自 Topic 的訊息了,不過美觀上則有點可惜。如果要修改電郵訊息,或者使用 HTML 格式等,可能就要借用像是 AWS SES 的電郵服務,而且需要用另一套系統來處理訂閱者機制。

利用 AWS Lambda 將訊息傳送自動化

雖然 SNS 訊息在美觀上有點可惜,但重點還是要先把檔案的下載連結傳送給需要的用家。

所以我們在 AWS Lambda 中增加一個 Lambda Function,然後設定一個 Trigger。

我們在增加一個新的 CSV 檔案之後,觸發 Lambda Fucntion。
為這個 Lambda Function 增加 S3–3lex-lambda-Get 的自訂 Policy,以及 SNS 的完整控制權(正式時最好設一個新 Policy 為佳),詳情請閱以前的扎記。

然後加入以下的代碼,這次我試用了 GitHub Copilot 的人工智能代碼編寫,實在是非常可怕,例子可以參考以下一段小 GIF:

簡單嘗試用 GitHub Copilot 來寫 Lambda Function,未來的編程人員似乎只會更重視程式設計,而不是編碼能力了。

簡單修改一些像是 SNS Topic 的 ARN 地址和訊息內容之後,就可以直接用了

實際測試後,也成功把電郵送到了自己的個人 GMail 了。

更美觀的話,我們可以使用 SES 服務,但這可以留待以後進行。

現在我們成功建立起訂閱者服務,我們來更新一下流程圖吧!

全新的流程圖加入了 SNS 以及新的 Lambda Function,在完全無伺服器的情況下完成了網絡爬蟲腳本的訂閱機制。

不過,只有最新的記錄並不足夠,舊記錄亦然安睡在 S3 裡面。如果用家有需要,可能需要歷史記錄。所以之後我們來學習如何用 AWS Dynamo DB 來建立數據庫,以儲存運行記錄,然後做好一個基本的後端(App + DB)了。

--

--

No responses yet