Terraform读取刚创建的AWS Secrets Manager密钥失败求助
问题解答
1. Terraform是否读取操作先于资源创建?
是的,如果你用data "aws_secretsmanager_secret_version"这类数据源读取密钥,Terraform会在规划(Plan)阶段就尝试获取该数据,而你的Secrets Manager密钥是在应用(Apply)阶段才创建的,规划阶段自然找不到还未存在的密钥版本,因此会报AWSCURRENT not found错误。
2. 当前做法是否正确?
手动生成密码并存入Secrets Manager的思路没问题,但读取方式有误。不要用数据源读取刚创建的密钥,应该直接引用你创建的Secrets Manager资源的输出属性。举个例子:
# 生成随机密码 resource "random_password" "db_password" { length = 16 special = true override_special = "!@#$%^&*()" } # 创建Secrets Manager密钥 resource "aws_secretsmanager_secret" "db_password" { name = "oracle-db-master-password" } # 存入密码到密钥版本 resource "aws_secretsmanager_secret_version" "db_password" { secret_id = aws_secretsmanager_secret.db_password.id secret_string = jsonencode({ master_password = random_password.db_password.result }) } # 直接引用资源属性获取密码,无需数据源 output "db_master_password" { value = jsondecode(aws_secretsmanager_secret_version.db_password.secret_string).master_password sensitive = true }
这种方式会利用Terraform的依赖关系自动确保资源创建顺序,不会出现读取时机错误。
3. 使用模块能否解决执行顺序问题?
不能。模块只是代码组织工具,不会改变Terraform数据源的执行时机。不管代码放在根模块还是子模块,数据源依然会在Plan阶段执行,早于资源创建的Apply阶段。解决问题的核心是更换读取方式,而非调整代码结构。
内容的提问来源于stack exchange,提问作者cptkirkh
相关产品推荐
相关产品推荐

