[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