微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Terraform Lambda heredoc无法解析内联函数变量

如何解决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 举报,一经查实,本站将立刻删除。