برخورد با منابع و خرابی های سفارشی CDK.

با AwsCustomResource
CONTRCUT CDK راهی آسان برای اجرای تماس های AWS SDK در طول استقرار CloudFormation فراهم می کند. موارد استفاده مشترک به عنوان مثال مقادیر واکشی از فروشگاه پارامتر یا اجرای توابع لامبدا است.
چگونه کار می کند؟
برای انجام تماس SDK CloudFormation یک عملکرد Singleton Lambda از جمله JavaScript SDK را مستقر می کند. این عملکرد در طی وقایع چرخه زندگی CloudFormation اجرا خواهد شد (CREATE
با UPDATE
وت DELETE
) و تماس های SDK را در برابر API های AWS انجام دهید. پاسخ JSON از Singleton Lambda در S3 ذخیره می شود و از CloudFormation خوانده می شود.
در مورد شکست ها چطور؟
همانطور که در عنوان ذکر شد این پست در مورد شکست ها است. زیرا در این مرحله من هنگام اجرای توابع لامبدا کمی تحریک شدم.
بیایید بگوییم که ما یک تابع لامبدا داریم “مهاجر“برای انجام برخی از عملکردهای پایگاه داده (به عنوان مثال مهاجرت داده ها) در طول استقرار ما. بنابراین می توانیم از Awscustomresource برای اجرای خود استفاده کنیم مهاجر در هر UPDATE
رویداد پشته CloudFormation ما.
new custom_resources.AwsCustomResource(this, 'CustomResource', {
onUpdate: {
service: 'Lambda',
action: 'invoke',
parameters: {
FunctionName: migrationLambda,
InvocationType: 'Event',
Payload: JSON.stringify({
someKey: 'someValue'
}),
},
},
});
تا اینجای کار خیلی خوبه.
اما چه اتفاقی می افتد اگر MigrationLambda به دلایلی شکست بخورد …؟ هیچبشر استقرار CloudFormation ما موفقیت آمیز خواهد بود.
خوب ، اما چرا؟
همانطور که در ابتدا ذکر شد ، عملکرد Singleton Lambda مسئول تماس های AWS SDK است. به عبارت دیگر ، این فقط یک “حامل” بین CloudFormation و AWS API است.
این بدان معنی است که برای وضعیت CustomResource (SUCCESS
یا FAILED
) فقط در صورت تماس API مرتبط است خود موفق بود یا نه بنابراین اگر به عنوان مثال MigrationLambda دیگر خارج نشود و تماس API خطایی را بر می گرداند که کل استقرار ما با شکست روبرو می شود.
راه حل
اما اگر بخواهیم استقرار شکست بخورد ، چه می شود؟ در مثال ما می خواهیم متوجه شویم که آیا مهاجرت پایگاه داده موفقیت آمیز نبوده است.
شما می توانید با استفاده از یک ارائه دهنده سفارشی به جای عملکرد Singleton Lambda که از جعبه خارج می شود ، به این هدف برسید.
چارچوب ارائه دهنده در مقابل لامبدا به طور مستقیم
دو روش برای استفاده از یک تابع لامبدا به عنوان ارائه دهنده سفارشی وجود دارد. می توانید مستقیماً از چارچوب ارائه دهنده یا یک لامبدا استفاده کنید. من همچنین در این مرحله در ابتدا کمی گیج شدم ، زیرا نحوه رسیدگی به پاسخ به نوع شما انتخاب می شود.
تفاوت اصلی در اینجا این است که چارچوب ارائه دهنده در ارسال پاسخ شما به سطل S3 مراقبت می کند. به عبارت دیگر ، شما به سادگی می توانید داده ها را برگردانید یا خطایی را در عملکرد لامبدا خود پرتاب کنید. هنگام استفاده مستقیم از عملکرد لامبدا باید یک را انجام دهید PUT
خود را در برابر URL پیش از مجله S3 توسط خودتان درخواست کنید. AWS با استفاده از چارچوب ارائه دهنده توصیه می کند (“[…] مگر اینکه دلایل خوبی نداشته باشید. “)!
به هر حال ، با هر دو نوع ، ما بسته به منبع منابع سفارشی Lambda ، کنترل کامل آنچه را که با استقرار ما اتفاق می افتد ، کنترل می کنیم.
// CDK
const providerLambda = new aws_lambda_nodejs.NodejsFunction(
this,
"ProviderLambda",
{
entry: path.join(__dirname, "index.ts"),
}
);
const provider = new custom_resources.Provider(this, "Provider", {
onEventHandler: providerLambda,
});
new CustomResource(this, "CustomResource", {
// Using the Provider Framework
serviceToken: provider.serviceToken,
// Alternative: Using Lambda directly
// serviceToken. providerLambda.functionArn,
properties: {
timestamp: new Date().toISOString(),
},
});
عملکرد لامبدا
export const handler = async (
event: AWSLambda.CloudFormationCustomResourceEvent,
_context: AWSLambda.Context
) => {
// your business logic here ...
// Variant 1: Using the Provider Framework
// Success case
const responseObject: AWSLambda.CloudFormationCustomResourceResponse = {
Status: "SUCCESS",
PhysicalResourceId: "SomeCustomResourceId",
StackId: event.StackId,
RequestId: event.RequestId,
LogicalResourceId: event.LogicalResourceId,
Data: {
key: "some custom value",
},
};
return responseObject;
// Error case
throw new Error("Your error message");
// Varinat 2: Using Lambda directly
// Success case
const responseObject: AWSLambda.CloudFormationCustomResourceResponse = {
Status: "SUCCESS",
PhysicalResourceId: "SomeCustomResourceId",
StackId: event.StackId,
RequestId: event.RequestId,
LogicalResourceId: event.LogicalResourceId,
Data: {
key: "some custom value",
},
};
await fetch(event.ResponseURL, {
body: JSON.stringify(responseObject),
method: "PUT",
});
// Error case
const responseObject: AWSLambda.CloudFormationCustomResourceResponse = {
Status: "FAILED",
Reason: "Your error message",
PhysicalResourceId: "SomeCustomResourceId",
StackId: event.StackId,
RequestId: event.RequestId,
LogicalResourceId: event.LogicalResourceId,
};
await fetch(event.ResponseURL, {
body: JSON.stringify(responseObject),
method: "PUT",
});
};
نکاتی که باید در نظر بگیرید
رویداد به روزرسانی
به طور پیش فرض CustomResource هنگام به روزرسانی پشته CloudFormation ، حتی اگر کد ارائه دهنده تغییر کند ، اجرا نمی شود. این تنها در صورت تغییر خواص بین استقرار اتفاق می افتد. بنابراین ما می توانیم تنظیم کنیم timestamp
برای دستیابی به رفتار مورد نیاز (به مثال CDK در بالا مراجعه کنید).
وقایع چرخه زندگی در Generell
ارائه دهنده ما در هر رویداد چرخه زندگی اجرا می شود. بنابراین ما باید مراقبت کنیم که کدام رویدادها در کد لامبدا ما مرتبط هستند. شاید شما فقط می خواهید این کار را انجام دهد CREATE
اما مهره UPDATE
وت DELETE
و غیره
پیشنهادات یا بازخورد
اگر هر نوع بازخورد ، پیشنهادات یا ایده ها را دریافت کرده اید – در زیر این مقاله نظر رایگان داشته باشید و نظر خود را بنویسید. همیشه فضا برای بهبود وجود دارد!