از طریق منوی جستجو مطلب مورد نظر خود در وبلاگ را به سرعت پیدا کنید
انتشار و اشتراک در پیامهای AWS SNS با Node.js فناوریهای زیادی که میبینیم متکی است روی یک چرخه درخواست/پاسخ بسیار فوری – هنگامی که درخواستی را به یک وب سایت ارائه می کنید، پاسخی حاوی وب سایتی که درخواست کرده اید، در حالت ایده آل بلافاصله دریافت می کنید. این همه متکی است روی کاربر تصمیم گیری فعال برای درخواست آن داده است. گاهی،…
سرفصلهای مطلب
معرفی
بسیاری از فناوری هایی که می بینیم متکی است روی یک چرخه درخواست/پاسخ بسیار فوری – هنگامی که درخواستی را به یک وب سایت ارائه می کنید، پاسخی حاوی وب سایتی که درخواست کرده اید، در حالت ایده آل بلافاصله دریافت می کنید. این همه متکی است روی کاربر تصمیم گیری فعال برای درخواست آن داده است.
گاهی اوقات، ما نیاز داریم که از آن مدل دور شویم و برای آن از مدل «انتشار/اشتراک» استفاده میکنیم. سرویس اعلان ساده AWS (SNS) یک سرویس فوق مقیاس پذیر است که به کاربران امکان می دهد مدل انتشار/اشتراک را به راحتی پیاده سازی کنند. این به ما امکان میدهد متنها، ایمیلها، اعلانهای فشاری یا سایر پیامهای خودکار را در چندین کانال به طور همزمان به اهداف دیگر ارسال کنیم.
در این پست، روش ساخت یک برنامه وب را یاد می گیریم که می تواند پیامی را برای چندین مشترک به طور همزمان از طریق ایمیل منتشر کند، همه با استفاده از SNS.
بدیهی است که به یک خدمات وب آمازون حساب (AWS) برای انجام این کار. و خوشبختانه، SNS یک لایه رایگان دارد که در آن اولین اعلانهای فشار 1M SNS شما هر ماه رایگان است.
انتشار/اشتراک مدل
مدل انتشار/اشتراک از دو جزء در یک سیستم تشکیل شده است:
- ناشر: سرویسی که می تواند پیام ها را به سرویس های دیگر در حال گوش دادن پخش کندمشترک شد) به آن.
- مشترک: هر سرویسی که ناشر به آن پخش خواهد کرد.
برای اینکه یک سرویس مشترک شود، یک سرویس باید به ناشر اطلاع دهد که میخواهد پخشهایش را دریافت کند، و همچنین جایی که میخواهد آن پخشها را دریافت کند – در این مرحله ناشر در زمان بعدی آن را در فهرست اهداف خود قرار میدهد. پیامی را منتشر می کند.
یک استعاره خوب برای مدل انتشار/اشتراک، هر خبرنامه ای است که در آن ثبت نام کرده اید! در این مثال، شما به طور فعال به ناشر رفته اید و به آنها گفته اید که می خواهید مشترک شوید و همچنین ایمیل خود را به آنها داده اید.
پس از مشترک شدن، هیچ کاری بلافاصله انجام نمی شود و هیچ شماره قبلی خبرنامه را دریافت نمی کنید.
هنگامی که ناشر پیامی را منتشر می کند (خبرنامه ماهانه خود را می فرستد)، ایمیلی می رسد. سپس میتوانید کاری را که میخواهید با ایمیل انجام دهید – میتوانید آن را حذف کنید، بخوانید یا حتی عمل کنید روی برخی از جزئیات در آن
راه اندازی یک موضوع SNS
برای شروع، ابتدا باید a را راه اندازی کنیم موضوع روی AWS SNS. یک موضوع همان چیزی است که ما آن را «ناشر» میدانیم – میتوانیم پیامهایی را برای یک موضوع ارسال کنیم، که سپس آن را برای همه مشترکین خود منتشر میکند.
در داشبورد AWS خود، را انتخاب کنید “سرویس اطلاع رسانی ساده” و ضربه بزنید “موضوعات” روی سمت چپ، به دنبال آن “ایجاد موضوع” دکمه.
صفحه ای به شما نمایش داده می شود که از شما می خواهد اطلاعات اساسی در مورد موضوع SNS ارائه دهید:
این صفحه دارای چندین گزینه است، اگرچه به طور پیش فرض فقط یک گروه را نمایش می دهد – این نام (که اجباری است) و نام نمایشی است که می تواند به صورت اختیاری تنظیم شود – اگر می خواهید برای مشترکین پیامک از موضوع منتشر کنید از این گزینه استفاده می شود.
برخی از گزینه های دیگر عبارتند از:
- رمزگذاری پیام: رمزگذاری پیام ها پس از ارسال توسط ناشر. این واقعاً فقط در صورتی مفید است که دادههای بسیار حساس/شخصی ارسال میکنید.
- سیاست های دسترسی: تعریف می کند دقیقا که می تواند پیام هایی به موضوع منتشر کند.
- سیاست را دوباره امتحان کنید: در صورتی که مشترک به هر دلیلی پیام منتشر شده را دریافت نکند.
- ثبت وضعیت تحویل: به شما این امکان را می دهد که a من هستم (مدیریت هویت و دسترسی) نقشی در AWS که گزارش وضعیت تحویل را در آن می نویسد AWS CloudWatch.
در حال حاضر، ما یک نام و یک نام نمایشی را پر می کنیم و سپس به پایین اسکرول می کنیم و ضربه می زنیم “ایجاد موضوع”. توجه داشته باشید ARN از تازه ایجاد شده موضوع، زیرا بعداً به آن نیاز خواهیم داشت.
راه اندازی یک کاربر IAM
ما از AWS JavaScript SDK برای تعامل با AWS SNS – و برای اینکه بتوانیم این کار را انجام دهیم، به مجموعهای از اعتبارنامهها نیاز داریم که SDK بتواند از آنها برای ارسال درخواستها به AWS استفاده کند.
ما می توانیم این مجموعه از اعتبار را با ایجاد یک به دست آوریم من هستم کاربر. باز کن ‘خدمات’ منویی که قبلا برای جستجو استفاده می کردیم و این بار IAM را جستجو می کردیم.
صفحه ای را می بینید که به شکل زیر است:
کلیک ‘کاربران’ روی سمت چپ، سپس کلیک کنید “افزودن کاربر” – با صفحه ای به شکل زیر روبرو خواهید شد:
برای اهداف آموزشی، بیایید یک کاربر با نام ایجاد کنیم SNSUser
و کادر دسترسی برنامهریزی شده را علامت بزنید. ما می خواهیم از طریق برنامه کاربردی خود به آن دسترسی داشته باشیم، نه تنها از طریق AWS console.
این به هر کسی که دارای اعتبار است اجازه می دهد تا از طریق CLI یا JavaScript SDK که ما از آن استفاده می کنیم به بخش های خاصی از AWS دسترسی داشته باشد. ما نیازی به دسترسی آنها به AWS Management Console نداریم، زیرا برنامه ریزی نمی کنیم روی داشتن این اعتبارنامه ها از طریق مرورگر با AWS تعامل دارند، مانند آنچه اکنون انجام می دهید.
روی next کلیک کنید و مجوزها به شما نمایش داده می شود. کلیک روی را “پیوست مستقیم خط مشی های موجود” دکمه و با جستجو ‘SNS’، شما به راحتی می توانید آن را پیدا کنید “SNSFullAccess” گزینه:
کاربران، نقشها و خطمشیهای IAM همگی موضوع بزرگی هستند که قطعاً ارزش بررسی دارند – هرچند در حال حاضر، این باید برای ما کارساز باشد.
با زدن “بعدی: برچسب ها” در گوشه پایین سمت راست، و سپس “بعدی: بررسی” در همان مکان، باید یک صفحه خلاصه را ببینید که چیزی شبیه به این است:
توجه داشته باشید: حتما کپی کنید دسترسی به شناسه کلید و کلید دسترسی مخفی یا فایل CSV را دانلود کنید زیرا این تنها زمانی است که می توانید این اعتبارنامه ها را دریافت کنید – در غیر این صورت باید کاربر جدیدی ایجاد کنید.
در حالی که ما در مورد اعتبار صحبت می کنیم، مطمئن شوید انجام ندهید این اعتبارنامه ها را در هر جایی آنلاین ارسال کنید یا آنها را به یک مخزن Git متعهد کنید. بازیگران بد GitHub را برای یافتن مخازن دارای اعتبارنامه جستجو می کنند تا بتوانند به منابع دسترسی داشته باشند و از آنها استفاده کنند. روی، حساب AWS آنها، که مقداری پول برای شما هزینه خواهد داشت.
در نهایت، ما می خواهیم اعتبار خود را به صورت محلی (Linux/OSX/Unix) تنظیم کنیم تا برنامه Node ما بتواند در مرحله بعد از آنها استفاده کند.
به منظور تعیین منطقه خود، بازدید کنید این page و نزدیک ترین منطقه به خود را پیدا کنید. پیش فرض در 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
در مرحله بعد، یک برنامه Node با استفاده از Express ایجاد می کنیم. این نرم افزار خواهد داشت دو نقاط پایانی اولی برای افزودن آدرس های ایمیل به عنوان مشترکین به موضوع ما، دومی برای ارسال ایمیل به همه از مشترکین ما
توجه داشته باشید: در حالی که ما از نقطه پایانی ایمیل در این نسخه نمایشی استفاده می کنیم، همان کد عمومی را می توان برای هر یک از نقاط پایانی SNS دیگر مانند HTTP، SMS، Lambda و غیره استفاده کرد. فقط باید swap چند پارامتر در فراخوانی SNS API.
ابتدا، اجازه دهید یک پوشه برای پروژه خود در ما ایجاد کنیم terminal، به دایرکتوری بروید و برنامه 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 روی port ${port}!`));
بیشتر اینها برای Express است، اما خطوط 4-6 نمونه AWS است، به آن بگویید که از اعتبارنامه در نمایه ای که در آن ایجاد کردیم استفاده کند. ~/aws/credentials
قبل از آن، و یک نمونه از کلاس SNS با آن ایجاد کنید.
حالا میتوانیم ادامه دهیم و فایل را اجرا کنیم:
$ node index.js
بازدید localhost:3000/status
اراده print یک تکه بزرگ از JSON که دارای اعتبارنامه AWS شما است. اگر کار کرد، ما می توانیم حرکت کنیم روی و نقاط پایانی ما را ایجاد کنیم.
نقطه پایانی اشتراک
ابتدا باید a را اضافه کنیم پست نقطه پایانی برای افزودن مشترکین – در این مورد، آدرس های ایمیل جدید. زیر /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);
}
});
});
خوب، بیایید از این طریق عبور کنیم. اول، ما در حال ایجاد یک پست نقطه پایانی در داخل آن نقطه پایانی، ما در حال ایجاد یک متغیر پارامتر هستیم که آماده ارسال درخواست اشتراک خود به SNS است.
متغیر پارامتر به چند چیز نیاز دارد:
Protocol
: ما آن را به عنوان ایمیل تنظیم کرده ایم، اما این می تواند باشد HTTP/S، پیامک، SQS (اگر می خواهید از سرویس صف AWS استفاده کنید)، یا حتی یک تابع LambdaTopicArn
: این است ARN – یک شناسه منحصر به فرد برای موضوع SNS که قبلاً تنظیم کرده اید. اگر آن را ندارید، بروید و آن را از Topic خود در مرورگر خود بردارید و اکنون آن را در کد قرار دهید.Endpoint
: نوع نقطه پایانی بستگی دارد روی پروتکل از آنجایی که ما در حال ارسال ایمیل هستیم، به آن آدرس ایمیل میدهیم، اما اگر یک آدرس ایمیل را تنظیم میکردیم HTTP/S اشتراک، به جای آن یک آدرس URL یا یک شماره تلفن برای آن قرار می دهیم پیامک.
می توانید در مورد روش اشتراک بیشتر بخوانید از اسناد رسمی.
پس از وارد شدن، سرور خود را دوباره راه اندازی کنید. شما باید یک درخواست با بدنه 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 تنظیم کنید، و می توانید پیام را هر طور که می خواهید قالب بندی کنید. به عنوان مثال، این به ویژه برای سرورها/سرویس هایی مفید است که ممکن است کنترلی بر روی آنها نداشته باشید، اما به شما اجازه می دهند اعلان های وب هوک ارسال کنید.
لامبدا
در روشی مشابه، میتوانید از این پیامها برای راهاندازی و دست دادن ورودیهای توابع لامبدا استفاده کنید. این ممکن است برای مثال، یک کار پردازش را آغاز کند. به این پست نگاهی بیندازید تا بفهمید چطور!
پیامک
اگر حذف کنید subject
در فیلد، می توانید پیامک های 160 کاراکتری را به هر شماره تلفن مشترکی ارسال کنید.
SQS
با نوع نقطه پایانی SQS، می توانید پیام ها را در صف ها قرار دهید تا معماری های رویداد محور را ایجاد کنید – برای جزئیات بیشتر به این مقاله نگاه کنید!
پیام های مختلط؟
وجود دارد MessageStructure
پارامتری که می توانید در اختیارتان قرار دهید و به شما امکان استفاده از آن را می دهد روی موضوع برای پخش روی چندین کانال با پیام های مختلف – این بدان معنی است که می توانید یک ایمیل کامل برای همه مشترکین ایمیل بنویسید، اما در عین حال پیامی را ارسال کنید که برای SMS بهینه شده است برای همه مشترکین تلفن همراه، که امکان ارتباطات چند کاناله را فراهم می کند!
نتیجه
سرویس اعلان ساده AWS (SNS) یک سرویس فوق مقیاس پذیر است که به کاربران امکان می دهد مدل انتشار/اشتراک را به راحتی پیاده سازی کنند. این به ما امکان میدهد متنها، ایمیلها، اعلانهای فشاری یا سایر پیامهای خودکار را در چندین کانال به طور همزمان به اهداف دیگر ارسال کنیم.
در این مقاله ما یک موضوع ایجاد کردهایم و با استفاده از Node.js AWS SDK به صورت برنامهنویسی در آن مشترک شدهایم. سپس نقاط پایانی HTTP را در برنامه آزمایشی خود ایجاد کردیم که به کاربران امکان می دهد از طریق ایمیل در موضوع SNS ما مشترک شوند و نقطه پایانی دیگری برای پخش ایمیل برای همه مشترکین.
(برچسبها برای ترجمه)# aws
منتشر شده در 1403-01-23 13:31:09