【问题标题】:terragrunt cannot access module outputsterragrunt 无法访问模块输出
【发布时间】:2020-11-23 22:48:59
【问题描述】:

我正在与 Terragrunt 苦苦挣扎(我还是个新手)。 即使使用纯 Terragrunt 存储库示例,我也可以描述我的问题:

看这里(https://github.com/gruntwork-io/terragrunt-infrastructure-live-example/tree/master/prod/us-east-1/prod/webserver-cluster),我们可以看到 terragrunt.hcl 导入了一个模块 asg-elb-service 从特定 URL 获取(也是 terragrunt 示例)

现在我的观点是一切都很好,直到模块解决了我的所有需求。但是使用提到的示例,假设我想在这个模块之上添加一些东西(例如 ALB 的侦听器规则或任何东西) - 然后我想依赖 模块输出 并且我们可以检查“使用" 模块公开了这些:输出 (https://github.com/gruntwork-io/terragrunt-infrastructure-modules-example/blob/master/asg-elb-service/outputs.tf)

但是,即使我在我的结构中添加 tf 文件 - 继续我的示例,它会是这样的:

我只是无法“插值”并从模块访问这些输出:(

【问题讨论】:

    标签: terraform terragrunt


    【解决方案1】:

    terragrunt一个瘦包装器,它只是为配置 提供了一些额外的工具。 terragrunt 用于使多个terraform 模块的管理更容易,它关心远程状态等。但它并没有通过在其之上添加一些功能来扩展 terraform 模块。

    回到您的示例,常见的方法是创建一个新的terraform 模块,可能在现有模块之上并在那里添加缺少的功能。您应该将terraform 模块视为在某个抽象级别上执行特定工作的函数。话虽如此,创建使用另一个模块的模块是完全有效的。考虑以下示例:您需要预置一个可以在触发 AWS CloudWatch 警报时发送 Slack 通知的基础设施。为了简化一点,让我们想象一下,Alarm 已经创建好了。缺少的部分是一个将发送通知的 Lambda 函数,将触发 Lambda 函数的 SNS 主题。

    这是可以使用terraform 模块创建的东西,但在底层它很可能依赖于另一个terraform 模块(一个提供Lambda,另一个提供SNS 主题)。这些“内部”模块处于另一个抽象级别,您仍然可以在其他情况下单独重用它们。伪代码可能如下所示:

    module "sns_topic" {
      source = "git::https://github.com/..."
    
      name  = "trigger_lambda_to_send_notification_to_slack"
    }
    
    module "labmda_function" {
      source = "git::https://github.com/..."
      
      name   = "SendMessageToSlack"
      ...
    }
    
    # Invoke Lambda by SNS
    resource "aws_sns_topic_subscription" "sns_subscriptions" {
      endpoint      = module.labmda_function.lambda_endpoint # this is how you reference module output
      protocol      = "lambda"
      topic_arn     = module.sns_topic.sns_topic_arn
    }
    

    然后,您可以在terragrunt 中简单地使用这个模块。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-07-22
      • 1970-01-01
      • 2013-05-18
      • 1970-01-01
      相关资源
      最近更新 更多