Как создать папку в ведро Amazon S3 с использованием терраформы

Мне удалось создать ведро в Amazon S3 по этой ссылке.

Я использовал следующий код для создания корзины:

resource "aws_s3_bucket" "b" {
    bucket = "my_tf_test_bucket"
    acl    = "private"
}

Теперь я хотел создать папки внутри корзины, скажем, Folder1.

Я нашел ссылку для создания объекта S3. Но это имеет обязательный параметр source. Я не уверен, какое значение имеет это значение, поскольку я намереваюсь создать папку внутри корзины S3.

Ответ 1

Для запуска terraform на Mac или Linux следующее будет делать то, что вы хотите

resource "aws_s3_bucket_object" "folder1" {
    bucket = "${aws_s3_bucket.b.id}"
    acl    = "private"
    key    = "Folder1/"
    source = "/dev/null"
}

Если вы работаете в Windows, вы можете использовать пустой файл.

В то время как люди будут педантичны по поводу того, что у s3 нет папок, есть ряд операций, в которых наличие заполнителя объекта для префикса ключа (иначе называемого папкой) облегчает жизнь. Как, например, s3 sync.

Ответ 2

S3 не поддерживает папки. Объекты могут иметь имена префикса с косой чертой, которые выглядят как папки, но это только часть имени объекта. Поэтому нет способа создать папку в terraform или что-нибудь еще, потому что в S3 нет такой вещи, как папка.

http://docs.aws.amazon.com/AmazonS3/latest/dev/UsingMetadata.html http://docs.aws.amazon.com/AWSImportExport/latest/DG/ManipulatingS3KeyNames.html

Если вы хотите притворяться, вы можете создать объект с нулевым байтом в ведре с именем "Folder1/", но это не требуется. Вы можете просто создавать объекты с такими именами ключей, как "Folder1/File1", и он будет работать.

Ответ 3

старый ответ, но если вы укажете ключ с папкой (которая еще не существует), terraform автоматически создаст папку для вас

terraform {
  backend "s3" {
    bucket  = "mysql-staging"
    key     = "rds-mysql-state/terraform.tfstate"
    region  = "us-west-2"
    encrypt = true
  }
}

Ответ 4

На самом деле, существует канонический способ его создания, не зависящий от операционной системы, путем проверки сети в пользовательском интерфейсе, чтобы увидеть заголовки содержимого, как указано в: https://stackoverflow.com/users/1554386/alastair-mccormack,

И S3 поддерживает папки в наши дни, как видно из пользовательского интерфейса.

Вот как это можно сделать:

resource "aws_s3_bucket_object" "base-folder" {
    bucket  = "${aws_s3_bucket.default.id}"
    acl     = "private"
    key     =  "${var.named_folder}/"
    content_type = "application/x-directory"
    kms_key_id = "key_arn_if_used"
}

Пожалуйста, обратите внимание на косую черту, иначе он создаст пустой файл

Выше был использован с ОС Windows для успешного создания папки с использованием terraform s3_bucket_object.

Ответ 5

v0.12.8 представляет новую функцию fileset(), которую можно использовать в сочетании с for_each для встроенной поддержки:

NEW FEATURES:

lang/funcs: новая функция набора файлов, для поиска статических локальных файлов, которые соответствовать шаблону шара. (# 22523)

Пример использования этой функции приведен ниже (из здесь):

# Given the file structure from the initial issue:
# my-dir
#    |- file_1
#    |- dir_a
#    |     |- file_a_1
#    |     |- file_a_2
#    |- dir_b
#    |     |- file_b_1
#    |- dir_c
# And given the expected behavior of the base_s3_key prefix in the initial issue

resource "aws_s3_bucket_object" "example" {
  for_each = fileset(path.module, "my-dir/**/file_*")

  bucket = aws_s3_bucket.example.id
  key    = replace(each.value, "my-dir", "base_s3_key")
  source = each.value
}

На момент написания этой статьи версия 0.12.8 была устаревшей (выпущена 2019-09-04), поэтому документация по https://www.terraform.io/docs/providers/aws/r/s3_bucket_object.html еще не ссылается на нее. Я не уверен, намеренно ли это.


Кроме того, если вы используете вышеупомянутое, не забудьте обновить/создать version.tf в вашем проекте следующим образом:

terraform {
  required_version = ">= 0.12.8"
}