【问题标题】:Terraform Lambda heredoc not resolving inline function variablesTerraform Lambda heredoc 无法解析内联函数变量
【发布时间】:2021-01-19 23:11:53
【问题描述】:

我的插值变量,不管有没有 ${} 字符,都不会解析为 Terraform 引用的值。我的代码如下所示:

data "archive_file" "lambda_zip_file_int" {
  type        = "zip"
  output_path = "/tmp/lambda_zip_file_int.zip"
  source {
    content  =  <<EOF
    'use strict';
    var AWS = require('aws-sdk');
    exports.handler = (event, context, callback) => {
      ...
      var params = {
        foo: ${aws_cognito_user_pool.my_pool.id}
      }
      ...
        callback(null, event);
      });
    };
EOF
    filename = "foo.js"
  }
}

lambda 函数创建正确,但是

      var params = {
        foo: ${aws_cognito_user_pool.my_pool.id}
      }

作为文字保存在我的函数中,不替换实际值。

提前致谢

【问题讨论】:

  • 嗨。这个问题似乎和以前完全一样。最后一个问题解决了吗?此外,如果您返回一步,并尝试解析一个简单的变量,${var.test} 是否有效?
  • 我在上一个问题中引用了错误的 var,因此重新提交了正确的问题。将尝试您的 var.test 建议并回复您,寻求帮助。

标签: aws-lambda terraform heredoc


【解决方案1】:

您在此处分享的 template expression 似乎会创建无效的 JavaScript 语法,因为将 Cognito 池 id 直接替换到该位置会产生如下内容:

  var params = {
    foo: us-west-2:11111111-1111-1111-1111-111111111111
  }

获得此结果的一种更可靠的方法是使用Lambda environment variables,这样您的 Lambda 函数中的 JavaScript 代码可以是完全静态的,但可以在您声明稍后运行:

  source {
    content  =  <<EOF
    'use strict';
    var AWS = require('aws-sdk');
    exports.handler = (event, context, callback) => {
      ...
      var params = {
        foo: process.environment.COGNITO_POOL_ID
      }
      ...
        callback(null, event);
      });
    };
EOF
    filename = "foo.js"
  }

请注意,以上只是从 NodeJS 程序访问环境变量的常规方式,而不是 Terraform 的特殊方式。

当您使用 aws_lambda_function 声明 Lambda 函数时,您可以传入该环境变量的最终具体值,这样您就可以在以后更改它而无需重新构建代码包:

resource "aws_lambda_function" "example" {
  # ...

  environment {
    variables = {
      COGNITO_POOL_ID = aws_cognito_user_pool.my_pool.id
    }
  }
}

虽然我建议尽可能避免动态代码生成,但您也可以依靠字符串的 JSON 编码也是字符串的有效 JavaScript 编码这一事实,使原始示例成为有效的 JavaScript 语法:

      var params = {
        foo: ${jsonencode(aws_cognito_user_pool.my_pool.id)}
      }

这也应该会产生一个工作结果,但这意味着 Cognito 池 ID 嵌入在您的函数的源代码中,以后对其进行更改将需要重新构建源代码包。

  var params = {
    foo: "us-west-2:11111111-1111-1111-1111-111111111111"
  }

【讨论】:

  • jsonencode 方法不起作用,它最终将文字 jsonencode(... 字符串放入 lambda。环境变量方法确实有效,谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多