web-dev-qa-db-fra.com

créer un dossier dans le compartiment S3 à l'aide de Cloudformation

Je suis capable de créer un bucket S3 en utilisant cloudformation mais je voudrais créer un dossier à l'intérieur d'un bucket S3..like

<mybucket>--><myfolder>

Veuillez me faire savoir le modèle à utiliser pour créer un dossier dans un compartiment ... les deux doivent être créés en même temps ...

J'utilise AWS lambda comme ci-dessous

stackname = 'myStack'
client = boto3.client('cloudformation')
response = client.create_stack(
    StackName= (stackname),
    TemplateURL= 'https://s3.amazonaws.com/<myS3bucket>/<myfolder>/nestedstack.json',
    Parameters=<params>
)
20
shiv455

AWS ne fournit pas de ressource CloudFormation officielle pour créer des objets dans un compartiment S3. Cependant, vous pouvez créer un ressource personnalisée soutenue par Lambda pour exécuter cette fonction à l'aide du kit SDK AWS, et en fait le gilt/cloudformation-helpers le référentiel GitHub fournit un off-the -shelf ressource personnalisée qui fait exactement cela.

Comme pour toute configuration de ressource personnalisée, c'est un peu bavard, car vous devez d'abord déployer la fonction Lambda et les autorisations IAM, puis la référencer en tant que ressource personnalisée dans votre modèle de pile.

Tout d'abord, ajoutez le Lambda::Function et associés IAM::Role ressources vers votre modèle de pile:

"S3PutObjectFunctionRole": {
  "Type": "AWS::IAM::Role",
  "Properties": {
    "AssumeRolePolicyDocument": {
      "Version" : "2012-10-17",
      "Statement": [
        {
          "Effect": "Allow",
          "Principal": {
            "Service": [ "lambda.amazonaws.com" ]
          },
          "Action": [ "sts:AssumeRole" ]
        }
      ]
    },
    "ManagedPolicyArns": [
      { "Ref": "RoleBasePolicy" }
    ],
    "Policies": [
      {
        "PolicyName": "S3Writer",
        "PolicyDocument": {
          "Version" : "2012-10-17",
          "Statement": [
            {
              "Effect": "Allow",
              "Action": [
                "s3:DeleteObject",
                "s3:ListBucket",
                "s3:PutObject"
              ],
              "Resource": "*"
            }
          ]
        }
      }
    ]
  }
},
"S3PutObjectFunction": {
  "Type": "AWS::Lambda::Function",
  "Properties": {
    "Code": {
      "S3Bucket": "com.gilt.public.backoffice",
      "S3Key": "lambda_functions/cloudformation-helpers.Zip"
    },
    "Description": "Used to put objects into S3.",
    "Handler": "aws/s3.putObject",
    "Role": {"Fn::GetAtt" : [ "S3PutObjectFunctionRole", "Arn" ] },
    "Runtime": "nodejs",
    "Timeout": 30
  },
  "DependsOn": [
    "S3PutObjectFunctionRole"
  ]
},

Ensuite, vous pouvez utiliser la fonction Lambda en tant que ressource personnalisée pour créer votre objet S3:

"MyFolder": {
  "Type": "Custom::S3PutObject",
  "Properties": {
    "ServiceToken": { "Fn::GetAtt" : ["S3PutObjectFunction", "Arn"] },
    "Bucket": "mybucket",
    "Key": "myfolder/"
  }
},

Vous pouvez également utiliser la même ressource personnalisée pour écrire un objet S3 basé sur une chaîne en ajoutant un paramètre Body en plus de Bucket et Key (voir docs ).

18
wjordan

Cela n'est pas possible à l'aide d'un modèle AWS CloudFormation.

Il convient de mentionner que les dossiers n'existent pas réellement dans Amazon S. Au lieu de cela, le chemin d'accès d'un objet est ajouté au nom (key) d'un objet.

Donc, fichier bar.txt stocké dans un dossier nommé foo est en fait stocké avec une clé de: foo/bar.txt

Vous pouvez également copier des fichiers dans un dossier qui n'existe pas et le dossier sera automatiquement créé (ce qui n'est pas vrai, car le dossier lui-même n'existe pas). Cependant, la console de gestion fournira l'apparence d'un tel dossier et le chemin suggèrera qu'il est stocké dans un tel dossier.

Conclusion: Il n'est pas nécessaire de pré-créer un dossier. Utilisez-le comme s'il était déjà là.

14
John Rotenstein

Nous ne pouvons pas (au moins pour l'instant) créer un sous-dossier à l'intérieur du compartiment s3.

Vous pouvez essayer d'utiliser la commande suivante:

 aws s3 mb s3://yavdhesh-bucket/inside-folder

Et puis essayez de répertorier tous les dossiers à l'intérieur du compartiment en utilisant la commande:

aws s3 ls s3://yavdhesh-bucket

Et vous remarquerez que le sous-dossier n'a pas été créé.

il n'y a qu'une seule façon de créer un sous-dossier, c'est-à-dire en créant/copiant un fichier dans un sous-dossier ou sous-répertoire inexistant (en ce qui concerne le compartiment)

Par exemple,

aws s3 cp demo.txt s3://yavdhesh-bucket/inside-folder/

Maintenant, si vous répertoriez les fichiers présents dans votre sous-dossier, cela devrait fonctionner.

 aws s3 ls s3://yavdhesh-bucket/inside-folder/

il doit répertorier tous les fichiers présents dans ce sous-dossier.

enter image description here

J'espère que cela aide.

2
Yogesh Sanchihar