[Terraform functions ứng dụng] Ứng dụng merge() để set tags, environment variables cho các AWS resources
1. Tình huống
Giả sử ta có 1 resource Lambda function và sns topic như sau:
resource "aws_lambda_function" "test_lambda" {
filename = "lambda_function_payload.zip"
function_name = "lambda_function_name"
role = aws_iam_role.iam_for_lambda.arn
handler = "index.test"
source_code_hash = data.archive_file.lambda.output_base64sha256
runtime = "python3.10"
environment {
variables = {
sns_toptic_arn = aws_sns_topic.user_updates.arn
}
}
}
resource "aws_sns_topic" "user_updates" {
name = "user-updates-topic"
}
Ta muốn biến environment sns_toptic_arn sẽ luôn được tạo ra, người dùng không cần phải setting, và người dùng vẫn thoải mái setting các environment variables khác theo mong muốn => cách dễ dàng nhất trong trường hợp này là sử dụng merge()
2. Giải quyết
Ta sẽ tạo thêm 1 biến chấp nhận env variables do người dùng nhập như sau:
variable "lambda_env_vars" {
type = map(string)
description = "Additional env vars"
default = {}
}
và sửa lại code provision ra lambda function như sau:
resource "aws_lambda_function" "test_lambda" {
filename = "lambda_function_payload.zip"
function_name = "lambda_function_name"
role = aws_iam_role.iam_for_lambda.arn
handler = "index.test"
source_code_hash = data.archive_file.lambda.output_base64sha256
runtime = "python3.10"
environment {
variables = merge({
sns_toptic_arn = aws_sns_topic.user_updates.arn
}, var.lambda_env_vars)
}
}
resource "aws_sns_topic" "user_updates" {
name = "user-updates-topic"
}
Xem giải thích về merge: https://developer.hashicorp.com/terraform/language/functions/merge