解决Terraform中”external”数据源失败的问题

68次阅读
没有评论

问题描述

在使用Terraform时遇到了一个问题,他尝试使用外部数据源(”external”)来运行一个命令,但总是遇到失败的情况。他正在尝试绕过一个问题:Terraform在尝试使用由KMS返回的密文之前,不会等待KMS加密操作完成。他已经在Terraform中提出了这个问题的issue,但目前仍需要找到解决方案。

解决方案

请注意以下操作可能因版本差异或其他因素而有所不同,请在操作前做好备份。

最佳解决方案

根据用户的描述,问题出在Bash命令的书写上。”external”数据源运行的Bash命令中,参数传递方式不正确,导致Bash无法正确解析该命令。以下是修复问题的步骤:

  1. 使用Bash的”-c”选项来运行内联脚本,确保Bash正确解析命令。
  2. 考虑将命令写入外部脚本文件中,以提高可读性和维护性。

根据这两点,你可以采用以下方案来解决问题:

  1. 在Terraform配置中使用”-c”选项修复Bash命令的解析问题:
data "external" "encrypt_url" {
    program = ["bash", "-c", "aws --profile $${AWS_PROFILE} kms encrypt --key-id $${KMS_ALIAS} --plaintext $${HOOK_URL} --output json --region $${AWS_REGION}"]
}
  1. 将命令写入外部脚本文件,以提高可读性和维护性。以下是一个示例脚本文件 “encrypt_url.sh”,你可以将命令写入其中:
#!/usr/bin/env bash
aws --profile ${AWS_PROFILE} \
    kms encrypt --key-id ${KMS_ALIAS} \
                --plaintext ${HOOK_URL} \
                --output json \
                --region ${AWS_REGION}

然后在Terraform配置中引用这个外部脚本文件:

data "external" "encrypt_url" {
    program = ["bash", "${path.module}/encrypt_url.sh"]
}

通过上述步骤,你可以修复Bash命令的解析问题,确保Terraform正确运行外部数据源。这样你就能够在Terraform中正确使用KMS返回的密文了。

其他解决方案

另外一种可能的解决方案是通过手动调整命令的传递方式,使其能够在”external”数据源中正确运行。但鉴于最佳解决方案已经提供了清晰的方法来解决问题,其他解决方案可能会更加复杂或不具备实际优势。

希望这些解决方案能够帮助你解决在Terraform中使用”external”数据源遇到的问题。如果你在实施过程中遇到了其他问题,请随时提问。

正文完