如何使用 Terraform 向现有 AWS S3 存储桶添加生命周期规则

pro*_*wla 6 amazon-s3 amazon-web-services terraform

我有一个现有的 S3 存储桶,我希望向其中添加“文件夹”和生命周期规则。

(我说“文件夹”是因为这是它们在客户端的表示方式,因为它们是通过 Storage Gateway 访问的。)

我可以创建文件夹,例如用于保存季度备份,例如:

resource "aws_s3_bucket_object" "quarterly" {
    bucket  = "${var.bucket_id}"
    acl     = "private"
    key     = "quarterly"
    source  = "/dev/null"
}
Run Code Online (Sandbox Code Playgroud)

但是如果我尝试然后添加生命周期规则,如下

resource "aws_s3_bucket" "quarterly" {
    bucket  = "${var.bucket_id}"
    acl     = "private"

    lifecycle_rule {
        id      = "quarterly_retention"
        prefix  = "quarterly/"
        enabled = true
        tags {
            "rule"  = "quarterly"
        }

        expiration {
            days = 92
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

当我执行 terraform apply 时出现错误。

* aws_s3_bucket.quarterly: Error creating S3 bucket: BucketAlreadyOwnedByYou: Your previous request to create the named bucket succeeded and you already own it.
    status code: 409, request id: 702396A7D2FA28BA, host id: IJDA+vszRBYl4zmvW56dSnC2va2qpQXlfgeEL7X1QQHHv8eEaYKvSUCL0ZIj/VsdvQ2hkBLGjAY=
Run Code Online (Sandbox Code Playgroud)

我想先创建存储桶,然后再添加文件夹和生命周期规则,而不是在创建时嵌入生命周期规则。

我错过了什么,我弄错了吗?

谢谢你的帮助!

bod*_*git 2

首先创建存储桶并逐步更新配置应该可以正常工作,最终结果是,如果您通过其他方式删除存储桶,Terraform 将使用所有规则重新创建它。

看起来您丢失了terraform.tfstate文件,因此 Terraform 不知道它已经创建了您的存储桶,或者您首先在 Terraform 外部创建了存储桶,因此它尝试创建它但失败了。Terraform 需要“拥有”存储桶才能更新其配置,即生命周期规则。

您应该能够使用类似的内容将现有存储桶导入到状态文件中

terraform import aws_s3_bucket.quarterly <your bucket ID>
Run Code Online (Sandbox Code Playgroud)

请参阅https://www.terraform.io/docs/providers/aws/r/s3_bucket.html的底部

运行 Terraform 后应该会显示它刚刚更新了生命周期规则。