前面幾篇扎記,我們成功制作了一個自動在網上獲取資料,並將資料轉成需要格式的流程。現在,處理好的資料都安安靜靜的放到 AWS S3 上。不過,通常要處理好的數據,也是因為有用家需要。在這篇扎記,我記錄了要如何使用 AWS SNS 服務來建立起一套服務訂閱者機制。以便在每當運行一次新的數據獲取之後,就會自動通知用家下載資料。
AWS SNS
SNS 全名 Simple Notification Service,是 AWS 提供的無伺服器訂閱訊息推送服務。服務以 Topic 為單位,一個 Topic 的訂閱者就可以接收 Topic 管理者所發出的訊息。最常用的案例包括發送警告或者通知、或者配合 SQS 來進行更多處理。
首先,我們來創作第一個 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)進行訂閱,現在我們設定只有自己就好。
傳送失敗機制
如果訊息傳送失敗應該如何處理呢? SNS 可以提供自動重試機制,但亦可能因此會出現多次推送的情況。
記錄檔
我們可以利用 CloudWatch,將 SNS 的工作情況以記錄檔形式傳送,以供審查。但現在只可以針對上面提供的選擇(例如 Lambda、SQS)作記錄。
標記
訂閱 Topic
建立 Topic 之後,我們會看到 Topic 的主畫面。在下方可以重新進行前面提到的設定,而且可以增加訂閱者。
傳送第一封訊息
利用 AWS Lambda 將訊息傳送自動化
雖然 SNS 訊息在美觀上有點可惜,但重點還是要先把檔案的下載連結傳送給需要的用家。
所以我們在 AWS Lambda 中增加一個 Lambda Function,然後設定一個 Trigger。
然後加入以下的代碼,這次我試用了 GitHub Copilot 的人工智能代碼編寫,實在是非常可怕,例子可以參考以下一段小 GIF:
簡單修改一些像是 SNS Topic 的 ARN 地址和訊息內容之後,就可以直接用了
更美觀的話,我們可以使用 SES 服務,但這可以留待以後進行。
現在我們成功建立起訂閱者服務,我們來更新一下流程圖吧!
不過,只有最新的記錄並不足夠,舊記錄亦然安睡在 S3 裡面。如果用家有需要,可能需要歷史記錄。所以之後我們來學習如何用 AWS Dynamo DB 來建立數據庫,以儲存運行記錄,然後做好一個基本的後端(App + DB)了。