Как создать папку в корзине Amazon S3 с помощью terraform
Я смог создать ведро в Amazon S3 по этой ссылке.
Я использовал следующий код для создания корзины:
resource "aws_s3_bucket" "b" {
bucket = "my_tf_test_bucket"
acl = "private"
}
Теперь я хотел создать папки внутри ведра, скажем, Folder1
,
Я нашел ссылку для создания объекта S3. Но это обязательный параметр source
, Я не уверен, какое значение имеет это значение, поскольку я намереваюсь создать папку внутри корзины S3.
7 ответов
S3 не поддерживает папки. Объекты могут иметь префиксные имена с косой чертой, которые выглядят как папки, но это только часть имени объекта. Таким образом, нет никакого способа создать папку в terraform или что-либо еще, потому что нет такой вещи как папка в S3.
http://docs.aws.amazon.com/AmazonS3/latest/dev/UsingMetadata.html http://docs.aws.amazon.com/AWSImportExport/latest/DG/ManipulatingS3KeyNames.html
Если вы хотите притвориться, вы можете создать объект нулевого байта в сегменте с именем "Folder1/", но это не обязательно. Вы можете просто создавать объекты с именами ключей, такими как "Папка1 / Файл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.
На самом деле, есть канонический способ создать его, не зависящий от ОС, путем проверки сети в пользовательском интерфейсе, чтобы вы видели заголовки контента, как указано: 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.
Ответы здесь устарели, теперь точно можно создать пустую папку в S3 через Terraform. Используя ресурс aws_s3_object следующим образом:
resource "aws_s3_bucket" "this_bucket" {
bucket = "demo_bucket"
}
resource "aws_s3_object" "object" {
bucket = aws_s3_bucket.this_bucket.id
key = "demo/directory/"
}
Если вы не укажете источник для объекта, terraform создаст пустой каталог.
ВАЖНО. Обратите внимание на косую черту в конце, это гарантирует, что вы получите каталог, а не пустой файл.
Я хотел бы добавить к этому обсуждению, что вы можете создать набор пустых папок, предоставив ресурсу набор строк:
resource "aws_s3_object" "default_s3_content" {
for_each = var.default_s3_content
bucket = aws_s3_bucket.bucket.id
key = "${each.value}/"
}
куда
var.default_s3_content
представляет собой набор строк:
variable "default_s3_content" {
description = "The default content of the s3 bucket upon creation of the bucket"
type = set(string)
default = ["folder1", "folder2", "folder3", "folder4", "folder5"]
}
Старый ответ, но если вы укажете ключ с папкой (которая еще не существует), terraform автоматически создаст папку для вас
terraform {
backend "s3" {
bucket = "mysql-staging"
key = "rds-mysql-state/terraform.tfstate"
region = "us-west-2"
encrypt = true
}
}
v0.12.8 представляет новыйfileset()
функция, которую можно использовать в сочетании с for_each
для поддержки этого изначально:
НОВЫЕ ОСОБЕННОСТИ:
lang / funcs: новая функция набора файлов для поиска статических локальных файлов, соответствующих шаблону glob. (#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
}
На момент написания этой статьи версии v0.12.8 исполнился день (выпущена 04.09.2019), поэтому документация на https://www.terraform.io/docs/providers/aws/r/s3_bucket_object.html не содержит пока что ссылаться на это. Я не уверен, намеренно ли это.
Кроме того, если вы используете вышеуказанное, не забудьте обновить / создать version.tf
в вашем проекте так:
terraform {
required_version = ">= 0.12.8"
}