تغییر مسیر 301 con CloudFront y Lambda@EDGE
من اخیراً نیازی داشتم که شامل هدایت یک URL ثبت شده در Route53 به یک برنامه وب پیشرو (PWA) است که در یک سطل S3 مستقر شده و از طریق Cloudfront با زیر دامنه خودش توزیع شده است.
در کمال تعجب، AWS نمی تواند آن درخواست را با استفاده از خدمات ذکر شده در بالا به روشی ساده انجام دهد. در این مقاله به شما خواهم گفت که چگونه این کار را مرحله به مرحله انجام دهید.
کد وضعیت پاسخ HTTP 301 چیست؟
کدهای وضعیت مختلفی در پاسخ به درخواست HTTP وجود دارد، از جمله کد 301 که نشان دهنده تغییر مسیر دائمی از یک URL به URL دیگر است و همه کاربران را به URL مقصد جدید ارسال می کند. معمولاً وقتی URL یک وب سایت موجود را تغییر می دهیم استفاده می شود.
برای اطلاعات بیشتر بخوانید:
کدهای وضعیت پاسخ HTTP
بیایید آن را انجام دهیم
برای انجام ریدایرکت درخواستی، یک تابع Lambda@EDGE ایجاد میکنیم که میزبان یک درخواست را ارزیابی میکند و اگر با URL که میخواهیم تغییر مسیر دهیم مطابقت داشته باشد، یک تغییر مسیر 301 را به URL PWA ما انجام میدهد. ما قصد داریم آن تابع را با توزیع CloudFront که در آن PWA قرار دارد مرتبط کنیم.
به طور خلاصه، کاری که باید انجام دهید این است:
به CloudFront بروید و URL خود را، آدرسی که می خواهیم تغییر مسیر دهیم، به عنوان نام دامنه جایگزین اضافه کنید. برای انجام این کار، به توزیع CloudFront خود می رویم، در برگه عمومی تنظیمات را ویرایش می کنیم و یک نام دامنه جایگزین (CNAME) قرار دادن URL که می خواهیم تغییر مسیر 301 را روی آن اعمال کنیم.
اکنون باید URL خود را برای تغییر مسیر به توزیع CloudFront پیوند دهیم. برای انجام این کار، به Route53 بروید، یک رکورد نوع A ایجاد کنید و همان URL را که در مرحله قبل اضافه کردیم قرار دهید. ما قصد داریم توزیع CloudFront را با نام مستعار فیلتر کنیم و خواهیم دید که وقتی CloudFront را انتخاب می کنیم، به دلیل اینکه قبلاً آن دامنه را به عنوان دامنه جایگزین اضافه کرده بودیم، گزینه انتخاب توزیع PWA ما به طور خودکار ظاهر می شود. نام توزیع ما
در نهایت، یک تابع lambda@EDGE ایجاد کنید و آن را به توزیع CloudFront خود مرتبط کنید تا وقتی از طریق urlARedir به آن دسترسی پیدا میکنیم، یک پاسخ 301 ایجاد کند و ما را به URL اصلی PWA هدایت کند. برای این کار، به Lambda -> Create Function رفته و نویسنده را از ابتدا انتخاب کنید. ما قصد داریم از NodeJs و معماری x86 برای ایجاد تابع خود استفاده کنیم.
پس از ایجاد تابع، یک کد نمونه ظاهر می شود که باید ویرایش شود و کد زیر اضافه شود:
exports.handler = async (event) => {
const request = event.Records[0].cf.request;
if (request.headers.host[0].value === 'urlARedirigir') {
return {
status: '301',
statusDescription: `Redirecting to other domain`,
headers: {
location: [{
key: 'Location',
value: `https://urlPWA${request.uri}`
}]
}
};
}
return request;
};
یک جزئیات مهم در مورد تابع این است که urlARediririr فقط میزبان URL ما است، بنابراین مقدار آن نباید حاوی پروتکل باشد.
مثال:
URL = https://exampleUrl.com
میزبان = exampleUrl.com
پس از وارد کردن کد، ما یک Deploy انجام می دهیم (با فشار دادن دکمه واقع در بالای کادر کد) و باید تابع Lambda خود را از منوی کرکره action -> publish new version منتشر کنیم.
قبل از ادامه راهاندازی عملکرد ما با توزیع CloudFront، به تب Configuration رفته و در ستون سمت چپ Permission را انتخاب کنید. در آنجا خواهیم دید که یک ROLE ایجاد شده است. روی نام نقش کلیک می کنیم و ما را به سرویس IAM هدایت می کند.
در سرویس پیکربندی ROL در سرویس IAM، به برگه مجوزها میرویم و خط مشی ایجاد شده با افزودن چندین مجوز را ویرایش میکنیم و آن را به این صورت میگذاریم:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": "logs:CreateLogGroup",
"Resource": "arn:aws:logs:us-east-1:<accountID>:*"
},
{
"Effect": "Allow",
"Action": [
"logs:CreateLogStream",
"logs:PutLogEvents",
"lambda:GetFunction",
"lambda:EnableReplication*",
"iam:CreateServiceLinkedRole",
"cloudfront:UpdateDistribution",
"cloudfront:CreateDistribution"
],
"Resource": [
"arn:aws:logs:us-east-1:<accountID>:log-group:/aws/lambda/redirect301:*",
"arn:aws:cloudfront::<accountID>:distribution/*",
"arn:aws:lambda:*:<accountID>:function:*",
"arn:aws:iam::*:role/*"
]
}
]
}
سپس به تب Trust Relations رفته و روی دکمه Edit Trust Relation کلیک می کنیم و خط مشی را طوری ویرایش می کنیم که به شکل زیر باشد:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"Service": [
"lambda.amazonaws.com",
"edgelambda.amazonaws.com"
]
},
"Action": "sts:AssumeRole"
}
]
}
پس از انجام این تغییر، به سرویس Lambda برمی گردیم و به تابع خود می رویم. دکمه Add trigger را لمس می کنیم و سرویس CloudFront را انتخاب می کنیم. سپس دکمه Deploy to Lambda@Edge را لمس می کنیم. این یک پنجره باز می شود که در آن توزیع CloudFront را در جایی که PWA ما قرار دارد انتخاب می کنیم، درخواست Viewer را به عنوان رویداد توزیع خود انتخاب می کنیم و در نهایت تأیید استقرار را بررسی می کنیم و “Deploy” را فشار می دهیم.
هنگامی که ماشه مستقر شد، می توانیم ببینیم که سرویس CloudFront در صفحه عملکرد ما ظاهر می شود. در نهایت، اگر به بخش Behavior توزیع CloudFront خود برویم، خواهیم دید که در بخش Functions Associations، Lambda@Edge تازه ایجاد شده ما در درخواست Viewer یافت میشود.
و بس!
با تشکر از خواندن، امیدوارم برای شما مفید باشد. می توانید سوالات یا نظرات خود را در زیر مطرح کنید.