برنامه نویسی

برخورد با منابع و خرابی های سفارشی 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 ما موفقیت آمیز خواهد بود.

خطا در MigrationLambda

خوب ، اما چرا؟

همانطور که در ابتدا ذکر شد ، عملکرد Singleton Lambda مسئول تماس های AWS SDK است. به عبارت دیگر ، این فقط یک “حامل” بین CloudFormation و AWS API است.

این بدان معنی است که برای وضعیت CustomResource (SUCCESS یا FAILED) فقط در صورت تماس API مرتبط است خود موفق بود یا نه بنابراین اگر به عنوان مثال MigrationLambda دیگر خارج نشود و تماس API خطایی را بر می گرداند که کل استقرار ما با شکست روبرو می شود.

خطا در SDK خود تماس بگیرید

راه حل

اما اگر بخواهیم استقرار شکست بخورد ، چه می شود؟ در مثال ما می خواهیم متوجه شویم که آیا مهاجرت پایگاه داده موفقیت آمیز نبوده است.

شما می توانید با استفاده از یک ارائه دهنده سفارشی به جای عملکرد Singleton Lambda که از جعبه خارج می شود ، به این هدف برسید.

با استفاده از یک عملکرد 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 و غیره


پیشنهادات یا بازخورد

اگر هر نوع بازخورد ، پیشنهادات یا ایده ها را دریافت کرده اید – در زیر این مقاله نظر رایگان داشته باشید و نظر خود را بنویسید. همیشه فضا برای بهبود وجود دارد!

نوشته های مشابه

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

دکمه بازگشت به بالا