gpt4 book ai didi

terraform 根据外部数据有条件地创建资源?

转载 作者:行者123 更新时间:2023-12-02 01:11:52 26 4
gpt4 key购买 nike

作为设置的一部分,我创建了 TLS 证书并将它们存储在 S3 中。创建证书是通过 external 数据源完成的,该数据源运行生成证书的命令。然后,我使用这些输出创建 S3 存储桶对象 resource

这在我第一次运行 terraform apply 时效果很好。但是,如果我更改任何其他(非证书)变量、资源等并重新运行,它会重新运行 external 命令,该命令生成一个新的 key /证书对,将它们上传到 S3,然后中断一切已经有效。

有没有办法有条件地创建资源?我可以使用什么模式来创建仅在证书不存在时才创建的证书?

我确实考虑过在本地存储生成的 key /证书,但这是敏感的 key Material ;我不希望它存储在本地磁盘中(每个环境都有 key )。

key /证书生成和存储:

data "external" "ca" {
program = ["sh","-c","jq '.root|fromjson' | cfssl gencert -initca -"]
#
query = {root = "${ data.template_file.etcd-ca-csr.rendered }"}
# the result will be saved in
# data.external.etcd-ca.result.key
# data.external.etcd-ca.result.csr
# data.external.etcd-ca.result.cert
}

resource "aws_s3_bucket_object" "ca_cert" {
bucket = "${aws_s3_bucket.my_bucket.id}"
key = "ca.pem"
content = "${data.external.ca.result.cert}"
}
resource "aws_s3_bucket_object" "ca_key" {
bucket = "${aws_s3_bucket.my_bucket.id}"
key = "ca-key.pem"
content = "${data.external.ca.result.key}"
}

很高兴看到使用某种形式的条件生成模式或完全不同的生成模式。

最佳答案

此行为的原因是 external是一个数据源,因此 Terraform 期望它是只读的并且没有副作用。它为每个计划重新运行数据源。

为了通过外部脚本执行此操作,需要使用资源供应器来运行脚本将其上传到 S3,因为目前没有 external等同于资源允许有副作用,供应商只有有副作用(也就是说,它们不能产生结果以在配置的其他地方使用。)

不过,另一种方法是使用 Terraform 的 built-in TLS provider ,它允许在 Terraform 本身内创建证书。在这种情况下,您似乎正在尝试创建一个新的 CA 证书和 key ,这可以通过 tls_self_signed_cert 来完成。像这样:

resource "tls_private_key" "ca" {
algorithm = "RSA"
rsa_bits = 2048
}

resource "tls_self_signed_cert" "ca" {
key_algorithm = "RSA"
private_key_pem = "${tls_private_key.ca.private_key_pem}"

# ... subject and validity settings, as appropriate

is_ca_certificate = true

allowed_uses = ["cert_signing"]
}

resource "aws_s3_bucket_object" "ca_cert" {
bucket = "${aws_s3_bucket.my_bucket.id}"
key = "ca.pem"
content = "${resource.tls_self_signed_cert.ca.cert_pem}"
}

resource "aws_s3_bucket_object" "ca_key" {
bucket = "${aws_s3_bucket.my_bucket.id}"
key = "ca-key.pem"
content = "${resource.tls_self_signed_cert.ca.private_key_pem}"
}

生成的私钥将包含在状态中以供将来运行使用,因此确保安全存储状态非常重要。请注意,使用 external 也是如此。数据源,因为数据源结果也存储在状态中。因此,从 secret 存储位置的角度来看,这种方法是等效的。

我在 an article on my website 中写了更多有关使用 Terraform 进行 TLS 证书管理的详细信息.它的范围比您在这里的要求更广泛,但可能会引起一些兴趣。

关于terraform 根据外部数据有条件地创建资源?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44940901/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com