【问题标题】:Optional CloudFront Lambda function association in TerraformTerraform 中的可选 CloudFront Lambda 函数关联
【发布时间】:2019-05-11 23:53:02
【问题描述】:

我们在 CloudFront 和 S3 上托管我们的网络应用程序。此基础架构在 Terraform 模块中进行配置。我们使用相同的模块(由 Terragrunt 管理)将我们的 web 应用程序部署到我们的暂存和生产环境中。

显然,我们不希望公开访问我们的暂存环境。因此,我们创建了一个 Lambda 函数来启用基本 HTTP 身份验证,并使用 aws_cloudfront_distribution 资源中的 lambda_function_association 来启用它。

问题是我们不希望 Lambda 也运行在我们的 prod 环境中。我无法有条件地设置资源的关联。

我也尝试过创建两个具有相同名称的资源并设置count 属性,以便仅存在这些资源。

例如

# Basic Auth Guard
resource "aws_cloudfront_distribution" "default" {
  count = "${var.behind_auth_guard}"
  ...
}

# No Basic Auth Guard
resource "aws_cloudfront_distribution" "default" {
  count = "${var.behind_auth_guard ? 0 : 1}"
}

但是,当我尝试部署代码时,我得到了aws_cloudfront_distribution.default: resource repeated multiple times

有什么方法可以实现我想要的吗?

我考虑过的另一个选项是在两个版本上都设置 Lambda,但让它在 prod 中不做任何事情。但是,这似乎效率低下且成本高昂,因为每次请求都会调用 lamdba,并且希望尽可能避免它。

【问题讨论】:

    标签: aws-lambda amazon-cloudfront terraform


    【解决方案1】:

    使用 Terraform v0.12.0 这将非常容易解决,因为它支持Dynamic Nested Blocks。不幸的是,该版本不会在 2019 年第一季度之前发布。

    与此同时,您可以接受您自己提出的建议,只需稍作改动即可。您只需稍作改动,因为不支持重复名称。

    # Basic Auth Guard
    resource "aws_cloudfront_distribution" "cf_with_guard" {
      count = "${var.behind_auth_guard}"
      ...
    }
    
    # No Basic Auth Guard
    resource "aws_cloudfront_distribution" "cf_no_guard" {
      count = "${var.behind_auth_guard ? 0 : 1}"
    }
    

    如果您现在想使用此资源的任何输出,您必须使用一个小的hack。例如,如果要输出分布的id

    output "cf_id" {
      value = "${var.behind_auth_guard ? join("", aws_cloudfront_distribution.cf_with_guard.*.id) : join("", aws_cloudfront_distribution.cf_no_guard.*.id)}"
    }
    

    join() 是必需的,因为您无法引用不存在的资源。甚至在 if 语句中也没有。 join() 通过引用所有资源的列表来解决此问题,如果资源的 count 为 0,则该列表为空。

    供将来参考的注意事项: 如果 v0.12.0 已发布,则不再需要上述解决方法。只需参考动态嵌套块。

    【讨论】:

      【解决方案2】:

      正如 Joris 在上面指出的那样,动态嵌套块是可行的方法。这对我有用:

      dynamic "lambda_function_association" {
        for_each = var.ENV == "prod" ? [] : [0]
        content {
          event_type   = "viewer-request"
          lambda_arn   = "${aws_lambda_function.my_auth_lambda.qualified_arn}"
        }
      }
      

      这将为除生产环境之外的所有环境启用 lambda 函数。

      【讨论】:

        猜你喜欢
        • 2018-09-18
        • 2021-06-11
        • 2018-07-29
        • 2021-01-19
        • 2022-10-20
        • 2019-02-11
        • 1970-01-01
        • 2020-07-04
        • 2021-10-19
        相关资源
        最近更新 更多