为什么我不能在 aws_lambda_alias routing_config 中使用 aws_lambda_function 数据源?
Why can I not use aws_lambda_function datasource inside aws_lambda_alias routing_config?
我正在试验 blue/green 使用 terraform 和 lambda 别名的 lambda 部署设置。
我正在尝试通过使用 aws_lambda_function 数据源并使用 routing_config => additional_version_weights 中的值来自动检索以前部署的 lambda 版本。这将允许我在先前部署的版本和刚刚部署的版本之间设置流量拆分。
但是,我 运行 犯了 2 个我不太明白的错误。
第一个错误是当我尝试将数据源与常规变量结合使用时。在这种情况下,terraform 抱怨无法解析该值。
如果我硬编码值 terraform 将尝试 运行 更新,但是,它将失败,因为它试图将路由配置中的版本设置为空值,这会导致验证错误。如果我改为输出值,我可以看到检索到正确的版本。
示例代码和重现步骤可在下面的 link 中找到。
https://github.com/jaknor/terraform-lambda-data-source-issue
有谁能解释为什么这不起作用?
请注意,虽然我知道还有其他方法可以实现我的目标,但目前我只对了解这些特定错误感兴趣。
在 Terraform v0.11 及之前的版本中,=
符号左侧不支持引入参数或对象键的插值序列。
要生成带有动态键的地图,您必须改为使用 map
函数:
additional_version_weights = "${map(data.aws_lambda_function.existing_lambda_func.version, var.lambda_previous_version_percentage)}"
在 Terraform v0.12(我写这篇文章时处于测试阶段)中,解析器现在能够区分参数(在配置中必须是常量)和映射键(可以是任意表达式)等等下面的语法是可取的,尽管上面的语法仍然适用于向后兼容。
additional_version_weights = {
(data.aws_lambda_function.existing_lambda_func.version) = var.lambda_previous_version_percentage
}
关键表达式周围的附加括号很重要,它告诉 Terraform 应该将其理解为普通表达式而不是文字名称。
我正在试验 blue/green 使用 terraform 和 lambda 别名的 lambda 部署设置。
我正在尝试通过使用 aws_lambda_function 数据源并使用 routing_config => additional_version_weights 中的值来自动检索以前部署的 lambda 版本。这将允许我在先前部署的版本和刚刚部署的版本之间设置流量拆分。
但是,我 运行 犯了 2 个我不太明白的错误。
第一个错误是当我尝试将数据源与常规变量结合使用时。在这种情况下,terraform 抱怨无法解析该值。
如果我硬编码值 terraform 将尝试 运行 更新,但是,它将失败,因为它试图将路由配置中的版本设置为空值,这会导致验证错误。如果我改为输出值,我可以看到检索到正确的版本。
示例代码和重现步骤可在下面的 link 中找到。
https://github.com/jaknor/terraform-lambda-data-source-issue
有谁能解释为什么这不起作用?
请注意,虽然我知道还有其他方法可以实现我的目标,但目前我只对了解这些特定错误感兴趣。
在 Terraform v0.11 及之前的版本中,=
符号左侧不支持引入参数或对象键的插值序列。
要生成带有动态键的地图,您必须改为使用 map
函数:
additional_version_weights = "${map(data.aws_lambda_function.existing_lambda_func.version, var.lambda_previous_version_percentage)}"
在 Terraform v0.12(我写这篇文章时处于测试阶段)中,解析器现在能够区分参数(在配置中必须是常量)和映射键(可以是任意表达式)等等下面的语法是可取的,尽管上面的语法仍然适用于向后兼容。
additional_version_weights = {
(data.aws_lambda_function.existing_lambda_func.version) = var.lambda_previous_version_percentage
}
关键表达式周围的附加括号很重要,它告诉 Terraform 应该将其理解为普通表达式而不是文字名称。