Назад | Перейти на главную страницу

Как добавить правило жизненного цикла к существующей корзине AWS S3 с Terraform

У меня есть корзина S3, и я хочу добавить к ней «папки» и lifecycle_rules.

(Я говорю «папки», потому что именно так они представлены на стороне клиента, поскольку доступ к ним осуществляется через шлюз хранилища.)

Я могу создавать папки, например, для ежеквартального резервного копирования, например:

resource "aws_s3_bucket_object" "quarterly" {
    bucket  = "${var.bucket_id}"
    acl     = "private"
    key     = "quarterly"
    source  = "/dev/null"
}

Но если я попытаюсь добавить правило жизненного цикла, как показано ниже

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
        }
    }
}

Я получаю сообщение об ошибке, когда применяю терраформ.

* 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=

Я хочу сначала создать корзину, а затем добавить папки и правила жизненного цикла, а не внедрять правила жизненного цикла при создании.

Я что-то упустил, я ошибся?

Спасибо за вашу помощь!

Согласно @bodgit, метод заключается во внедрении правил жизненного цикла в ресурс «aws_s3_bucket» и повторном запуске команды «terraform apply».

Предложения lifecycle_rule могут быть добавлены (или удалены) к ресурсу, и они будут применены к корзине.

Я хотел отделить правила от создания корзины, чтобы они могли действовать четко, но этого достаточно.

Итак, я определяю ведро с помощью:

resource "aws_s3_bucket" "bucket" {
    bucket      = "${replace(var.tags["Name"],"/_/","-")}"
    region      = "${var.aws_region}"

    tags        = "${merge(var.tags, map("Name", "${replace(var.tags["Name"],"/_/","-")}"))}"

    lifecycle_rule {
        id      = "quarterly_retention"
        prefix  = "quarterly/"
        enabled = true

        expiration {
            days = 92
        }
    }

}

Когда я запускаю "terraform apply", ведро создается с 1 правилом.

Затем я редактирую свой файл .tf и добавляю второе правило жизненного цикла.

resource "aws_s3_bucket" "bucket" {
    bucket      = "${replace(var.tags["Name"],"/_/","-")}"
    region      = "${var.aws_region}"

    tags        = "${merge(var.tags, map("Name", "${replace(var.tags["Name"],"/_/","-")}"))}"

    lifecycle_rule {
        id      = "quarterly_retention"
        prefix  = "quarterly/"
        enabled = true

        expiration {
            days = 92
        }
    }

    lifecycle_rule {
        id      = "permanent_retention"
        enabled = true
        prefix  = "permanent/"

        transition {
            days            = 1
            storage_class   = "GLACIER"
        }
    }

}

Когда я снова выполняю команду «terraform apply», в корзину добавляется второе правило.

Если я затем снова отредактирую правило, удалю правила и снова запущу команду «применить», правила исчезнут.

Если я затем отредактирую, добавлю правило обратно и снова запущу приложение, это правило будет.

Спасибо за помощь!

Создание корзины и постепенное обновление конфигурации должно работать нормально, в конечном итоге, если бы вы удалили корзину другими способами, Terraform воссоздала бы ее со всеми установленными правилами.

Похоже, ты потерял terraform.tfstate файл, поэтому Terraform не знает, что он уже создал вашу корзину, или что вы изначально создали корзину вне Terraform, поэтому он пытается ее создать и терпит неудачу. Terraform должен «владеть» бакетом, чтобы иметь возможность обновлять его конфигурацию, то есть правила жизненного цикла.

Вы должны иметь возможность импортировать существующее ведро в свой файл состояния с помощью чего-то вроде

terraform import aws_s3_bucket.quarterly <your bucket ID>

См. Нижнюю часть https://www.terraform.io/docs/providers/aws/r/s3_bucket.html

Запуск Terraform должен показать, что он просто обновляет правила жизненного цикла.