11

Tôi đang xây dựng một ngăn xếp cần truy cập vào thùng S3 riêng để tải xuống phiên bản mới nhất của ứng dụng của tôi. Tôi đang sử dụng IAM roles, một tính năng AWS tương đối mới cho phép các cá thể EC2 được gán vai trò cụ thể, sau đó được kết hợp với các chính sách IAM. Thật không may, những vai trò này đi kèm với thông tin đăng nhập API tạm thời được tạo lúc khởi tạo. Nó không làm tê liệt, nhưng nó buộc tôi phải làm những việc như kịch bản đám mây-init này (đơn giản hóa để chỉ các bit có liên quan):IAM có thể sử dụng thông tin đăng nhập tạm thời trong các mẫu hình đám mây không?

#!/bin/sh 

# Grab our credentials from the meta-data and parse the response 
CREDENTIALS=$(curl -s http://169.254.169.254/latest/meta-data/iam/security-credentials/s3access) 
S3_ACCESS_KEY=$(echo $CREDENTIALS | ruby -e "require 'rubygems'; require 'json'; puts JSON[STDIN.read]['AccessKeyId'];") 
S3_SECRET_KEY=$(echo $CREDENTIALS | ruby -e "require 'rubygems'; require 'json'; puts JSON[STDIN.read]['SecretAccessKey'];") 
S3_TOKEN=$(echo $CREDENTIALS | ruby -e "require 'rubygems'; require 'json'; puts JSON[STDIN.read]['Token'];") 

# Create an executable script to pull the file 
cat <<EOF> /tmp/pullS3.rb 
require 'rubygems' 
require 'aws-sdk' 
AWS.config(
    :access_key_id  => "$S3_ACCESS_KEY", 
    :secret_access_key => "$S3_SECRET_KEY", 
    :session_token  => "$S3_TOKEN") 
s3 = AWS::S3.new() 
myfile = s3.buckets['mybucket'].objects["path/to/my/file"] 
File.open("/path/to/save/myfile", "w") do |f| 
    f.write(myfile.read) 
end 
EOF 

# Downloading the file 
ruby /tmp/pullS3.rb 

Đầu tiên và quan trọng nhất: Công trình này, và hoạt động khá tốt. Tôi cũng thích sử dụng hỗ trợ hiện tại của CloudFormation để truy cập nguồn. Cụ thể, cfn-init hỗ trợ việc sử dụng authentication resources để nhận dữ liệu được bảo vệ, bao gồm cả nhóm S3. Có anyway để có được tại các phím này từ bên trong cfn-init, hoặc có lẽ buộc vai trò IAM vào một nguồn tài nguyên xác thực?

Tôi giả sử một giải pháp thay thế sẽ đặt nguồn của tôi phía sau một số dịch vụ được chứng thực khác, nhưng đó không phải là một lựa chọn khả thi tại thời điểm này.

Một khách hàng tiềm năng đầy hứa hẹn khác là AWS::IAM::AccessKey resource, nhưng các tài liệu không đề xuất rằng nó có thể được sử dụng với vai trò. Tôi sẽ thử nó.

+0

[boto] (http://boto.readthedocs.org/en/ mới nhất /), một thư viện AWS python phổ biến, xử lý thanh lịch này. Xem [câu trả lời này] (http://stackoverflow.com/a/11130701/877115) để biết thêm chi tiết. – Christopher

Trả lời

11

Tôi không chắc chắn khi nào hỗ trợ được thêm, nhưng bạn có thể sử dụng vai trò IAM để xác thực tải xuống S3 cho các phần filessources trong AWS::CloudFormation::Init.

Chỉ cần sử dụng roleName thay vì accessKeyId & secretKey (xem AWS::CloudFormation::Authentication để biết chi tiết), ví dụ:

"Metadata": { 
    "AWS::CloudFormation::Init": { 
     "download": { 
      "files": { 
       "/tmp/test.txt": { 
        "source": "http://myBucket.s3.amazonaws.com/test.txt" 
       } 
      } 
     } 
    }, 
    "AWS::CloudFormation::Authentication": { 
     "default" : { 
      "type": "s3", 
      "buckets": [ "myBucket" ], 
      "roleName": { "Ref": "myRole" } 
     } 
    } 
} 

Thử nghiệm với aws-cfn-bootstrap-1.3-11

+0

Tôi không thấy câu trả lời này như thế nào. Bạn cần phải bổ sung, đính kèm vai trò vào bản thân ec2, cho phép nó truy cập vĩnh viễn vào nhóm. –

1

Tôi đã cố gắng làm việc này. Những gì tôi đã sử dụng là mã từ trao đổi này: https://forums.aws.amazon.com/message.jspa?messageID=319465

Mã không sử dụng các chính sách IAM - nó sử dụng AWS :: S3 :: BucketPolicy thay thế.

Mây đoạn mã hình:

"Resources" : {  

"CfnUser" : { 
    "Type" : "AWS::IAM::User", 
    "Properties" : { 
    "Path": "/", 
    "Policies": [{ 
     "PolicyName": "root", 
     "PolicyDocument": { "Statement":[{ 
     "Effect" : "Allow", 
     "Action" : [ 
      "cloudformation:DescribeStackResource", 
      "s3:GetObject" 
     ], 
     "Resource" :"*" 
     }]} 
    }] 
    } 
}, 

"CfnKeys" : { 
    "Type" : "AWS::IAM::AccessKey", 
    "Properties" : { 
    "UserName" : {"Ref": "CfnUser"} 
    } 
}, 

"BucketPolicy" : { 
    "Type" : "AWS::S3::BucketPolicy", 
    "Properties" : { 
    "PolicyDocument": { 
     "Version"  : "2008-10-17", 
     "Id"   : "CfAccessPolicy", 
     "Statement" : [{ 
     "Sid"  : "ReadAccess", 
     "Action"  : ["s3:GetObject"], 
     "Effect"  : "Allow", 
     "Resource" : { "Fn::Join" : ["", ["arn:aws:s3:::<MY_BUCKET>/*"]]}, 
     "Principal" : { "AWS": {"Fn::GetAtt" : ["CfnUser", "Arn"]} } 
     }] 
    }, 
    "Bucket" : "<MY_BUCKET>" 
    } 
}, 

"WebServer": { 
    "Type": "AWS::EC2::Instance", 
    "DependsOn" : "BucketPolicy", 
    "Metadata" : { 

    "AWS::CloudFormation::Init" : { 
     "config" : { 

     "sources" : { 
      "/etc/<MY_PATH>" : "https://s3.amazonaws.com/<MY_BUCKET>/<MY_FILE>" 
     } 

     } 
    }, 

    "AWS::CloudFormation::Authentication" : { 
     "S3AccessCreds" : { 
     "type" : "S3", 
     "accessKeyId" : { "Ref" : "CfnKeys" }, 
     "secretKey" : {"Fn::GetAtt": ["CfnKeys", "SecretAccessKey"]}, 
     "buckets" : [ "<MY_BUCKET>" ] 
     } 
    } 
    }, 

    "Properties": { 
    "ImageId" : "<MY_INSTANCE_ID>", 
    "InstanceType" : { "Ref" : "WebServerInstanceType" }, 
    "KeyName" : {"Ref": "KeyName"}, 
    "SecurityGroups" : [ "<MY_SECURITY_GROUP>" ], 

    "UserData"  : { "Fn::Base64" : { "Fn::Join" : ["", [ 
     "#!/bin/bash\n", 

     "# Helper function\n", 
     "function error_exit\n", 
     "{\n", 
     " cfn-signal -e 1 -r \"$1\" '", { "Ref" : "WaitHandle" }, "'\n", 
     " exit 1\n", 
     "}\n", 

     "# Install Webserver Packages etc \n", 
     "cfn-init -v --region ", { "Ref" : "AWS::Region" }, 
     " -s ", { "Ref" : "AWS::StackName" }, " -r WebServer ", 
     "   --access-key ", { "Ref" : "CfnKeys" }, 
     "   --secret-key ", {"Fn::GetAtt": ["CfnKeys", "SecretAccessKey"]}, " || error_exit 'Failed to run cfn-init'\n", 

     "# All is well so signal success\n", 
     "cfn-signal -e 0 -r \"Setup complete\" '", { "Ref" : "WaitHandle" }, "'\n" 

    ]]}}   
    } 
} 

Rõ ràng thay thế MY_BUCKET, MY_FILE, MY_INSTANCE_ID, MY_SECURITY_GROUP với các giá trị của bạn.

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