11

मैं एक स्टैक बना रहा हूं जिसके लिए मेरे आवेदन के सबसे वर्तमान संस्करण को डाउनलोड करने के लिए एक निजी एस 3 बाल्टी तक पहुंच की आवश्यकता है। मैं IAM roles का उपयोग कर रहा हूं, जो अपेक्षाकृत नई एडब्लूएस सुविधा है जो ईसी 2 उदाहरणों को विशिष्ट भूमिका नियुक्त करने की अनुमति देता है, जो तब आईएएम नीतियों के साथ मिलकर बनती हैं। दुर्भाग्यवश, ये भूमिकाएं अस्थायी रूप से उत्पन्न अस्थायी API प्रमाण-पत्रों के साथ आती हैं। यह गंभीर नहीं है, लेकिन यह मुझे इस क्लाउड-init स्क्रिप्ट (सिर्फ प्रासंगिक बिट करने के लिए सरल) जैसे कार्य करने के लिए मजबूर कर रहा है:क्या क्लाउड टेम्पलेट्स में आईएएम भूमिका अस्थायी प्रमाण-पत्रों का उपयोग किया जा सकता है?

#!/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 

सबसे पहले: यह काम करता है, और बहुत अच्छी तरह से काम करता है। वैसे ही, मुझे क्लाउडफॉर्मेशन के स्रोत पहुंच के लिए मौजूदा समर्थन का उपयोग करना अच्छा लगेगा। विशेष रूप से, cfn-init एस 3 बाल्टी समेत संरक्षित डेटा प्राप्त करने के लिए authentication resources के उपयोग का समर्थन करता है। क्या cfn-init के भीतर से इन चाबियाँ प्राप्त करने के लिए वैसे भी है, या शायद आईएएम भूमिका को प्रमाणीकरण संसाधन से जोड़ना है?

मुझे लगता है कि एक विकल्प मेरे स्रोत को किसी अन्य प्रमाणीकृत सेवा के पीछे रखेगा, लेकिन यह इस समय एक व्यवहार्य विकल्प नहीं है।

एक और आशाजनक लीड AWS::IAM::AccessKey resource, है लेकिन दस्तावेज़ों का सुझाव नहीं है कि इसका उपयोग भूमिकाओं के साथ किया जा सकता है। मैं वैसे भी कोशिश करने जा रहा हूँ।

+0

[Boto] (http://boto.readthedocs.org/en/ परीक्षण किया नवीनतम /), एक लोकप्रिय पायथन एडब्ल्यूएस लाइब्रेरी, यह सुंदर ढंग से संभालती है। अधिक जानकारी के लिए [यह उत्तर] देखें (http://stackoverflow.com/a/11130701/877115)। – Christopher

उत्तर

11

मुझे यकीन है कि जब समर्थन को जोड़ा गया नहीं कर रहा हूँ, लेकिन आप तब तक AWS::CloudFormation::Init में files और sources वर्गों के लिए S3 डाउनलोड के सत्यापन के लिए एक IAM भूमिका का उपयोग कर सकते हैं।

बस roleName बजाय accessKeyId & secretKey, जैसे का उपयोग (विवरण के लिए AWS::CloudFormation::Authentication देखें):

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

साथ aws-cfn-bootstrap-1.3-11

+0

मैं यह देखने में असफल रहा कि यह जवाब कैसे है। आपको इसके अलावा, ec2 इंस्टेंस में भूमिका निभाने की आवश्यकता है, जो इसे बाल्टी तक स्थायी पहुंच प्रदान करता है। –

1

मैं यह काम करने में कामयाब रहा। मैंने जो उपयोग किया वह इस एक्सचेंज से कोड था: https://forums.aws.amazon.com/message.jspa?messageID=319465

कोड आईएएम नीतियों का उपयोग नहीं करता है - यह इसके बजाय AWS :: S3 :: BucketPolicy का उपयोग करता है।

बादल गठन कोड स्निपेट:

"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" 

    ]]}}   
    } 
} 

अपने मूल्यों के साथ जाहिर की जगह MY_BUCKET, MY_FILE, MY_INSTANCE_ID, MY_SECURITY_GROUP।

संबंधित मुद्दे

 संबंधित मुद्दे