如何在插值字符串中为“ aws_sns_topic_subscription”的“端点”使用变量?

时间:2019-07-02 04:03:12

标签: terraform

我想为lambda函数名称使用一个变量。例如:

variable "lambda_function_name" {
  default = "my-project-lambda-func"
}


resource "aws_lambda_function" "${var.lambda_function_name}" {
  filename         = "${data.archive_file.package-zip.output_path}"
  function_name    = "this_is_a_test"
  handler          = "lambda_function.simple_handler"
  source_code_hash = "${data.archive_file.package-zip.output_base64sha256}"
  runtime          = "python3.7"
  tags             = "${var.tags}"
  timeout          = 300
}

我想使用变量创建SNS订阅:

resource "aws_sns_topic_subscription" "call_lambda_by_sns" {
  topic_arn = "${module.myproject_event_sns.arn}"
  protocol  = "lambda"
  endpoint  = "${aws_lambda_function.${var.lambda_rotate_db_function_name}.arn}"
}

当我运行Terraform validate时会抛出此错误

读取aws_sns_topic_subscription [call_lambda_by_sns]的配置时出错:解析为1:23的错误:预期为“}”,但发现序列“ $”无效

所以我尝试了一种替代方法:

resource "aws_sns_topic_subscription" "call_lambda_by_sns" {
  topic_arn = "${module.myproject_event_sns.arn}"
  protocol  = "lambda"
  endpoint  = "aws_lambda_function.${var.lambda_rotate_db_function_name}.arn"
}

现在端点行导致此错误:

Error: Error parsing address 'aws_lambda_function.${var.lambda_rotate_db_function_name}': invalid resource address "aws_lambda_function.${var.lambda_rotate_db_function_name}"

那么允许我在此处使用变量的语法是什么?

1 个答案:

答案 0 :(得分:1)

可以在解决一些问题后完成

  • 您不能在资源名称中使用插值,因此请更改

    resource "aws_lambda_function" "${var.lambda_function_name}" {
    

    为硬编码的通用值

    resource "aws_lambda_function" "default" {
    
  • 无法在插值中使用插值,因此请更改

    endpoint  = "${aws_lambda_function.${var.lambda_rotate_db_function_name}.arn}"
    

    从上方使用default的通用名称

    endpoint  = "${aws_lambda_function.default.arn}"
    

工作地形

variable "lambda_function_name" {
  default = "my-project-lambda-func"
}

resource "aws_lambda_function" "default" {
  filename         = "${data.archive_file.package-zip.output_path}"
  function_name    = "this_is_a_test"
  handler          = "lambda_function.simple_handler"
  source_code_hash = "${data.archive_file.package-zip.output_base64sha256}"
  runtime          = "python3.7"
  tags             = "${var.tags}"
  timeout          = 300
}

resource "aws_sns_topic_subscription" "call_lambda_by_sns" {
  topic_arn = "${module.myproject_event_sns.arn}"
  protocol  = "lambda"
  endpoint  = "${aws_lambda_function.default.arn}"
}