چند سال پیش AWS یک سرویس جدید برای میزبانی صفحات ایستا ساخت که در حال حاضر آن را با نام S3 میشناسیم. میتوان ارائه این سرویس از طرف آمازون را یکی از گزینههای تغییردهنده در دنیای طراحی و دیپلوی وبسایتهای ایستا دانست. کار با این سرویس بسیار ساده است. تنها کاری که باید انجام دهید آن است که در یک آدرس مشخص شده توسط خود S3 محتوای وبسایت ایستا را قرار دهید.
حال من قرار است در این مطلب کار عجیبی را انجام دهم: قصد دارم تا شما را با روند ایجاد یک فرم تماس باما در S3 آشنا کنم.
چرا میگویم عجیب؟ به این دلیل که ایجاد یک فرم تماس باما تنها از طریق یک سرور که محتوای ایستا را قبول میکند انجام پذیر نیست. شما نیاز دارید تا یکسری درخواست آژاکس را برای مثال از طریق فرمهایتان مدیریت نمایید. چنین مواردی نیاز به منابع یک سرور واقعی داشته و به نظر نمیرسد که برای انجام چنین کاری S3 بتواند به خوبی عمل نماید.
راهکار ما برای انجام چنین کاری Serverless است. البته منظور از این کلمه «بدون سرور» نیست بلکه منظور نیاز کمتر به مدیریت سرورهاست. Serverless ما را از مشکلات پیکربندی سرور نجات داده و به ما این قابلیت را میدهد تا بدون نیاز به اعمال تنظیمات مختلف، اپلیکیشنهای متفاوتی را روی یک سرور اجرا کنیم. در این مطلب قصد داریم تا با کمک گرفتن از این تکنولوژی پروژه مورد نظر را ایجاد کنیم.
فریمورک Serverless
فریمورک Serverless یک ابزار منحصر به فرد برای دیپلوی و مدیریت معماری Serverless است. با این حال شعار اصلی این فریمورک بیانگر همه چیز هست: «روی اپلیکیشن تمرکز کن! نه روی زیرساختها.»
Serverless یک وب فریمورک متن باز و رایگان است که با استفاده از نودجیاس نوشته شده. میتوان این فریمورک را اولین ابزاری دانست که منحصرا برای دیپلوی کردن پروژهها روی AWS Lambda ایجاد شده است. پلتفرم محاسباتی Serverless توسط AWS یا Amazon Web Services مدیریت میشود. البته فارغ از AWS شما میتوانید با استفاده از این فریمورک پروژههایتان را روی دیگر سرویسهای ابری دیپلوی کنید. در بین این سرویسها میتوان به موارد زیر اشاره کرد.
- AWS Lambda
- Google Cloud Functions
- Azure Functions
- IBM OpenWhisk
- Auth0 Webtask
- Oracle Fn Project
- Spotinst
- Kubeless
شروع کار با فریمورک Serverless
پیادهسازی و نصب Serverless بسیار ساده است. تنها کاری که باید انجام دهید نصب Serverless از طریق npm و لینک کردن آن به حساب AWS است.
۱. نصب Serverless به صورت Global
برای نصب کردن به صورت Global میتوانید از دستور install مربوط به npm استفاده نمایید:
$ npm install serverless –g
این دستور Serverless را به صورت global روی سیستم شما نصب میکند. حال میتوانید از طریق ترمینال به دستورات Serverless دسترسی داشته باشید.
۲. ایجاد یک کاربر IAM در AWS Console
به صفحه AWS Console بروید. در آنجا میتوانید IAM Service را که در گروه Security, Identity & Compliance قرار گرفته پیدا کنید. در این قسمت روی Add User کلیک نمایید.
یک کاربر جدید اضافه کرده و دسترسی Programmatic را از طریق چک باکس Programmatic Access به وی بدهید. بعد از آن از طریق گزینه Attach existing policies directly دسترسی AdministatorAccess را نیز به وی بدهید.
بعد از آنکه کاربر مورد نظر ایجاد شد حال نیاز است تا به Access Key ID و Secret Access Key دسترسی پیدا کنید. استفاده از این موارد برای قدمهای بعدی ضروری هستند.
تذکر: اطلاعات بدست آمده موارد سری و مهمی هستند. کسی که به این اطلاعات دسترسی داشته باشد تقریبا میتواند هر کاری را در اکانت مربوط به AWS انجام دهد.
۳. پیکربندی Serverless برای استفاده از اطلاعات کاربری
حال با استفاده از کلیدها میتوانید فریمورک Serverless را برای ارتباط برقرار کردن آماده کنید. به ترمینال رفته و از دستورات زیر برای پیکربندی Serverless استفاده کنید:
$ sls config credentials --provider aws --key xxxxxxxxxxxxxx --secret xxxxxxxxxxxxxx --profile <username>
حال Serverless موجود روی سیستم شما میتواند به خوبی به AWS متصل شود.
نکته: در کدهای بالا منظور از sls مخفف همان serverless است. میتوانید از هر دو دستور استفاده کنید. sls تنها یک مخفف است.
۴. ایجاد یک سرویس جدید
بعد از آنکه فریمورک Serverless پیکربندی شد حال نیاز است تا یک پروژه جدید را ایجاد کنید برای انجام اینکار دستورات زیر را در ترمینال وارد نمایید:
$ sls create --template aws-python --path <your-folder-path>
آرگومان template برای پیادهسازی یکسری از تنظیمات استفاده میشود. aws-python نیز به ما قابلیت پیکربندی یک سرویس AWS با محیط اجرایی پایتون را میدهد. این دستورات به صورت خودکار فایلهای serverless.yml، handler.py و .gitignore را ایجاد میکنند.
پیکربندی اصلی سرور توسط فایل serverless.yml انجام خواهد شد. این فایل یکی از مهمترین فایلهایی است که توسط فریمورک Serverless ایجاد میشود. محتویات این فایل را میتوانید در زیر مشاهده نمایید:
service: <your-service-name>
provider:
name: aws
runtime: python2.7
functions:
hello:
handler: handler.hello
قسمت provider تمام موارد مرتبط با Service Provider را در خود ذخیره میکند. البته جدای از این تنظیمات که به صورت پیشفرض قرار گرفتهاند، میتوانید گزینههای بسیار بیشتری را استفاده نمایید. برای مشاهده تمام جزئیات مربوط به Provider این لینک را مشاهده کنید. با این حال برای ادامه دادن به این مطلب ما نیاز داریم تا دو تگ مهم را به قسمت provider اضافه کنیم:
region: <your-aws-region>
profile: <aws-username-with-programmatic-access>
قسمت functions برای تعریف کارهایی که قصد اجرا توسط Serverless را دارید استفاده میشود. در مثال بالا یک تابع با نام hello در فایل handler.py فراخوانی شده است. اگر وارد این فایل شوید با کدهای زیر برخورد خواهید کرد:
import json
def hello(event, context):
body = {
"message": "Go Serverless v1.0! Your function executed successfully!",
"input": event
}
response = {
"statusCode": 200,
"body": json.dumps(body)
}
return response
اپلیکیشن Serverless
برنامهای که ما قصد ساخت آن را داریم از زیرساختهای AWS استفاده میکند که خود شامل API Getway، توابع Lambda، DynamoDB و یک سرویس SES برای ایمیل میشود. برای دسترسی به این موارد باید از طریق فریمورک Serverless عمل کنیم.
- وبسایت استاتیک – Amazon S3 یک وب سرور ساده و در عین حال قدرتمند را در اختیار ما قرار میدهد. تمام فایلهای استاتیک HTML/CSS/JS قرار است از طریق این سرور اجرا شود. پروژهای که ما نیز قصد توسعه آن را داریم از همین سرور استفاده خواهد کرد اما از آنجایی که این پروژه یک فرم تماس باما است نیاز است تا از طریق Ajax نیز فرم را ارسال کنیم.
- API Getway – API Getway منبع رویداد اصلی پروژه ماست. این API مانند یک پل بین فرم تماس و Lambda Function عمل میکند. در حقیقت این قسمت به ما کمک میکند تا بتوانیم اطلاعات فرم را به دست Lambda Function برسانیم. از طریق API Getway میتوان یکسری کارهای دیگر مانند کنترل دسترسی، بررسی نسخه API و مدیریت ترافیک را نیز انجام داد.
- AWS Lambda – AWS Lambda جاییست که کنشهای صورت میگیرد. توابع Lambda به صورت stateless و براساس یکسری رویداد اجرا خواهند شد. در مثال ما قرار است از توابع Lambda برای ارسال ایمیل با استفاده از SES و ذخیره آنها در یک دیتابیس NoSQL استفاده کنیم.
- Simple Email Service (SES) – SES سرویس ارسال ایمیل مبتنی بر ابر است که از طریق آمازون میتوان به آن دسترسی داشت. SES را میتوان یک سیستم مقیاسپذیر برای سرویسهای مبتنی بر ایمیل نیز دانست چرا که این سرویس قابلیت کار برای هر گسترهای از کارهای مربوط به ایمیل را دارد. شما میتوانید از طریق این سرویس یک کمپین، خبرنامه، سیستم تراکنش و... مبتنی بر ایمیل داشته باشید.
- DynamoDB – DynamoDB یک دیتابیس مقایسپذیر، سازگار، no-SQL و Full-Managed است که توسط آمازون پشتیبانی میشود. در این پروژه قصد داریم تا از این دیتابیس نیز استفاده کنیم.
اپلیکیشن اصلی
حال که با موارد مقدماتی این مطلب آشنا شدیم نیاز است تا سراغ اپلیکیشن اصلی برویم که قرار است در این مطلب آن را ایجاد کنیم.
۱. بررسی فایل serverless.yml
همانطور که میدانید فایل serverless.yml سرویسهایی را تعریف میکند که اپلیکیشن نیاز دارد تا با آنها تعامل داشته باشد. منابع و کنشهایی که توابع Serverless میتوانند اجرا کنند را نیز میتوانید از قسمت iamRoleStatements پیدا کنید.
iamRoleStatements:
- Effect: "Allow"
Action:
- ses:SendEmail
- ses:SendRawEmail
Resource: "*"
- Effect: "Allow"
Action:
- dynamodb:Scan
- dynamodb:PutItem
Resource: "arn:aws:dynamodb:${opt:region, self:provider.region}:*:table/${self:provider.environment.DYNAMODB_TABLE}"
در کدهای بالا که مربوط به فایل serverless.yml هستند، ما به Serverless اجازه دادهایم تا از ses:SendEmail و dynamoDB:PutItem استفاده کند.
همچنین در همین فایل نیاز است تا توابع مورد نظرمان را نیز پیادهسازی کنیم. برای انجام چنین کاری باید از خاصیت functions استفاده شود:
functions:
sendMail:
handler: handler.sendMail
description: Send Email using AWS SES Service
events:
- http:
path: sendMail
method: post
integration: lambda
cors: true
response:
headers:
"Access-Control-Allow_Origin": "'*'"
list:
handler: handler.list
description: List all the contact form submissions
events:
- http:
path: list
method: get
integration: lambda
cors: true
response:
headers:
"Access-Control-Allow_Origin": "'*'"
یکی دیگر از ویژگيهای خارقالعاده Serverless این است که یک API را در AWS API Gateway ایجاد کرده و آن را به تابع مربوطه متصل میسازد. این کار از طریق خاصیتهای http و events انجام میشود.
۲. ساخت منابع
با استفاده از Serverless شما میتوانید منابعی مانند یک جدول در بانک اطلاعاتی DynamoDB را ایجاد کنید. قطعه کدی که در زیر مشاهده میکنید دقیقاً وظیفه انجام چنین کاری را دارد:
resources:
Resources:
ContactFormDynamoDbTable:
Type: 'AWS::DynamoDB::Table'
DeletionPolicy: Retain
Properties:
AttributeDefinitions:
-
AttributeName: id
AttributeType: S
KeySchema:
-
AttributeName: id
KeyType: HASH
ProvisionedThroughput:
ReadCapacityUnits: 1
WriteCapacityUnits: 1
TableName: ${self:provider.environment.DYNAMODB_TABLE}
۳. Clone کردن پروژه
حال که تنظیمات اصلی پروژه پیادهسازی شد نیاز است تا پروژه اصلی را از گیتهاب دریافت کنیم.
$ git clone https://github.com/faizanbashir/python-ses-dynamodb-contactform
$ cd python-ses-dynamodb-contactform
۴. تأیید آدرس ایمیل با استفاده از SES
برای تأیید کردن آدرس ایمیل تنها کاری که باید انجام دهید افزودن آن در محیط AWS است. بعد از آن یک ایمیل تأیید برای شما ارسال خواهد شد.
بعد از تأیید شدن ایمیل، آدرس آن در قسمت Verification Status به صورت verified نمایش داده میشود.
۳. پیکربندی اپلیکیشن
در این قسمت شما نیاز خواهید داشت تا serverless.yml را با اطلاعات منحصر به فرد خودتان پیکربندی کنید. برای اینکار به صورت زیر اطلاعات مورد نیازتان را پر کنید:
provider:
name: aws
runtime: python2.7
region: <aws-region>
profile: <aws-user>
...
environment:
SENDER_EMAIL: <verified-email-address>
۴. دیپلوی در AWS
همه چیز به خوبی پیادهسازی شده است. حال تنها چیزی که نیاز دارید دیپلوی کردن پروژه روی AWS است. برای انجام این کار تنها کافیست از دستور زیر استفاده کنید:
$ sls deploy -v
انجام این کار منطقاً چند دقیقه بیشتر زمان نخواهد برد.
اگر توابع را درست مانند موارد گفته شده در پروژه پیادهسازی کرده باشید در آخر فرایند دیپلوی یک لیست شبیه به زیر که شامل endpointهای مختلفی میشود برای شما به نمایش در خواهد آمد.
endpoints:
POST - https://xxx.execute-api.xx.amazonaws.com/development/sendMail
GET - https://xxxx.execute-api.xx.amazonaws.com/development/list
۵. تست endpointها
حال که ما یکسری endpoint را تعریف کردهایم بیایید آنها را نیز تست کنیم. برای اینکار تنها کافیست از یک دستور ساده curl استفاده کنیم که انتظار داریم تا دادههایی به شکل JSON را برگرداند.
$ curl --header "Content-Type: application/json" \--request POST \--data '{"firstname": "John", "lastname": "Doe", "email": "john@doe.com", "message": "Hi there"}'\https://xxx.execute-api.xx.amazonaws.com/development/sendMail
اگر همه کارها به درستی پیش برود، در نهایت خروجی زیر به نمایش در خواهد آمد:
> "Email Sent!"
۶. فرم تماس
حال که توابع Serverless به خوبی کار میکنند نیاز است تا برای تمام کردن آموزش، فرم تماس استاتیک را با موارد گفته شده ادغام کنیم. کدهای مربوط به پروژه فرم تماس را میتوانید در دایرکتوری public مشاهده کنید.
فایل index.html را باز کرده و مقدار متغیر URL را با endpoint مربوط به sendMail تغییر دهید.
var URL = "https://xxx.execute-api.xx.amazonaws.com/development/sendMail";
حال میتوانید از طریق کدهای زیر محتوای جدید را روی s3 قرار دهید:
aws s3 sync public s3://your-bucket-name
برای مطمئن شدن از کارکرد نهایی، بهتر است آن را تست کنید.
در پایان
در این مطلب از وبسایت راکت ما به خوبی با فضای کاری سرویس S3 آشنا شدیم و توانستیم که با آن تعامل برقرار کنیم. بعد از آشنایی با این سرویس نیز، فرم تماس باما را به سادگی روی s3 دیپلوی کردیم.
دیدگاه و پرسش
در حال دریافت نظرات از سرور، لطفا منتظر بمانید
در حال دریافت نظرات از سرور، لطفا منتظر بمانید