CDK Mixins: ترکیبپذیری زیرساخت در AWS CDK
خلاصهٔ کاملتر
AWS CDK (ابزار تعریف زیرساخت ابری با کد) تا حالا Constructهاش رو در سه سطح دستهبندی میکرد: L1 که مستقیماً به منابع CloudFormation نگاشت میشه، L2 که abstractionهای سطح بالاتر با پیشفرضهای امنیتی ارائه میده، و L3 که چند منبع رو برای یه کاربرد خاص کنار هم میذاره. مشکل اینجاست که این معماری یه تناقض اساسی داشت: یا باید فوری به ویژگیهای جدید AWS دسترسی داشتی (L1) یا از abstractions پیشرفته بهرهمند میشدی (L2/L3)، ولی نه هر دو با هم.
CDK Mixins این مشکل رو حل میکنه. Mixins کلاسهای سادهای هستن که از cdk.Mixin ارث میبرن و رابط IMixin رو پیادهسازی میکنن. متد supports() تعیین میکنه که Mixin به چه Constructهایی قابل اعماله، و متد applyTo() اون Construct رو مستقیماً تغییر میده. مهمترین ویژگیشون اینه که میتونی همون Mixin رو به L1، L2، یا Construct سفارشی اعمال کنی — بدون اینکه کتابخونهی Construct رو از نو بنویسی.
برای اعمال یه Mixin دو روش وجود داره: سینتکس fluent یعنی .with() که مستقیم روی Construct فراخوانی میشه، و cdk.Mixins.of() که کنترل دقیقتری میده و در همهی زبانها کار میکنه. مثلاً:
new s3.Bucket(stack, "MixinsL2DemoBucket")
.with(new CfnBucketPropsMixin({
objectLockEnabled: true,
objectLockConfiguration: {
objectLockEnabled: "Enabled",
rule: { defaultRetention: { mode: "COMPLIANCE", days: 30 } },
},
}));میتونی یه Mixin سفارشی هم بنویسی که روی چند سرویس مختلف کار کنه. مثلاً یه Mixin برای Data Recovery که هم روی باکتهای S3 و هم روی جدولهای DynamoDB اعمال میشه — و بعد اون رو یهجا به کل app اعمال کنی:
cdk.Mixins.of(app).apply(new MyDataRecovery());
// یا فقط روی باکتهای S3
cdk.Mixins.of(app, cdk.ConstructSelector.resourcesOfType(s3.CfnBucket.CFN_RESOURCE_TYPE_NAME))
.apply(new MyDataRecovery());یکی از کاربردهای جذاب Mixins، vended log delivery (ارسال لاگ به مقصدهای مختلف) هست که تا حالا نیاز داشت چند منبع CloudFormation جداگانه رو با دست به هم وصل کنی. با Mixins این کار با یه .with() ساده انجام میشه و برای ۴۷ منبع AWS پشتیبانی داره — چه از L1 استفاده کنی چه L2.
برای کنترل رفتار Mixinها سه حالت وجود داره: حالت graceful که Constructهای ناسازگار رو بیسروصدا رد میکنه، requireAll که اگه حتی یه Construct پشتیبانی نشه خطا میده، و requireAny که اگه هیچ Constructای پشتیبانی نشه خطا میده. همچنین با result.report میتونی ببینی Mixin روی کدوم Constructها اعمال شده.
نکات کلیدی:
- Mixins بخشی از aws-cdk-lib هستن و نیاز به نصب جداگانه ندارن
- پکیج @aws-cdk/cfn-property-mixins برای override ایمن (type-safe) خصوصیات L1 استفاده میشه
- Mixinهای vended log delivery هنوز در مرحلهی preview هستن و از پکیج @aws-cdk/mixins-preview در دسترسن
- Mixins و Aspects مکمل هم هستن: Mixins ویژگیها رو فوری اعمال میکنن، Aspects قوانین رو در کل scope هنگام synthesis اجرا میکنن
- با ConstructSelector میتونی Mixin رو فقط به نوع خاصی از منابع یا با ID مشخص اعمال کنی




