问题描述
在使用Terraform时遇到了一个问题,他尝试使用外部数据源(”external”)来运行一个命令,但总是遇到失败的情况。他正在尝试绕过一个问题:Terraform在尝试使用由KMS返回的密文之前,不会等待KMS加密操作完成。他已经在Terraform中提出了这个问题的issue,但目前仍需要找到解决方案。
解决方案
请注意以下操作可能因版本差异或其他因素而有所不同,请在操作前做好备份。
最佳解决方案
根据用户的描述,问题出在Bash命令的书写上。”external”数据源运行的Bash命令中,参数传递方式不正确,导致Bash无法正确解析该命令。以下是修复问题的步骤:
- 使用Bash的”-c”选项来运行内联脚本,确保Bash正确解析命令。
- 考虑将命令写入外部脚本文件中,以提高可读性和维护性。
根据这两点,你可以采用以下方案来解决问题:
- 在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}"]
}
- 将命令写入外部脚本文件,以提高可读性和维护性。以下是一个示例脚本文件 “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”数据源遇到的问题。如果你在实施过程中遇到了其他问题,请随时提问。
正文完