gpt4 book ai didi

aws-lambda - Terraform 中的可选 CloudFront Lambda 函数关联

转载 作者:行者123 更新时间:2023-12-02 17:01:59 29 4
gpt4 key购买 nike

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

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

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

我还尝试过创建两个具有相同名称的资源并设置 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,但在产品中不做任何事情。然而,这似乎效率低下且成本高昂,因为 Lamdba 将在每次请求时被调用,并且希望尽可能避免它。

最佳答案

使用 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,则不再需要上述解决方法。只需引用动态嵌套 block 。

关于aws-lambda - Terraform 中的可选 CloudFront Lambda 函数关联,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53716544/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com