【发布时间】:2021-08-01 13:45:30
【问题描述】:
根据数据源输出条件创建terraform资源。
大家好, 我想在 Terraform 中实现以下要求。
要求:
我想在 s3 存储桶中创建对象(使用 key_name)。
在创建对象之前需要使用数据源检查具有相同键的对象是否已经存在。
如果它已经存在,则不要创建对象。如果没有,请在 s3 存储桶中创建对象。
源代码
variable "key_name" {
default = "test.txt"
}
variable "bucket_name" {
default = "test-bucket-654321"
}
data "aws_s3_bucket_objects" "my_objects" {
bucket = var.bucket_name
}
locals {
key_present = anytrue([
for key in data.aws_s3_bucket_objects.my_objects.keys: key == var.key_name
])
}
resource "aws_s3_bucket_object" "examplebucket_object" {
count = local.key_present ? 0 : 1
key = var.key_name
bucket = var.bucket_name
content = "Test Value"
}
output "my_objects" {
value = data.aws_s3_bucket_objects.my_objects.keys
}
output "key_present" {
value = local.key_present
}
假设,key is 在桶中不存在(例如,它是一个没有对象的新桶)
- 第一次应用时,它会在存储桶中创建对象。
- 在应用 2ns 时间时,它会销毁存储桶中创建的对象。
- 第三次应用时,它会在存储桶中创建对象。
第一次,数据源返回空值。所以它会在存储桶中创建对象。
第二次,数据源返回创建的对象名称。所以密钥已经存在,它会破坏桶中的对象。
同样,它每奇数次创建对象,每偶数次销毁创建的对象。
输出:
ubuntu@test-instance:~$ terraform apply --auto-approve
aws_s3_bucket_object.examplebucket_object[0]: Creating...
aws_s3_bucket_object.examplebucket_object[0]: Creation complete after 0s [id=test.txt]
Apply complete! Resources: 1 added, 0 changed, 0 destroyed.
Outputs:
key_present = false
my_objects = tolist([])
ubuntu@test-instance:~$ terraform apply --auto-approve
aws_s3_bucket_object.examplebucket_object[0]: Refreshing state... [id=test.txt]
aws_s3_bucket_object.examplebucket_object[0]: Destroying... [id=test.txt]
aws_s3_bucket_object.examplebucket_object[0]: Destruction complete after 0s
Apply complete! Resources: 0 added, 0 changed, 1 destroyed.
Outputs:
key_present = true
my_objects = tolist([
"test.txt",
])
谁能给我基于数据源输出创建 terraform 资源的解决方案?
【问题讨论】:
-
你当前的代码有什么问题?
标签: terraform