【问题标题】:what's better way to store master_username and master_password in terraform rds configuration?在 terraform rds 配置中存储 master_username 和 master_password 的更好方法是什么?
【发布时间】:2018-09-15 23:04:40
【问题描述】:

我需要有关将 master_password 存储在 https://www.terraform.io/docs/providers/aws/r/rds_cluster.html 中的更好方法的帮助。目前我在提交到 github 之前用 XXX 屏蔽。你能建议一个更好的方法来存储这个吗?谢谢

resource "aws_rds_cluster" "default" {
  cluster_identifier      = "aurora-cluster-demo"
  engine                  = "aurora-mysql"
  availability_zones      = ["us-west-2a", "us-west-2b", "us-west-2c"]
  database_name           = "mydb"
  master_username         = "foo"
  master_password         = "bar"
  backup_retention_period = 5
  preferred_backup_window = "07:00-09:00"
}

【问题讨论】:

  • 一种选择是使用私有存储库。您将以明文形式存储密码,这不太理想。另一种选择是在服务器上自动生成此文件,它会从显然不在 github 中的本地文件中获取密码)
  • 通常你会通过 CI 流程部署这些东西。这通常允许您存储秘密并将它们传递到您的部署过程中,而无需向最终用户透露内容是什么。否则,如果不可能,请利用变量并通过环境变量传入。
  • 这是新awssecrets manager管理rds密码的最佳示例,但我认为该服务目前在terraform中不可用

标签: amazon-rds terraform


【解决方案1】:

这是我的解决方案。

(无论如何,*.tfstate 文件的密码不能隐藏,您应该将 tfstate 文件加密保存在 s3 中)

terraform plan --var-file master_username=xxxx --var-file master_password=xxxx 

所以你的 tf 文件可以将它们定义为变量。

variable "master_username" {}
variable "master_password" {}

resource "aws_rds_cluster" "default" {
  cluster_identifier      = "aurora-cluster-demo"
  engine                  = "aurora-mysql"
  availability_zones      = ["us-west-2a", "us-west-2b", "us-west-2c"]
  database_name           = "mydb"
  master_username         = "${var.master_username}"
  master_password         = "${var.master_password}"
  backup_retention_period = 5
  preferred_backup_window = "07:00-09:00"
}

当使用 CI/CD 管道运行 terraform plan/apply 时,我曾经将密码放入 s3(加密)或 SSM(现在您可以放入 aws secrets manager)。因此,编写一个包装脚本首先获取这些键/值并提供给 terraform 命令。

【讨论】:

    【解决方案2】:

    您最好使用 AWS Secrets Manager,并且根本不在状态文件中存储任何敏感数据(即使您的状态文件可能已加密,但最好避免此类实施)。

    在这里,我创建了一个 secrets.tf,它负责生成随机密码并将其存储在 AWS Secrets Manager 中。

    resource "random_password" "master"{
      length           = 16
      special          = true
      override_special = "_!%^"
    }
    
    resource "aws_secretsmanager_secret" "password" {
      name = "${var.environment}-${var.service_name}-primary-cluster-password"
    }
    
    resource "aws_secretsmanager_secret_version" "password" {
      secret_id = aws_secretsmanager_secret.password.id
      secret_string = random_password.master.result
    }
    

    现在要在 tf 申请期间获取数据,我使用数据提供者(这会在申请期间从 AWS 动态获取数据):

    data "aws_secretsmanager_secret" "password" {
      name = "${var.environment}-${var.service_name}-primary-cluster-password"
    
    }
    
    data "aws_secretsmanager_secret_version" "password" {
      secret_id = data.aws_secretsmanager_secret.password.id
    }
     
    

    然后我在我的 Aurora 集群中引用它们如下:

    resource "aws_rds_global_cluster" "main" {
      global_cluster_identifier = "${var.environment}-${var.service_name}-global-cluster"
      engine                    = "aurora"
      engine_version            = "5.6.mysql_aurora.1.22.2"
      database_name             = "${var.environment}-${var.service_name}-global-cluster"
    }
    
    resource "aws_rds_cluster" "primary" {
      provider                  = aws
      engine                    = aws_rds_global_cluster.main.engine
      engine_version            = aws_rds_global_cluster.main.engine_version
      cluster_identifier        = "${var.environment}-${var.service_name}-primary-cluster"
      master_username           = "dbadmin"
      master_password           = data.aws_secretsmanager_secret_version.password
      database_name             = "example_db"
      global_cluster_identifier = aws_rds_global_cluster.main.id
      db_subnet_group_name      = "default"
    }
    

    希望这会有所帮助。

    【讨论】:

    • aws_secretsmanager_secret_version 数据源将秘密值以明文形式存储在 Terraform 状态文件中,但至少不在 Terraform 脚本中。
    • 感谢约翰指出这一点,你是对的!
    猜你喜欢
    • 2011-04-16
    • 2011-06-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-29
    • 2018-07-04
    • 2017-02-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多