web-dev-qa-db-fra.com

Comment créer un dossier dans un compartiment Amazon S3 à l'aide de terraform

J'ai pu créer un compartiment dans un Amazon S3 en utilisant ce lien .

J'ai utilisé le code suivant pour créer un compartiment:

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

Maintenant, je voulais créer des dossiers dans le compartiment, par exemple Folder1.

J'ai trouvé le lien pour créer un objet S3. Mais cela a un paramètre obligatoire source. Je ne suis pas sûr de la valeur de cette valeur, car mon intention est de créer un dossier à l'intérieur du compartiment S3.

21
cmm user

Pour exécuter terraform sur Mac ou Linux, ce qui suit fera ce que vous voulez

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

Si vous êtes sous Windows, vous pouvez utiliser un fichier vide.

Alors que les gens seront pédant sur le fait que s3 n'a pas de dossiers, il existe un certain nombre d'opérations où le fait d'avoir un espace réservé d'objet pour un préfixe de clé (autrement appelé un dossier) facilite la vie. Comme la synchronisation s3 par exemple.

48
PaulR

S3 ne prend pas en charge les dossiers. Les objets peuvent avoir des noms de préfixe avec des barres obliques qui ressemblent à des dossiers, mais ce n'est qu'une partie du nom de l'objet. Il n'y a donc aucun moyen de créer un dossier en terraform ou quoi que ce soit d'autre, car il n'y a rien de tel qu'un dossier dans S3.

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

Si vous voulez faire semblant, vous pouvez créer un objet de zéro octet dans le compartiment nommé "Folder1 /" mais ce n'est pas obligatoire. Vous pouvez simplement créer des objets avec des noms clés comme "Folder1/File1" et cela fonctionnera.

20
Karen B

En fait, il existe un moyen canonique de le créer, sans dépendre du système d'exploitation, en inspectant le réseau sur une interface utilisateur, vous voyez les en-têtes de contenu, comme indiqué par: https://stackoverflow.com/users/1554386/ alastair-mccormack ,

Et S3 prend actuellement en charge les dossiers visibles depuis l'interface utilisateur.

Voici donc comment vous pouvez y parvenir:

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

Veuillez remarquer la barre oblique de fin sinon cela crée un fichier vide

Ci-dessus a été utilisé avec un système d'exploitation Windows pour créer avec succès un dossier à l'aide de terraform s3_bucket_object.

5
Ilhicas

ancienne réponse mais si vous spécifiez la clé avec le dossier (qui n'existe pas encore) terraform créera automatiquement le dossier pour vous

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

v0.12.8 introduit une nouvelle fonction fileset() qui peut être utilisée en combinaison avec for_each pour prendre en charge cela nativement:

NOUVELLES FONCTIONNALITÉS:

lang/funcs: nouvelle fonction d'ensemble de fichiers, pour trouver des fichiers locaux statiques qui correspondent à un modèle global. ( # 2252 )

Voici un exemple d'utilisation de cette fonction (de ici ):

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

Au moment d'écrire ces lignes, la v0.12.8 a un jour (sortie le 2019-09-04), donc la documentation sur https://www.terraform.io/docs/providers/aws/r/s3_bucket_object .html ne le fait pas encore référence. Je ne sais pas si c'est intentionnel.


En passant, si vous utilisez ce qui précède, n'oubliez pas de mettre à jour/créer version.tf dans votre projet comme ceci:

terraform {
  required_version = ">= 0.12.8"
}
0
Ashutosh Jindal