2016-04-28 27 views
13

tôi có thể tạo ra một xô S3 sử dụng cloudformation nhưng muốn tạo một thư mục bên trong một S3 bucket..liketạo thư mục bên trong S3 xô sử dụng Cloudformation

<mybucket>--><myfolder> 

Xin vui lòng cho tôi biết mẫu được sử dụng để tạo một thư mục bên trong một thùng ... cả hai nên được tạo ra tại Sametime ...

tôi đang dùng AWS lambda như sau

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

Trả lời

11

AWS không cung cấp tài nguyên CloudFormation chính thức để tạo đối tượng trong thùng S3. Tuy nhiên, bạn có thể tạo một Lambda-backed Custom Resource để thực hiện chức năng này bằng cách sử dụng SDK AWS, và trên thực tế, kho lưu trữ GitHub gilt/cloudformation-helpers cung cấp một nguồn tài nguyên tùy chỉnh không cần thiết chỉ thực hiện việc này.

Cũng giống như bất kỳ thiết lập tài nguyên tùy chỉnh nào, vì trước tiên bạn cần triển khai hàm Lambda và quyền IAM, sau đó tham chiếu nó dưới dạng tài nguyên tùy chỉnh trong mẫu ngăn xếp của bạn.

Đầu tiên, thêm các nguồn lực Lambda::Function và liên IAM::Role để ngăn xếp mẫu của bạn:

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

Sau đó, bạn có thể sử dụng chức năng Lambda như một tài nguyên Tuỳ chỉnh để tạo đối tượng S3 của bạn:

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

Bạn cũng có thể sử dụng cùng một tài nguyên tùy chỉnh để viết đối tượng S3 dựa trên chuỗi bằng cách thêm tham số Body ngoài BucketKey (xem docs).

5

này là không thể sử dụng một templa AWS CloudFormation te.

Cần lưu ý rằng thư mục không thực sự tồn tại trong Amazon S3. Thay vào đó, đường dẫn của đối tượng được thêm vào tên (key) của một đối tượng.

Vì vậy, tập tin bar.txt lưu trữ trong một thư mục có tên foo là thực sự được lưu trữ với một chính của: foo/bar.txt

Bạn cũng có thể sao chép các tập tin vào một thư mục không tồn tại và thư mục sẽ được tự động tạo ra (đó là không thực sự đúng, vì chính thư mục không tồn tại). Tuy nhiên, Management Console sẽ cung cấp sự xuất hiện của một thư mục như vậy và đường dẫn sẽ gợi ý rằng nó được lưu trữ trong một thư mục như vậy.

Dòng dưới cùng: Không cần tạo trước thư mục. Chỉ cần sử dụng nó như thể nó đã có.

+0

thực sự tôi cần gọi jsons đám mây được đặt bên trong thư mục bên dưới thùng S3 từ hàm Lambda ... vậy tôi nên đặt jsons ở đâu nếu thư mục không bắt buộc phải được tạo trước? – shiv455

+0

Bạn có thể vui lòng cung cấp thêm thông tin về các yêu cầu thực tế của bạn không (ví dụ: bạn có ý nghĩa gì khi gọi "jsons cloudformation")? Cách tốt nhất là cập nhật Câu hỏi ban đầu với ví dụ về những gì bạn đã thử và những vấn đề bạn gặp phải. –

+0

Cập nhật câu hỏi của tôi xin vui lòng kiểm tra !!! .. Im cố gắng tạo nhiều tài nguyên (SNS, EC2, vv ..) bằng cách sử dụng AWS lambda gọi inv_stack api trong đó nestedstack.json là một tham số .... – shiv455

Các vấn đề liên quan