CloudFront的Terraform lambda_function_association作为模块内的可选列表

时间:2018-09-06 11:04:04

标签: aws-lambda amazon-cloudfront terraform terraform-provider-aws

我们将静态堆栈(CloudFront,S3等)定义为用于不同项目的可配置模块。现在,其中一些需要边缘lambda,我也想使它们可配置(和可选(!))。

我们正在使用以下模块:

module "static" {
..
  lambda_function_associations = [
    {
      event_type = "viewer-request"
      lambda_arn = "${aws_lambda_function.onex_lambda_viewer_req.qualified_arn}"
    },
    {
      event_type = "viewer-response"
      lambda_arn = "${aws_lambda_function.onex_lambda_viewer_res.qualified_arn}"
    },
  ]
 ..
}

,CloudFront的默认缓存行为定义如下:

default_cache_behavior {
    ..
    lambda_function_association = ["${var.lambda_function_associations}"]
    ..
}

以及我们模块中的变量:

variable "lambda_function_associations" {
  type        = "list"
  default     = []
}

应用此堆栈,我得到:

Error: module.static.aws_cloudfront_distribution.web: "default_cache_behavior.0.lambda_function_association.0.event_type": required field is not set



Error: module.static.aws_cloudfront_distribution.web: "default_cache_behavior.0.lambda_function_association.0.lambda_arn": required field is not set

没有办法使它们可选地工作吗?我真的不想在添加边缘lambda时复制整个堆栈。

显然,这样的事情适用于lb_health_check配置块: https://github.com/hashicorp/terraform/issues/17292#issuecomment-393984861

谢谢!

1 个答案:

答案 0 :(得分:1)

我最近偶然发现了同一个问题。这是由terraform limitation引起的,它阻止了我们将动态值传递给模块内的嵌套块。

我发现的唯一解决方法是复制资源声明并根据count变量中的条件创建一个资源(在此处传递静态变量,例如associate_lambda_function)。

您可以在此gitlab snippet

中找到更多详细信息和示例