متغیرهای Terraform در مقابل افراد محلی – انجمن DEV

Summarize this content to 400 words in Persian Lang
با وجود اینکه هم متغیرها و هم محلیها به شما امکان تعریف مقادیر در کد Terraform را میدهند، اما اهداف خاصی را دنبال میکنند، دامنههای مختلف، تغییرپذیری و البته موارد استفاده متفاوتی دارند. به خصوص زمانی که سازمان و زیرساخت ها در حال رشد هستند، مدیریت صحیح آن ها بسیار مهم است تا کد تمیز، قابل نگهداری و قابل استفاده مجدد باشد. این پست وبلاگ به شما کمک میکند تا چالشهای نوشتن کد تمیز را در مقیاس بالا مرور کنید.
متغیرها:
تعریف: موجودیت های نام گذاری شده ای که به شما امکان می دهد تنظیمات TF خود را پارامتر کنید
هدف: ایجاد کد TF انعطاف پذیر، قابل استفاده مجدد در محیط های مختلف
مردم محلی:
تعریف: مقادیر نامگذاری شده که به شما امکان می دهد مقدار واحد یا ساختار پیچیده را برای استفاده در یک ماژول تعریف کنید
هدف: ساده سازی عبارات پیچیده و خوانایی بیشتر کد TF
تفاوت های کلیدی:
محدوده: محلی ها به ماژولی که در آن تعریف می شوند محدود می شوند، در حالی که متغیرها را می توان در سطح ماژول تعریف کرد و بین ماژول ها منتقل می شود.
تغییرپذیری: محلیها پس از تعریف غیرقابل تغییر هستند، در حالی که متغیرها میتوانند مقدار پیشفرض داشته باشند اما در طول زمان اجرا نیز لغو شوند.
Use case: برای جلوگیری از کدهای تکراری، از محلی ها در یک ماژول استفاده کنید و هر زمان که انتظار دارید ورودی به ماژول مانند پیکربندی EC2 مختلف در هر محیط، از متغیرها استفاده کنید.
مثال:بیایید عملکرد AWS Lambda را مثال بزنیم و از آنجایی که در پروژه ما به تعداد زیادی نیاز خواهیم داشت، البته بهترین تمرین این است که منابع مرتبط با Lambda مانند خود Lambda، نقشها و سیاستهای IAM، منبع رویداد، گروه CloudWatch و غیره را در ماژول Terraform قرار دهیم تا قابل استفاده مجدد در سراسر پروژه همانطور که می توانید تصور کنید این ماژول پر از متغیر خواهد بود زیرا ما می خواهیم مقادیر مختلفی را برای هر فراخوانی ماژول Lambda ارسال کنیم. اینها برخی از متغیرهایی هستند که ماژول شما می تواند داشته باشد:
variable “lambda_name” {
type = string
description = “AWS Lambda name”
}
variable “lambda_iam_role_arn” {
type = string
description = “The IAM role ARN for lambda”
}
variable “lambda_memory_size” {
type = number
description = “Lambda memory size for lambda”
default = 128
}
variable “lambda_environment_variables” {
type = map(string)
description = “Map of lambda environment variables”
}
وارد حالت تمام صفحه شوید
از حالت تمام صفحه خارج شوید
این متغیرها انعطاف پذیری پیکربندی و پارامترسازی را فراهم می کنند. این به شما امکان می دهد تنظیمات هر تابع Lambda را سفارشی کنید. علاوه بر این، تعریف مقادیر به عنوان متغیر، هدف آنها را روشن میکند و کپسولهسازی را ترویج میکند. توجه داشته باشید که اندازه_حافظه_لامبدا معنی مقدار پیش فرض دارد هنگام فراخوانی ماژول Lambda، نیازی به ارائه ورودی برای آن ندارید، مگر اینکه بخواهید مقدار را لغو کنید.
مثال فراخوانی ماژول:
module “my_lambda_function” {
source = “./lambda_module” # Path to the Lambda module
lambda_name = “my_lambda_function” # Name of the Lambda function
lambda_iam_role_arn = aws_iam_role.lambda_exec.arn # ARN of the IAM role for the Lambda
lambda_memory_size = 256 # Memory size for the Lambda function
lambda_environment_variables = {
LOG_LEVEL = “INFO” # Environment variable for logging level
KINESIS_DATA_STREAM = aws_kinesis_stream.data_stream.name # Example Kinesis stream name
}
}
وارد حالت تمام صفحه شوید
از حالت تمام صفحه خارج شوید
این فراخوانی ماژول قدرت انعطاف پذیری و خوانایی را در صورت استفاده صحیح از متغیرها نشان می دهد. با این حال، همانطور که ممکن است متوجه شوید، بهتر است که متغیرهای env خاص Lambda را با استفاده از محلیها به جای ارسال مستقیم مقادیر ارائه کنید.
module “my_lambda_function” {
source = “./lambda_module” # Path to the Lambda module
lambda_name = “my_lambda_function” # Name of the Lambda function
lambda_iam_role_arn = aws_iam_role.lambda_exec.arn # ARN of the IAM role for the Lambda
lambda_memory_size = 256 # Memory size for the Lambda function
lambda_environment_variables = local.lambda_env_variables
}
وارد حالت تمام صفحه شوید
از حالت تمام صفحه خارج شوید
استفاده از محلی ها برای انتقال متغیرهای محیطی به یک ماژول به شما امکان مدیریت متمرکز مقادیر را می دهد تا بتوانید به جای جستجوی فراخوانی های ماژول، آنها را در یک مکان به روز کنید.همچنین این پیکربندی را خواناتر می کند و آنها را قابل استفاده مجدد می کند. به عنوان مثال، اگر محلی مشابه برای لامبداهای مختلف (تماس ماژول) مورد نیاز است، می توانید این را ارسال کنید:
locals {
lambda_env_variables = {
LOG_LEVEL = “INFO”
KINESIS_DATA_STREAM = aws_kinesis_stream.data_stream.name
…
}
}
وارد حالت تمام صفحه شوید
از حالت تمام صفحه خارج شوید
این مثال بیشتر توضیح می دهد که چرا ما از متغیرها به جای محلی برای استفاده نکردیم LOG_LEVEL و KINESIS_DATA_STREAM. این مقادیر مخصوص لامبدا هستند و باید آنها را پارامتر کنیم زیرا نیازی به انتقال آنها به ماژول های دیگر نداریم. توجه داشته باشید که ما از نوع لیست برای این متغیر استفاده میکنیم زیرا انتظار داریم چندین مقدار را از محلیهایی که ماژول را فراخوانی میکنیم ارسال کنیم.
احتمال زیادی وجود دارد که بسته به اینکه Lambda را در محیط DEV یا PROD استقرار میدهید، مقادیر متفاوتی برای lambda_memory_size بخواهید. این مورد زمانی است که شما متغیر دیگری را به جای محلی به آن ارسال می کنید، حتی اگر آن را مخصوص لامبدا باشد.این بدان معناست که فراخوانی ماژول ما در عوض به شکل زیر خواهد بود:
module “my_lambda_function” {
source = “./lambda_module” # Path to the Lambda module
lambda_name = “my_lambda_function” # Name of the Lambda function
lambda_iam_role_arn = aws_iam_role.lambda_exec.arn # ARN of the IAM role for the Lambda
lambda_memory_size = var.lambda_memory_size
# Memory size for the Lambda function
lambda_environment_variables = local.lambda_env_variables
}
variable “lambda_memory_size” {
type = number
description = “Lambda memory size for lambda”
default = 256
}
وارد حالت تمام صفحه شوید
از حالت تمام صفحه خارج شوید
و سپس مقادیر متفاوتی در فایل های tfvars بسته به محیطی مانند dev.tfvars و prod.tfvars و سپس شما به عنوان مثال در prod.tfvars:
lambda_memory_size = 512
وارد حالت تمام صفحه شوید
از حالت تمام صفحه خارج شوید
این بدان معناست که برای dev، مقدار پیشفرض و زمانی که روی prod مستقر میشود، مقدار به 512 لغو میشود. استفاده از محلی در اینجا نادیده گرفتن آن را سختتر میکند و انعطافپذیری برای تغییرات بیشتر در محیطهای مختلف را کاهش میدهد.
نتیجه گیریدرک تفاوت بین محلی ها و متغیرها در Terraform برای ساخت کد زیرساخت تمیز، قابل استفاده مجدد و مقیاس پذیر بسیار مهم است. در حالی که متغیرها انعطاف پذیری بهتری را ارائه می دهد و امکان سفارشی سازی آسان در محیط های مختلف را فراهم می کند، محلی ها می تواند برای ساده سازی منطق پیچیده در یک ماژول استفاده شود.
با وجود اینکه هم متغیرها و هم محلیها به شما امکان تعریف مقادیر در کد Terraform را میدهند، اما اهداف خاصی را دنبال میکنند، دامنههای مختلف، تغییرپذیری و البته موارد استفاده متفاوتی دارند. به خصوص زمانی که سازمان و زیرساخت ها در حال رشد هستند، مدیریت صحیح آن ها بسیار مهم است تا کد تمیز، قابل نگهداری و قابل استفاده مجدد باشد.
این پست وبلاگ به شما کمک میکند تا چالشهای نوشتن کد تمیز را در مقیاس بالا مرور کنید.
متغیرها:
- تعریف: موجودیت های نام گذاری شده ای که به شما امکان می دهد تنظیمات TF خود را پارامتر کنید
- هدف: ایجاد کد TF انعطاف پذیر، قابل استفاده مجدد در محیط های مختلف
مردم محلی:
- تعریف: مقادیر نامگذاری شده که به شما امکان می دهد مقدار واحد یا ساختار پیچیده را برای استفاده در یک ماژول تعریف کنید
- هدف: ساده سازی عبارات پیچیده و خوانایی بیشتر کد TF
تفاوت های کلیدی:
- محدوده: محلی ها به ماژولی که در آن تعریف می شوند محدود می شوند، در حالی که متغیرها را می توان در سطح ماژول تعریف کرد و بین ماژول ها منتقل می شود.
- تغییرپذیری: محلیها پس از تعریف غیرقابل تغییر هستند، در حالی که متغیرها میتوانند مقدار پیشفرض داشته باشند اما در طول زمان اجرا نیز لغو شوند.
- Use case: برای جلوگیری از کدهای تکراری، از محلی ها در یک ماژول استفاده کنید و هر زمان که انتظار دارید ورودی به ماژول مانند پیکربندی EC2 مختلف در هر محیط، از متغیرها استفاده کنید.
مثال:
بیایید عملکرد AWS Lambda را مثال بزنیم و از آنجایی که در پروژه ما به تعداد زیادی نیاز خواهیم داشت، البته بهترین تمرین این است که منابع مرتبط با Lambda مانند خود Lambda، نقشها و سیاستهای IAM، منبع رویداد، گروه CloudWatch و غیره را در ماژول Terraform قرار دهیم تا قابل استفاده مجدد در سراسر پروژه همانطور که می توانید تصور کنید این ماژول پر از متغیر خواهد بود زیرا ما می خواهیم مقادیر مختلفی را برای هر فراخوانی ماژول Lambda ارسال کنیم. اینها برخی از متغیرهایی هستند که ماژول شما می تواند داشته باشد:
variable "lambda_name" {
type = string
description = "AWS Lambda name"
}
variable "lambda_iam_role_arn" {
type = string
description = "The IAM role ARN for lambda"
}
variable "lambda_memory_size" {
type = number
description = "Lambda memory size for lambda"
default = 128
}
variable "lambda_environment_variables" {
type = map(string)
description = "Map of lambda environment variables"
}
این متغیرها انعطاف پذیری پیکربندی و پارامترسازی را فراهم می کنند. این به شما امکان می دهد تنظیمات هر تابع Lambda را سفارشی کنید. علاوه بر این، تعریف مقادیر به عنوان متغیر، هدف آنها را روشن میکند و کپسولهسازی را ترویج میکند. توجه داشته باشید که اندازه_حافظه_لامبدا معنی مقدار پیش فرض دارد هنگام فراخوانی ماژول Lambda، نیازی به ارائه ورودی برای آن ندارید، مگر اینکه بخواهید مقدار را لغو کنید.
مثال فراخوانی ماژول:
module "my_lambda_function" {
source = "./lambda_module" # Path to the Lambda module
lambda_name = "my_lambda_function" # Name of the Lambda function
lambda_iam_role_arn = aws_iam_role.lambda_exec.arn # ARN of the IAM role for the Lambda
lambda_memory_size = 256 # Memory size for the Lambda function
lambda_environment_variables = {
LOG_LEVEL = "INFO" # Environment variable for logging level
KINESIS_DATA_STREAM = aws_kinesis_stream.data_stream.name # Example Kinesis stream name
}
}
این فراخوانی ماژول قدرت انعطاف پذیری و خوانایی را در صورت استفاده صحیح از متغیرها نشان می دهد. با این حال، همانطور که ممکن است متوجه شوید، بهتر است که متغیرهای env خاص Lambda را با استفاده از محلیها به جای ارسال مستقیم مقادیر ارائه کنید.
module "my_lambda_function" {
source = "./lambda_module" # Path to the Lambda module
lambda_name = "my_lambda_function" # Name of the Lambda function
lambda_iam_role_arn = aws_iam_role.lambda_exec.arn # ARN of the IAM role for the Lambda
lambda_memory_size = 256 # Memory size for the Lambda function
lambda_environment_variables = local.lambda_env_variables
}
استفاده از محلی ها برای انتقال متغیرهای محیطی به یک ماژول به شما امکان مدیریت متمرکز مقادیر را می دهد تا بتوانید به جای جستجوی فراخوانی های ماژول، آنها را در یک مکان به روز کنید.
همچنین این پیکربندی را خواناتر می کند و آنها را قابل استفاده مجدد می کند. به عنوان مثال، اگر محلی مشابه برای لامبداهای مختلف (تماس ماژول) مورد نیاز است، می توانید این را ارسال کنید:
locals {
lambda_env_variables = {
LOG_LEVEL = "INFO"
KINESIS_DATA_STREAM = aws_kinesis_stream.data_stream.name
...
}
}
این مثال بیشتر توضیح می دهد که چرا ما از متغیرها به جای محلی برای استفاده نکردیم LOG_LEVEL و KINESIS_DATA_STREAM. این مقادیر مخصوص لامبدا هستند و باید آنها را پارامتر کنیم زیرا نیازی به انتقال آنها به ماژول های دیگر نداریم. توجه داشته باشید که ما از نوع لیست برای این متغیر استفاده میکنیم زیرا انتظار داریم چندین مقدار را از محلیهایی که ماژول را فراخوانی میکنیم ارسال کنیم.
احتمال زیادی وجود دارد که بسته به اینکه Lambda را در محیط DEV یا PROD استقرار میدهید، مقادیر متفاوتی برای lambda_memory_size بخواهید. این مورد زمانی است که شما متغیر دیگری را به جای محلی به آن ارسال می کنید، حتی اگر آن را مخصوص لامبدا باشد.
این بدان معناست که فراخوانی ماژول ما در عوض به شکل زیر خواهد بود:
module "my_lambda_function" {
source = "./lambda_module" # Path to the Lambda module
lambda_name = "my_lambda_function" # Name of the Lambda function
lambda_iam_role_arn = aws_iam_role.lambda_exec.arn # ARN of the IAM role for the Lambda
lambda_memory_size = var.lambda_memory_size
# Memory size for the Lambda function
lambda_environment_variables = local.lambda_env_variables
}
variable "lambda_memory_size" {
type = number
description = "Lambda memory size for lambda"
default = 256
}
و سپس مقادیر متفاوتی در فایل های tfvars بسته به محیطی مانند dev.tfvars و prod.tfvars و سپس شما به عنوان مثال در prod.tfvars:
lambda_memory_size = 512
این بدان معناست که برای dev، مقدار پیشفرض و زمانی که روی prod مستقر میشود، مقدار به 512 لغو میشود. استفاده از محلی در اینجا نادیده گرفتن آن را سختتر میکند و انعطافپذیری برای تغییرات بیشتر در محیطهای مختلف را کاهش میدهد.
نتیجه گیری
درک تفاوت بین محلی ها و متغیرها در Terraform برای ساخت کد زیرساخت تمیز، قابل استفاده مجدد و مقیاس پذیر بسیار مهم است. در حالی که متغیرها انعطاف پذیری بهتری را ارائه می دهد و امکان سفارشی سازی آسان در محیط های مختلف را فراهم می کند، محلی ها می تواند برای ساده سازی منطق پیچیده در یک ماژول استفاده شود.