我需要帮助,了解在 https://www.terraform.io/docs/providers/aws/r/rds_cluster.html 中存储 master_password 的更好方法。目前我在提交到 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"
}
这是我的解决方案。
(无论如何,你不能隐藏*.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 命令。
您最好使用 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 Provider 版本 5.8.0 起,有一个名为
manage_master_user_password
的新属性,可用作 secret
的替代属性。我改用了较新的方法,因为我发现在配置基础设施后,根密码与 Secrets Manager 中存储的秘密不一致,即使它在提供程序的 4.0.0 版本中工作得很好(我升级了提供者)。使用新方法,我确认在创建资源并访问 RDS 控制台后,选中了“在 AWS Secrets Manager 中管理主凭证”选项,并在 Secrets Manager 中自动创建了相应的密钥,甚至无需预置密钥管理器资源直接。还有一个 master_user_secret
块来指定秘密选项。