Aws lambda 为什么我不能在aws_lambda_alias routing_配置中使用aws_lambda_函数数据源?

Aws lambda 为什么我不能在aws_lambda_alias routing_配置中使用aws_lambda_函数数据源?,aws-lambda,terraform,terraform-provider-aws,Aws Lambda,Terraform,Terraform Provider Aws,我正在尝试使用terraform和lambda别名为lambda设置蓝色/绿色部署 我试图通过使用aws_lambda_函数数据源并使用routing_config=>其他_version_权重中的值来自动检索以前部署的lambda版本。这将允许我在先前部署的版本和刚刚部署的版本之间设置流量分割 然而,我遇到了两个我不太理解的错误 第一个错误是当我尝试将数据源与正则变量结合使用时。在这种情况下,terraform抱怨无法解析该值 如果我硬编码值terraform将尝试运行更新,但是,它将失败,因

我正在尝试使用terraform和lambda别名为lambda设置蓝色/绿色部署

我试图通过使用aws_lambda_函数数据源并使用routing_config=>其他_version_权重中的值来自动检索以前部署的lambda版本。这将允许我在先前部署的版本和刚刚部署的版本之间设置流量分割

然而,我遇到了两个我不太理解的错误

第一个错误是当我尝试将数据源与正则变量结合使用时。在这种情况下,terraform抱怨无法解析该值

如果我硬编码值terraform将尝试运行更新,但是,它将失败,因为它试图将路由配置中的版本设置为空值,这将导致验证错误。如果我改为输出值,我可以看到检索到了正确的版本

复制的示例代码和步骤可以在下面的链接中找到

有人能解释为什么这不起作用吗


请注意,虽然我知道还有其他方法可以实现我的目标,但目前我只对理解这些特定错误感兴趣。

在Terraform v0.11和更早版本中,引入参数或对象键的
=
符号左侧不支持插值序列

要生成带有动态关键点的地图,必须改用
map
功能:

  additional_version_weights = "${map(data.aws_lambda_function.existing_lambda_func.version, var.lambda_previous_version_percentage)}"

在Terraform v0.12中(我写这篇文章时它是beta版),解析器现在能够区分参数(配置中必须是常量)和映射键(可以是任意表达式),因此下面的语法更可取,尽管上面的语法仍然适用于向后兼容性

  additional_version_weights = {
    (data.aws_lambda_function.existing_lambda_func.version) = var.lambda_previous_version_percentage
  }

键表达式周围的附加括号对于告诉Terraform应该将其理解为正常表达式而不是文字名称非常重要。

在Terraform v0.11及之前版本中,引入参数或对象键的
=
符号左侧不支持插值序列

要生成带有动态关键点的地图,必须改用
map
功能:

  additional_version_weights = "${map(data.aws_lambda_function.existing_lambda_func.version, var.lambda_previous_version_percentage)}"

在Terraform v0.12中(我写这篇文章时它是beta版),解析器现在能够区分参数(配置中必须是常量)和映射键(可以是任意表达式),因此下面的语法更可取,尽管上面的语法仍然适用于向后兼容性

  additional_version_weights = {
    (data.aws_lambda_function.existing_lambda_func.version) = var.lambda_previous_version_percentage
  }

关键表达式周围的附加括号对于告诉Terraform应该将其理解为普通表达式而不是文字名称非常重要。

感谢您的精彩解释,Martin!这很有道理,而且您建议的解决方案非常有效。对于任何想要查看工作示例的人,我已经更新了我的存储库,以包含一个工作示例。感谢Martin的精彩解释!这很有道理,而且您建议的解决方案非常有效。对于任何想要查看工作示例的人,我已经更新了我的存储库,以包含一个工作示例。