如何在Terraform中声明N个(数据,资源)对?

时间:2019-08-01 16:57:33

标签: aws-lambda terraform terraform-provider-aws aws-lambda-edge

我想将几十个AWS Lambda函数添加到我的Terraform项目中。每个人都有相同的基本形状:

data "archive_file" "foo" {
  type = "zip"
  output_path = "./build/foo.zip"

  source {
    content  = "build/foo.js"
    filename = "index.js"
  }
}


resource "aws_lambda_function" "foo" {
  description = "Description of Foo"
  filename = "./build/foo.zip"
  function_name = "foo"
  handler = "index.handler"
  memory_size = "128"
  publish = true
  role = "${aws_iam_role.Lambda.arn}"
  runtime = "nodejs10.x"
  source_code_hash = "${sha256(filebase64("./build/foo.zip"))}"
  timeout = "3"

  vpc_config {
    security_group_ids = []
    subnet_ids = []
  }
}

除了function_nameoutput_pathfilenamesource_code_hash以外,它们都是相同的。

如何减少重复?

我尝试过的东西

一个模块

我创建了一个modules/lambda-function/{main,variables}.tf,然后使用来调用它

module "lambda-function" {
  source = "./modules/lambda-function"
  name   = "foo"
}

module "lambda-function" {
  source = "./modules/lambda-function"
  name   = "bar"
}

但是当我运行terraform plan时,我得到了

  

已经在aws-lambda.tf:1,1-16定义了名为“ lambda”的模块调用。模块调用在模块内必须具有唯一的名称。

一个列表

我创建了一个Lambda定义对象列表,并尝试对其进行迭代:

# lambda-functions/variables.tf
variable "lambdas" {
  type = list(object({
    name        = string
    description = string
  }))

  description = "The AWS lambda functions as {name,description} objects."
}

# lambda-functions/main.tf
data "archive_file" "this" {
  count = "${length(var.lambdas)}"
  type = "zip"
  output_path = "./build/${var.lambdas[count.index].name}.zip"

  source {
    content  = "build/${var.name}.js"
    filename = "index.js"
  }
}

但是"./build/${var.lambdas[count.index].name}.zip"不是有效的Terraform语法。

0 个答案:

没有答案