JavaScript >> Javascript 文檔 >  >> Node.js

使用 Node.js 發布和訂閱 AWS SNS 消息

簡介

我們看到的許多技術都依賴於非常即時的請求/響應週期——當您向網站發出請求時,您會收到包含您請求的網站的響應,理想情況下是立即響應。這一切都依賴於用戶做出主動決定來請求該數據。

有時,我們需要偏離該模型,為此我們使用“發布/訂閱”模型。 AWS Simple Notification Service (SNS) 是一項超級可擴展的服務,允許用戶輕鬆實施發布/訂閱模型。這使我們能夠同時跨多個渠道向其他目標發送文本、電子郵件、推送通知或其他自動消息。

在這篇文章中,我們將學習如何構建一個網絡應用程序,該應用程序可以通過電子郵件一次向多個訂閱者發布消息,所有這些都使用 SNS。

您顯然需要一個 Amazon Web Services (AWS) 帳戶來執行此操作。幸運的是,SNS 有一個免費套餐,您每月的前 100 萬條 SNS 推送通知都是免費的。

發布/訂閱模型

發布/訂閱模型由系統中的兩個組件組成:

  • 出版商 :一種服務,可以將消息廣播到其他正在偵聽的服務(訂閱 ) 給它。
  • 訂閱者 :發布者將向其廣播的任何服務。

為了成為訂閱者,服務需要通知發布者它想要接收它的廣播,以及它想要在哪裡接收這些廣播——此時發布者將在下一個目標列表中包含它發布消息。

發布/訂閱模型的一個很好的比喻是您註冊的任何時事通訊!在這種情況下,您主動去找發布者,告訴他們您想訂閱,並給他們您的電子郵件。

訂閱後不會立即執行任何操作,並且您不會收到任何以前的時事通訊。

當發布者下一次發布消息(發送他們的每月通訊)時,會收到一封電子郵件。然後,您可以選擇對電子郵件執行您想做的事情 - 您可以刪除它、閱讀它,甚至對其中的一些細節採取行動。

設置 SNS 主題

要開始,我們首先需要設置一個 topic 在 AWS SNS 上。主題是我們認為的“發布者”——我們可以向主題發送消息,然後主題將發布給所有訂閱者。

在您的 AWS 控制面板中,選擇“簡單通知服務” 並點擊“主題” 在左側,然後是 “創建主題” 按鈕。

您將看到一個屏幕,要求您提供有關 SNS 主題的一些基本信息:

此屏幕有幾個選項,但默認情況下只顯示一個組 - 這是名稱(這是強制性的)和顯示名稱,可以選擇設置 - 如果您想從主題發佈到 SMS 訂閱者,則使用此選項。

其他一些選項包括:

  • 消息加密 :在發布者發送後加密消息。這僅在您發送高度敏感/個人數據時才有用。
  • 訪問策略 :定義準確 誰可以向主題發布消息。
  • 重試政策 :如果訂閱者由於某種原因未能收到已發布的消息。
  • 交付狀態記錄 :允許您設置 IAM身份和訪問管理 ) AWS 中的角色,將交付狀態日誌寫入 AWS CloudWatch。

現在,我們將填寫名稱和顯示名稱,然後滾動到底部並點擊'創建主題' .記下 ARN 新創建的主題 ,因為我們稍後會用到它。

設置 IAM 用戶

我們將使用 AWS JavaScript 開發工具包與 AWS SNS 進行交互——為了做到這一點,我們需要一組憑證,開發工具包可以使用這些憑證向 AWS 發送請求。

我們可以通過創建 IAM 來獲取這組憑證 用戶。打開“服務” 我們之前搜索的菜單,這次搜索 IAM。

您將看到如下所示的屏幕:

點擊“用戶” 在左側,然後點擊“添加用戶” - 你會看到這樣的屏幕:

出於教程目的,讓我們創建一個名為 SNSUser 的用戶 ,然後選中程序訪問框。我們希望通過我們的應用程序以編程方式訪問它,而不僅僅是通過 AWS 控制台。

這允許任何擁有憑證的人通過 CLI 或我們將使用的 JavaScript 開發工具包訪問 AWS 的特定部分。我們不需要授予他們 AWS 管理控制台訪問權限,因為我們不打算讓這些憑證通過瀏覽器與 AWS 交互,就像您現在所做的那樣。

單擊下一步,您將獲得權限。點擊“直接附加現有政策” 按鈕並通過搜索'SNS' ,您將很容易找到 'SNSFullAccess' 選項:

IAM 用戶、角色和策略都是一個絕對值得研究的大話題——不過現在,這應該對我們有用。

通過點擊“下一步:標籤” 在右下角,然後 “下一步:審核” 在同一位置,您應該會看到如下所示的摘要屏幕:

免費電子書:Git Essentials

查看我們的 Git 學習實踐指南,其中包含最佳實踐、行業認可的標準以及隨附的備忘單。停止谷歌搜索 Git 命令並真正學習 它!

注意: 確保複製 訪問密鑰 ID秘密訪問密鑰 或下載 CSV 文件,因為這是您唯一可以獲取這些憑據的時間 - 否則您需要創建新用戶。

在我們談論憑據時,請確保您不要 在網上任何地方發布這些憑據,或將它們提交到 Git 存儲庫。不良行為者會在 GitHub 上搜索帶有憑證的存儲庫,以便他們可以訪問並使用其 AWS 帳戶上的資源,這將花費你一些可觀的錢。

最後,我們將在本地(Linux/OSX/Unix)設置我們的憑據,以便我們的 Node 應用程序可以在下一步中使用它們。

為了確定您所在的地區,請訪問此頁面並找到離您最近的地區。 AWS 中的默認值為 us-east-2 - 位於俄亥俄州。這是您在瀏覽器中查看 AWS 時將看到的區域:

touch ~/.aws/credentials
echo '[sns_profile]' >> ~/.aws/credentials
echo 'aws_access_key_id = <YOUR_ACCESS_KEY_ID>' >> ~/.aws/credentials # The access key ID from the IAM user
echo 'aws_secret_access_key = <YOUR_SECRET_ACCESS_KEY>' >> ~/.aws/credentials # The secret access key from the IAM user
echo 'region = <YOUR_AWS_REGION>' # From the regions page, examples include: us-east-1, us-west-1, eu-west-1, etc.

演示 Node.js 應用

接下來我們將使用 Express 創建一個 Node 應用程序。此應用程序將有 兩個 端點。第一個用於將電子郵件地址添加為我們主題的訂閱者,第二個用於向 all 發送電子郵件 我們的訂閱者。

注意 :雖然我們在此演示中使用電子郵件端點,但相同的通用代碼可用於任何其他 SNS 端點,例如 HTTP、SMS、Lambda 等。您只需在 SNS API 中交換一些參數打電話。

首先,讓我們在終端中為我們的項目創建一個文件夾,進入該目錄,然後初始化我們的 Node 應用程序:

$ mkdir node-sns-app
$ cd node-sns-app
$ npm init

您可以按回車鍵,直到腳本使用默認選項完成,使我們的默認入口點 index.js .

接下來,我們需要安裝 Express 和 AWS-SDK 模塊,以便我們可以同時使用它們:

$ npm install express --save
$ npm install aws-sdk --save

接下來,我們要創建 我們的應用程序。在同一目錄中,創建一個名為 index.js 的文件 :

$ touch index.js

首先,我們將輸入一些代碼,以確保我們可以使用 AWS 運行應用程序:

const express = require('express');
const app = express();

const AWS = require('aws-sdk');
const credentials = new AWS.SharedIniFileCredentials({profile: 'sns_profile'});
const sns = new AWS.SNS({credentials: credentials, region: 'eu-west-2'});

const port = 3000;

app.use(express.json());

app.get('/status', (req, res) => res.json({status: "ok", sns: sns}));

app.listen(port, () => console.log(`SNS App listening on port ${port}!`));

其中大部分是 Express 的樣板,但第 4-6 行實例化 AWS,告訴它使用我們在 ~/aws/credentials 中創建的配置文件中的憑證 更早,並用它創建一個 SNS 類的實例。

現在,我們可以繼續運行該文件:

$ node index.js

訪問localhost:3000/status 將打印出一大塊包含您的 AWS 憑證的 JSON。如果可行,那麼我們可以繼續並創建我們的端點。

訂閱端點

首先,我們需要添加一個 POST 添加訂閱者的端點 - 在這種情況下,是新的電子郵件地址。 /status 下方 端點,我們將添加 /subscribe 端點:

app.post('/subscribe', (req, res) => {
    let params = {
        Protocol: 'EMAIL', 
        TopicArn: '<YOUR_TOPIC_ARN_HERE>',
        Endpoint: req.body.email
    };

    sns.subscribe(params, (err, data) => {
        if (err) {
            console.log(err);
        } else {
            console.log(data);
            res.send(data);
        }
    });
});

好的,讓我們來看看這個。首先,我們正在創建一個 POST 端點。在該端點內部,我們正在創建一個參數變量,準備好將我們的訂閱請求傳遞給 SNS。

參數變量需要一些東西:

  • Protocol :我們已將其設置為電子郵件,但這可能是 HTTP/S , 短信 , SQS (如果你想使用 AWS 的隊列服務),甚至是 Lambda 函數
  • TopicArn :這是ARN - 您之前設置的 SNS 主題的唯一標識符。如果沒有,請立即從瀏覽器的主題中獲取它,然後將其粘貼到代碼中。
  • Endpoint :端點類型取決於協議。因為我們要發送電子郵件,所以我們會給它一個電子郵件地址,但是如果我們要設置一個 HTTP/S 訂閱,我們會輸入一個 URL 地址,或者 SMS 的電話號碼 .

您可以從官方文檔中閱讀更多關於訂閱方法的信息。

一旦進入,再次啟動您的服務器。您需要向您的應用程序發送一個帶有 JSON 正文的請求 - 您可以使用 Postman 等工具執行此操作,或者如果您願意,您可以在 CLI 上執行此操作:

$ curl -H "Content-type: application/json" -d '{ "email": "<AN_EMAIL_ADDRESS_HERE>" }' 'localhost:3000/subscribe'

如果端點和消息正確,該電子郵件地址將收到一封電子郵件,詢問您是否要確認訂閱 - 通過 AWS SNS 創建的任何訂閱都需要由端點以某種形式確認,否則 AWS 可能會被惡意用於垃圾郵件或DDOS類型的攻擊。

對於您訂閱的任何電子郵件,請務必在下一步之前確認訂閱。

電子郵件端點

現在製作發送電子郵件的端點:

app.post('/send', (req, res) => {
    let params = {
        Message: req.body.message,
        Subject: req.body.subject,
        TopicArn: '<YOUR_TOPIC_ARN_HERE>'
    };

    sns.publish(params, function(err, data) {
        if (err) console.log(err, err.stack); 
        else console.log(data);
    });
});

再次,讓我們看看這裡的參數是由什麼組成的:

  • Message :這是您要發送的消息 - 在這種情況下,它將是電子郵件的正文
  • Subject :僅包含此字段因為 我們正在發送一封電子郵件 - 這將設置電子郵件的主題
  • TopicArn :這是我們將消息發佈到的主題 - 這將發佈到每個 該主題的電子郵件訂閱者

如果您想了解更多關於發布方法的信息,請查看文檔,還有其他屬性。

您現在可以使用 Postman 或 curl 發送消息 - 只要我們為主題和消息傳遞參數:

$ curl -H "Content-type: application/json" -d '{ "subject": "Hello there!", "message": "You just received an email from SNS!" }' 'localhost:3000/send'

發出此請求後,端點的所有訂閱者都應收到此電子郵件!恭喜,您剛剛使用 SNS 和 Node.js 發布了您的第一條消息!

下一步是什麼?

消息模板

看到您的消息是一個字符串,您可以使用字符串插值進行動態輸入 - 例如:

app.post('/send', (req, res) => {
    let now = new Date().toString();
    let email = `${req.body.message} \n \n This was sent: ${now}`;
    let params = {
        Message: email,
        Subject: req.body.subject,
        TopicArn: '<YOUR_TOPIC_ARN_HERE'
    };

    sns.publish(params, function(err, data) {
        if (err) console.log(err, err.stack); 
        else console.log(data);
    });
});

HTTP 端點

您可以設置一個旨在接收消息的服務,以防您想觸發後台操作,但不一定關心立即接收結果。只需將端點設置為 HTTP/S,您就可以根據自己的選擇來格式化消息。例如,這對於您可能無法控制但允許您發送 webhook 通知的服務器/服務特別有用。

Lambda

同樣,您可以使用這些消息來觸發 Lambda 函數並將其手動輸入。例如,這可能會啟動處理工作。看看這篇文章,了解如何操作!

短信

如果您刪除 subject 字段,您可以向任何訂閱的電話號碼發送 160 個字符的 SMS 消息。

SQS

使用 SQS 端點類型,您可以將消息放入隊列中以構建事件驅動架構 - 請查看本文了解更多詳細信息!

混合消息?

有一個 MessageStructure 您可以提交的參數允許您在主題上使用不同的消息在多個頻道上廣播 - 這意味著您可以為所有電子郵件訂閱者編寫完整的電子郵件,但同時向所有人發送針對 SMS 優化的消息移動用戶,允許多渠道通信!

結論

AWS Simple Notification Service (SNS) 是一項超級可擴展的服務,允許用戶輕鬆實施發布/訂閱模型。這使我們能夠同時跨多個渠道向其他目標發送文本、電子郵件、推送通知或其他自動消息。

在本文中,我們創建了一個主題並使用 Node.js 的 AWS 開發工具包以編程方式訂閱它。然後,我們在演示應用程序中創建了 HTTP 端點,允許用戶通過電子郵件訂閱我們的 SNS 主題,並使用另一個端點向所有訂閱者廣播電子郵件。!


Tutorial JavaScript 教程
  1. 我為自己的 Web 框架設計了一個 React 道具功能

  2. 一種在Javascript中組織可選函數參數的方法

  3. 理解 JavaScript 構造函數的簡單指南

  4. Javascript — 退出 JavaScript 中的 for 循環

  5. 如何從 URL 路徑構建動態麵包屑

  6. 將 Node 應用程序部署到 Heroku

  7. 如何在 Chrome 中直接編輯源文件

  1. Project 65 of 100 - React Router 運動追踪器

  2. CSS/JS:如何從 JS 中的 CSS 屬性中檢索數值並進行修改?

  3. 為什麼以及如何開始使用 Xcode 盡快構建您的 React Native iOS 應用程序

  4. 在 Node.js HTTP 服務器中獲取和設置標頭

  5. Deno,一年兩百個補丁後

  6. 如何使用 Node.js 構建 Neo4j 應用程序

  7. 需要有關 Discord Webhook 的幫助

  1. 在 20 行以下輸入推斷的 react-redux

  2. 創建我自己的海明威應用程序

  3. Covid-19 Stats Chrome 擴展 - Angular

  4. 使用 fastify 和 TypeORM 構建 REST api