2016-04-28 22 views
13

sono in grado di creare un secchio S3 utilizzando cloudformation ma vorrei creare una cartella all'interno di una S3 bucket..likecreare cartella all'interno S3 secchio utilizzando Cloudformation

<mybucket>--><myfolder> 

Fatemelo sapere il modello di essere utilizzato per creare una cartella all'interno di un secchio ... entrambi dovrebbero essere creati al Sametime ...

sto usando AWS lambda, come di seguito

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

risposta

11

AWS non fornisce una risorsa CloudFormation ufficiale per creare oggetti all'interno di un bucket S3. Tuttavia, è possibile creare un Lambda-backed Custom Resource per eseguire questa funzione utilizzando l'SDK AWS, e infatti il ​​repository GitHub gilt/cloudformation-helpers fornisce una risorsa personalizzata immediatamente disponibile che fa proprio questo.

Come con qualsiasi impostazione di risorsa personalizzata è un po 'prolisso, poiché è necessario prima distribuire la funzione Lambda e le autorizzazioni IAM, quindi fare riferimento come risorsa personalizzata nel modello di stack.

In primo luogo, aggiungere le risorse Lambda::Function e associati IAM::Role al modello stack:

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

Quindi è possibile utilizzare la funzione Lambda come una risorsa personalizzata per creare l'oggetto S3:

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

È È inoltre possibile utilizzare la stessa risorsa personalizzata per scrivere un oggetto S3 basato su stringhe aggiungendo un parametro Body oltre a Bucket e Key (vedere docs).

5

Questo non è possibile utilizzare un templa AWS CloudFormation TE.

Si deve menzionare che le cartelle non esistono effettivamente in Amazon S3. Invece, il percorso di un oggetto è anteposto al nome (key) di un oggetto.

Quindi, il file bar.txt memorizzato in una cartella denominata foo è effettivamente memorizzata con una chiave di: foo/bar.txt

È anche possibile copiare i file in una cartella che non esiste e la cartella verrà creata automaticamente (che è in realtà non vero, poiché la cartella stessa non esiste). Tuttavia, la console di gestione fornirà l'aspetto di tale cartella e il percorso suggerirà che è memorizzata in tale cartella.

Bottom line: Non è necessario creare una cartella. Basta usarlo come se fosse già lì.

+0

in realtà ho bisogno di richiamare i js di cloudformation inseriti in una cartella sotto il bucket S3 da una funzione Lambda ... quindi dove dovrei posizionare i miei js se la cartella non è richiesta per essere creata in anticipo ??? – shiv455

+0

Potrebbe fornire ulteriori informazioni sui requisiti effettivi (ad es. Cosa intendi con "richiama i jsons di cloudformation")? Il modo migliore è aggiornare la domanda originale con un esempio di ciò che hai provato e di quali problemi hai incontrato. –

+0

Aggiornato la mia domanda per favore controlla !!! .. Sto cercando di creare più risorse (SNS, EC2 ecc.) Usando AWS lambda che richiama create_stack api in cui nestedstack.json è uno dei parametri .... – shiv455

Problemi correlati