Sud*_*gam 25 amazon-web-services terraform secret-manager
我正在尝试使用 AWS 秘密管理器来声明 RDS 管理员凭据。
variable "RdsAminCred" {
default = {
username = "dbadmin"
password = "dbadmin#02avia"
}
type = map(string)
}
resource "aws_secretsmanager_secret" "RdsAminCred" {
name = "RdsAminCred"
}
resource "aws_secretsmanager_secret_version" "RdsAminCred" {
secret_id = aws_secretsmanager_secret.RdsAminCred.id
secret_string = jsonencode(var.RdsAminCred)
}
Run Code Online (Sandbox Code Playgroud)
resource "aws_db_instance" "default" {
identifier = "testdb"
allocated_storage = 20
storage_type = "gp2"
engine = "mysql"
engine_version = "5.7"
instance_class = "db.t2.medium"
name = "mydb"
username = "dbadmin"
password = "dbadmin#01avia"
Run Code Online (Sandbox Code Playgroud)
任何帮助表示赞赏..
小智 36
我将有一个 TF 配置来设置您的密钥并将其存储在 AWS Secrets Manager 中,如下所示。
resource "random_password" "master"{
length = 16
special = true
override_special = "_!%^"
}
resource "aws_secretsmanager_secret" "password" {
name = "test-db-password"
}
resource "aws_secretsmanager_secret_version" "password" {
secret_id = aws_secretsmanager_secret.password.id
secret_string = random_password.master.result
}
Run Code Online (Sandbox Code Playgroud)
然后,在数据库的单独 TF 配置中,您可以使用 AWS Secrets Manager 中的密钥。
data "aws_secretsmanager_secret" "password" {
name = "test-db-password"
}
data "aws_secretsmanager_secret_version" "password" {
secret_id = data.aws_secretsmanager_secret.password
}
resource "aws_db_instance" "default" {
identifier = "testdb"
allocated_storage = 20
storage_type = "gp2"
engine = "mysql"
engine_version = "5.7"
instance_class = "db.t2.medium"
name = "mydb"
username = "dbadmin"
password = data.aws_secretsmanager_secret_version.password
Run Code Online (Sandbox Code Playgroud)
在上面的评论中,Asri Badlah 建议在控制台中手动输入密码。我想你可以做到。然而,这种方法确实开始偏离 IaC 的基本原则——将所有内容置于源代码控制中。当然,您不想将密码、私钥等检查到源代码管理中。但在这里,你可以看到我们没有这样做。我们用一个配置填充一个秘密,并用另一个配置使用它。这确保了代码可以签入源代码管理,但密码却不能。
从状态来看,密码确实会以TF状态存储和破译。但如果您使用正确的状态管理,这应该不是问题。理想情况下,您希望使用加密且访问受限的远程状态。
最后一点,我不会像 Evan Closson 建议的那样只使用 random_password。这种方法意味着您的数据库密码 100% 由 Terraform 管理。通过使用 Secrets Manager,您的密码由服务管理,这意味着您可以执行其他操作,例如轮换密码(未显示)和检索密码,而无需依赖 Terraform(例如 terraform 输出或破解打开状态文件) 。
小智 20
我建议改用该random_password资源。然后您可以在集群配置和机密管理器中引用它。
例子:
resource "random_password" "master_password" {
length = 16
special = false
}
resource "aws_rds_cluster" "default" {
cluster_identifier = "my-cluster"
master_username = "admin"
master_password = random_password.default_master_password.result
# other configurations
# .
# .
# .
}
resource "aws_secretsmanager_secret" "rds_credentials" {
name = "credentials"
}
resource "aws_secretsmanager_secret_version" "rds_credentials" {
secret_id = aws_secretsmanager_secret.rds_credentials.id
secret_string = <<EOF
{
"username": "${aws_rds_cluster.default.master_username}",
"password": "${random_password.master_password.result}",
"engine": "mysql",
"host": "${aws_rds_cluster.default.endpoint}",
"port": ${aws_rds_cluster.default.port},
"dbClusterIdentifier": "${aws_rds_cluster.default.cluster_identifier}"
}
EOF
}
Run Code Online (Sandbox Code Playgroud)
在 Terraform 代码中,您可以使用 aws_secretsmanager_secret_version 数据源来读取此密钥:
data "aws_secretsmanager_secret_version" "creds" {
# write your secret name here
secret_id = "your_secret"
}
Run Code Online (Sandbox Code Playgroud)
使用 jsondecode 从 JSON 解析秘密:
locals {
your_secret = jsondecode(
data.aws_secretsmanager_secret_version.creds.secret_string
)
}
Run Code Online (Sandbox Code Playgroud)
现在将秘密传递给 RDS:
resource "aws_db_instance" "example" {
engine = "engine"
engine_version = "version"
instance_class = "instance"
name = "example"
# Set the secrets from AWS Secrets Manager
username = local.your_secret.username
password = local.your_secret.password
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
39496 次 |
| 最近记录: |