Terraform:如何将输出从一种资源传递到另一种资源?

时间:2020-09-01 07:27:03

标签: amazon-web-services terraform amazon-ecs aws-secrets-manager aws-aurora-serverless

我正在使用Aurora无服务器Mysql和ECS,并尝试在名为rds.tf的文件中使用由AWS秘密管理器生成的秘密,并希望在名为ecs.tf的文件中使用它的另一资源

resource "random_password" "db_instance_aurora_password" {
  length  = 40
  special = false
  keepers = {
    database_id = aws_secretsmanager_secret.db_instance_aurora_master_password.id
  }

上面是rds.tf,它可以工作并生成随机密码。在第二个文件ecs.tf中,我想使用

resource "aws_ecs_task_definition" "task" {
  family = var.service_name
  container_definitions = templatefile("${path.module}/templates/task_definition.tpl", {
    DB_USERNAME  = var.db_username
    DB_PASSWORD  = random_password.db_instance_aurora_password.result
  })
}

如何导出db_password的输出并在其他资源(ecs.tf)中使用它?

output "aurora_rds_cluster.master_password" {
  description = "The master password"
   value    =  random_password.db_instance_aurora_password.result }

1 个答案:

答案 0 :(得分:1)

  1. 如果所有Terraform文件都在一个目录中,则可以在为数据库处理时引用random_password资源。然后,您可能不需要输出它。

  2. 如果分开,则可以使用terraform modules来实现所需的功能。在ECS terraform中,您可以引用RDS模块,并可以访问其输出:

module "rds" {
  source = "path/to/folder/with/rds/terraform"
}

resource "aws_ecs_task_definition" "task" {
  family = var.service_name
  container_definitions = templatefile("${path.module}/templates/task_definition.tpl", {
    DB_USERNAME  = var.db_username
    DB_PASSWORD  = module.rds.aurora_rds_cluster.master_password
  })
}
  1. 将密码存储在terraform的输出中会将其存储为纯文本。即使您使用加密的S3存储桶,仍然至少可以通过terraform来访问密码。共享密码的另一个选项可以是例如使用AWS Parameter Store。创建密码的模块可以将其存储在Param Store中,而另一个需要密码的模块可以读取它。

P.S。您可能想在密码输出中添加sensitive = true以便从日志中消除密码值。