如何解决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}
}
预先感谢
解决方法
您在此处共享的template expression似乎会创建无效的JavaScript语法,因为直接将Cognito池ID替换到该位置会产生以下内容:
var params = {
foo: us-west-2:11111111-1111-1111-1111-111111111111
}
获得此结果的更可靠的方法是使用Lambda environment variables,以便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
}
}
}
尽管我建议尽可能避免动态代码生成,但您也可以通过依赖字符串的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"
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。