ساخت توابع Golang Lambda – انجمن DEV

استفاده از CDK برای ساخت توابع Golang Lambda یک فرآیند بسیار ساده و کار با آن به اندازه کافی آسان است. به خوبی مستند شده است و زیر کلاسی است Function
کلاس تعریف شده در aws-cdk-lib/aws-lambda
. در مورد CDK یا آنچه می تواند برای شما انجام دهد مطمئن نیستید؟ اینجا را بخوانید تا شروع کنید و ببینید این همه هیاهو برای چیست.
اخیراً چندین مقاله نوشتهام که دارای CDK با نمونههای TypeScript هستند که ساخت Lambdas مبتنی بر Golang را برجسته میکنند. اما متوجه شدم که برخی از قابلیتهای اضافی را نشان ندادهام Construct
افشا می کند. من می خواهم مجموعه ای از گزینه های زیر را بررسی کنم.
- نقطه ورود
- زمان اجرا انتخاب شد
- تایم اوت
- نام تابع
- تعریف محیط لامبدا
- ساخت آرگومان ها از جمله ساخت پرچم ها
مثالی برای ادامه این مقاله.
new GoFunction(scope, "ExampleFuncHandler", {
entry: path.join(__dirname, "./example-func"),
functionName: "example-func",
timeout: Duration.seconds(30),
bundling: {
goBuildFlags: ['-ldflags "-s -w"'],
},
environment: {
LOG_LEVEL: "INFO",
TABLE_NAME: "ExampleTable",
},
});
نقطه ورود
entry: path.join(__dirname, "./example-func");
ویژگی ورودی در GoFunction
به سازه می گوید که کجا خود را پیدا کند main.go
یا نقطه “ورود”.
زمان اجرا
استقرار توابع Golang Lambda شما پس از ساخت، چند گزینه را هنگام انتخاب آن محیط زمان اجرا فراهم می کند. شخصاً، انتخاب به این نتیجه می رسد:
- آیا می خواهید پیش فرض را اجرا کنید؟
- آیا می خواهید توانایی اجرای برنامه های افزودنی Lambda را داشته باشید؟
اگر پاسخ هر یک از آنها مثبت است، کافیست زمان اجرا پیشفرض را که Construct انتخاب میکند، بمانید. این AL2 (Amazon Linux 2) خواهد بود. اگر بخواهید این را از کنسول انتخاب کنید، در گزینه های Custom Runtime قرار خواهد گرفت. به خاطر داشته باشید که هنگام استفاده از AL2، باید باینری خود را نامگذاری کنید bootstrap
.
نام تابع
functionName: "example-func",
این یکی سرراست است. تنها توصیه من در اینجا این است که وقتی چیزها در یک “برنامه” یا گروه بندی مشترک قرار می گیرند، آنها را با پیشوند مشابه نامگذاری کنید.
تایم اوت
timeout: Duration.seconds(30),
همچنین سرراست. اما هنگام ساخت توابع Golang Lambda، به تایم اوت توجه کنید. این است Duration
که می خواهید تابع شما منتظر پاسخ در کد شما باشد. خیلی پایین نروید اما خیلی هم بالا نروید. و در کد خود، همیشه وقتی می دانید که می توانید، برگردید.
تعریف محیط لامبدا
environment: {
LOG_LEVEL: "INFO",
TABLE_NAME: "ExampleTable",
},
تمام تلاش خود را بکنید تا پارامترهایی را که ممکن است در متغیرهای محیطی تغییر کنند، لحاظ کنید. اگر اطلاعات نوع حساسی دارید، از SSM یا Secrets Manager استفاده کنید، اما برای مواردی مانند نام جدول یا سطوح گزارش، متغیرها عالی هستند. با CDK، میتوانید اینها را با توابعی پر کنید تا سطوح گزارش یا ویژگیهای ساختارهای جدول را برای نام جدول واکشی کنید.
یک تابع Log Level ساده ممکن است شبیه این باشد
export const getLogLevel = (stage: StageEnvironment): string => {
switch (stage) {
case StageEnvironment.DEV:
case StageEnvironment.QA:
return "debug";
}
return "error";
};
آرگومان بسازید
یکی از چیزهایی که من در تمام مقالاتم مستندسازی را از دست دادهام، این بخش از ساختار GoFunction است. هنگام ساخت توابع Golang Lambda، می توانید انتخاب کنید که از نصب محلی Golang خود استفاده کنید یا ساخت را مجبور کنید در یک ظرف Docker اتفاق بیفتد. من به دلیل سرعت در ساختهای محلی در مک خود تمایل دارم در Docker ایجاد نکنم (این یک چیز کند مستند است).
با این حال می خواهم استفاده از آن را توصیه کنم goBuildFlags
برای برش اندازه فایل اجرایی خود. شما این کار را به این صورت انجام می دهید:
bundling: {
goBuildFlags: ['-ldflags "-s -w"'],
},
با Golang، ‘ldflags’ مخفف Linker Flags است و به ابزار ساخت Golang آموزش می دهد که چگونه باینری را کنار هم قرار دهد. دو پرچمی که من توصیه می کنم این هستند -s
و -w
. پر گولنگ:
> go tool link
-s disable symbol table
-w disable DWARF generation
این دو گزینه باید فایل اجرایی شما را بین 20 تا 25 درصد کوچک کنند که تا حدودی بر موارد زیر تأثیر دارد.
- باینری کوچکتر، راه اندازی سریعتر و شروع سردتر است
- باینری کوچکتر، کمتر در S3 در طول فرآیند CI/CD کپی می شود
بسته شدن
CDK نحوه ساخت و استقرار راه حل ها را در AWS تغییر داده است. و نقش مهمی در پذیرش کامل Golang به عنوان زبان اصلی من برای ساخت برنامههای بدون سرور داشت. امیدوارم که چند نکته را مورد توجه قرار داده باشید. این ldflags
قطعهای است که من آن را در بسیاری از مکانها مستند نمیبینم و به راحتی میتوان آن را به دست آورد.