قواعد التسمية
القواعد العامة
استعمل _ (underscore) بدلاً من - (dash) في كل مكان (أسماء الموراد، أسماء مصادر البيانات، أسماء المتحولات، أسماء المخرجات الخ..)
فضل استعمال الأحرف الصغيرة (lowercase) والأرقام فقط (حتى لو كان نظام UTF-8 مدعوماً)
أسماء الموراد ومصادر البيانات
لا تكرر نوع المورد في اسم المورد (ليس جزئيًا أو كليًا):
resource "aws_route_table" "public" {}resource "aws_route_table" "public_route_table" {}resource "aws_route_table" "public_aws_route_table" {}يجب تسمية المورد باسم
thisإذا لم يكن هناك اسم وصفي وعام متاح، أو إذا كانت وحدة الموارد تنشئ موردًا واحدًا من هذا النوع (كمثال في AWS VPC module يوجد فقط مورد وحيد من النوعaws_nat_gatewayوعدة موارد من النوعaws_route_tableلذلك يجب تسمية المورد من نوعaws_nat_gatewayباسمthisويجب أن نستعمل أسماء وصفية اكثر من أجل موارد النوعaws_route_tableمثلprivate,public,database)استخدم دائمًا الأسماء المفردة للتسمية.
استعمل - (dash) داخل قيم الوسيطات وفي الأماكن التي ستتعرض فيها القيمة للبشر (على سبيل المثال ، اسم DNS لخادم افتراضي RDS).
استعمل الوسيطان
count/for_eachداخل المورد أو داخل مصدر البيانات كأول وسيط وقم بإضافة سطر فارغ بعدهاستعمل الوسيط
tagsإذا كان مدعوماً من قبل المورد كأخر وسيط متبوع بالوسيطاتdepends_on, lifecycleإذا احتجت إليها، كل منها مفصول عن الأخر بسطر فارغ.عند استعمال شروط للوسيطان
count/for_eachففضل استعمال القيم المنطقية عوضاً عنlengthأو أي تعابير أخرى
أمثلة كود لأسماء المصادر
استعمال count / for_eachفي الكود
count / for_eachفي الكودresource "aws_route_table" "public" {
count = 2
vpc_id = "vpc-12345678"
# ... remaining arguments omitted
}
resource "aws_route_table" "private" {
for_each = toset(["one", "two"])
vpc_id = "vpc-12345678"
# ... remaining arguments omitted
}resource "aws_route_table" "public" {
vpc_id = "vpc-12345678"
count = 2
# ... remaining arguments omitted
}وضعية tagsفي الكود
tagsفي الكودresource "aws_nat_gateway" "this" {
count = 2
allocation_id = "..."
subnet_id = "..."
tags = {
Name = "..."
}
depends_on = [aws_internet_gateway.this]
lifecycle {
create_before_destroy = true
}
} resource "aws_nat_gateway" "this" {
count = 2
tags = "..."
depends_on = [aws_internet_gateway.this]
lifecycle {
create_before_destroy = true
}
allocation_id = "..."
subnet_id = "..."
} استعمال الشروط في countفي الكود
countفي الكودresource "aws_nat_gateway" "that" { # Best
count = var.create_public_subnets ? 1 : 0
}
resource "aws_nat_gateway" "this" { # Good
count = length(var.public_subnets) > 0 ? 1 : 0
}أسماء المتحولات
لا تعيد اختراع العجلة في وحدات الموارد: استخدم الاسم
nameوالوصفdescriptionوالقيمة الافتراضيةdefaultللمتحولات كما هو محدد في قسم "Argument Reference" للمورد الذي تعمل معه.عملية التحقق (Validation) من المتحولات محدود نوعًا ما (على سبيل المثال ، لا يمكن الوصول إلى متحولات أخرى أو إجراء عمليات بحث). خطط وفقًا لذلك لأنه في كثير من الحالات تكون هذه الميزة غير مجدية.
استخدم صيغة الجمع في اسم متحول عند يكون نمطه
listأوmap.قم بترتيب الأقسام في المتحول كالتالي:
descriptionثمtypeثمdefaultوأخيراًvalidationدائماً قم بإضافة قسم
descriptionإلى كل المتحولات حتى لو كنت تظن أنه واضح (ستحتاجه في المستقبل)فضل استعمال الأنواع البسيطة (
number,string,list(...),map(...),any) على الأنواع الأخرى مثلobject،إلا إذا كنت تحتاج قيود صارمة على كل keyاستعمل الأنماط المحددة مثل
map(string)في حال كانت كل العناصر الموجودة داخلها من نفس النمط أو كان يمكن تحويلها إلى هذا النمط (مثلاً النمطnumberممكن تحويله إلى النمطstring)استعمل النمط
anyلتعطيل التحقق من النوع بدءاً من عمق معين أو عندما يجب دعم أنواع متعددةالقيمة {} هي عبارة عن map في بعض الأحيان وobject في أحيان أخرى. استعمل ()tomap لجعلها من النمط map دائماً.
أسماء المخرجات
اجعل المخرجات متسقة ومفهومة خارج سياقها ( عندما يتم استعمال وحدة من قبل مستخدم يجب على المخرجات أن تكون واضح ما هو نمط وما صفات القيمة التي ترجعها)
يجب على اسم الخرج أن يصف القيمة التي يرجعها وأن تكون أقل حرية مما تريد عادة.
الشكل الجيد لاسم الخرج يكون كالتالي
{attribute}_{type}_{name}حيث:إن
{name}هو اسم المورد أو اسم مصدر البيانات بدون اسم الموفر. كمثال للموردaws_subnetيكون الاسم هوsubnetوللموردaws_vpcيكونvpcإن {type}هو نمط الخرج الئي نتعامل معهإن
{attribute}هو الصفة المخرجة
إذا كان الخرج يعيد قيمة مع استعمال interpolation functions وعدة موارد فيجب على
{name} و{type}أن تكون معممة قدر الإمكان (this يجب حذفها)انظر الأمثلةإذا كانت قيمة الخرج عبارة عن list فإنه يجب أن نستعمل اسم جمع انظر الأمثلة
دائماً قم بإضافة قسم
descriptionإلى كل المخرجات حتى لو كنت تظن أنه واضحتجنب وضع وسيط
sensitiveإلا إذا كنت تملك تحكم كامل باستعمال هذا الخرج في كل الأماكن في كل الوحداتفضل استعمال ()
try(متوفرة منذ الإصدار 0.13) على استعمالelement(concat(...))(التي كانت تستعمل قبل 0.13)
أمثلة كود لأسماء المخرجات
تعيد على الأكثر Security group ID وحيد
output "security_group_id" {
description = "The ID of the security group"
value = try(aws_security_group.this[0].id, aws_security_group.name_prefix[0].id, "")
}عند وجود عدة مصادر من نفس النمط، يجب حذفthisمن الخرج:
output "this_security_group_id" {
description = "The ID of the security group"
value = element(concat(coalescelist(aws_security_group.this.*.id, aws_security_group.web.*.id), [""]), 0)
إذا كانت قيمة الخرج عبارة عن list فإنه يجب أن نستعمل اسم جمع :
output "rds_cluster_instance_endpoints" {
description = "A list of all cluster instance endpoints"
value = aws_rds_cluster_instance.this.*.endpoint
}Last updated