2016-04-28 14 views
13

Ich bin in der Lage eine S3 Eimer mit Cloudformation zu schaffen, sondern möchte einen Ordner in einem S3 erstellen bucket..likeerstellen Ordner innerhalb S3 Eimer mit Cloudformation

<mybucket>--><myfolder> 

Bitte lassen Sie mich die Vorlage kennen zu sein verwendet, um einen Ordner in einem Eimer zu schaffen ... sowohl auf der Sametime ...

erstellt werden soll ich verwenden AWS Lambda wie unten

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

Antwort

11

AWS bietet keine offizielle CloudFormation-Ressource zum Erstellen von Objekten in einem S3-Bucket. Sie können jedoch eine Lambda-backed Custom Resource erstellen, um diese Funktion mit dem AWS SDK auszuführen, und das gilt/cloudformation-helpers GitHub-Repository stellt eine benutzerdefinierte Standardressource bereit, die genau dies ermöglicht.

Wie bei allen benutzerdefinierten Ressourcen Setup ist ein wenig ausführlich, da Sie zunächst die Lambda-Funktion und IAM-Berechtigungen bereitstellen müssen, dann verweisen Sie als benutzerdefinierte Ressource in Ihrer Stack-Vorlage.

Fügen Sie zunächst die Lambda::Function und die damit verbundenen IAM::Role zu Ihrer Stapelvorlage:

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

Dann können Sie die Lambda-Funktion als benutzerdefinierte Ressource verwenden, um Ihre S3-Objekt zu erstellen:

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

Sie kann auch dieselbe benutzerdefinierte Ressource verwenden, um ein stringbasiertes S3-Objekt zu schreiben, indem ein Body Parameter zusätzlich zu Bucket und Key hinzugefügt wird (siehe docs).

5

Dies ist eine AWS Cloudformation templa nicht möglich mit te.

Es sollte erwähnt werden, dass Ordner tatsächlich nicht in Amazon S3 existieren. Stattdessen wird der Pfad eines Objekts dem Namen (key) eines Objekts vorangestellt.

So Datei bar.txt in einem Ordner gespeichert foo benannt ist tatsächlich mit einem Schlüssel der gespeicherten: foo/bar.txt

Sie auch in einen Ordner kopieren Dateien können, die nicht vorhanden ist und der Ordner automatisch erstellt wird (das ist nicht wirklich wahr, da der Ordner selbst nicht existiert). In der Management Console wird jedoch ein solcher Ordner angezeigt, und der Pfad weist darauf hin, dass er in einem solchen Ordner gespeichert ist.

Endergebnis: Es ist nicht notwendig, einen Ordner vorzufertigen. Benutze es einfach, als wäre es schon da.

+0

eigentlich muss ich cloudformation jsons in einem Ordner unter S3-Bucket aus einer Lambda-Funktion aufrufen ... also wo soll ich meine jsons platzieren, wenn der Ordner nicht im Voraus erstellt werden muss ??? – shiv455

+0

Könnten Sie bitte mehr Informationen über Ihre tatsächlichen Anforderungen geben (zB was meinen Sie mit "cloudformation jsons aufrufen")? Am besten aktualisieren Sie die ursprüngliche Frage anhand eines Beispiels, was Sie versucht haben und welche Probleme aufgetreten sind. –

+0

Aktualisiert meine Frage bitte überprüfen !!! .. Im Versuch, mehrere Ressourcen (SNS, EC2 etc ..) mit AWS Lambda, die create_stack api erstellt, wobei nestedstack.json ist einer der Parameter .... – shiv455