Terraform Lambda heredoc未解析内联函数变量



我的插值变量,包含或不包含${}个字符,将不会解析为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}
}

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

提前感谢

您在这里共享的模板表达式似乎会创建无效的JavaScript语法,因为将Cognito池id直接替换到该位置会产生如下结果:

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

获得此结果的一种更稳健的方法是使用Lambda环境变量,这样Lambda函数中的JavaScript代码可以完全是静态的,但可以从稍后声明函数时传入的环境变量访问Cognito池id:

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
}
}
}

尽管我建议尽可能避免动态代码生成,但您也可以通过以下事实使原始示例成为有效的JavaScript语法:字符串的JSON编码也是字符串的有效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"
}

最新更新