11

Uygulamamın en güncel sürümünü indirmek için özel bir S3 paketine erişmesi gereken bir yığın yapıyorum. EC2 örneklerine belirli roller atanmasına izin veren, daha sonra IAM ilkeleriyle birleştirilen nispeten yeni bir AWS özelliği olan IAM roles kullanıyorum. Ne yazık ki, bu roller örnekleme sırasında oluşturulan geçici API kimlik bilgileriyle birlikte gelir. Bu sarsılan değil, ama (sadece konuyla ilgili bit basitleştirilmiş) Bu bulut init betiği gibi şeyler yapmamı zorlamayla: baştaCan IAM rolü, bulut şablonlarında geçici kimlik bilgileri kullanılabilir mi?

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

Birinci ve: Bu çalışır ve oldukça iyi çalışıyor. Aynı şekilde, CloudFormation'un kaynak erişimi için mevcut desteğini kullanmayı çok isterim. Spesifik olarak, cfn-init, S3 kovaları dahil olmak üzere korumalı verilere ulaşmak için authentication resources kullanımını desteklemektedir. Bu anahtarlara cfn-init içinden erişmek veya belki de IAM rolünü bir kimlik doğrulama kaynağına bağlamak var mı?

Bir alternatifin, kaynağımın kimliği doğrulanmış başka bir hizmetin arkasına konacağını sanıyorum, ancak bu şu anda geçerli bir seçenek değil.

Bir başka umut vaat eden yol, AWS::IAM::AccessKey resource, ancak dokümanlar, rollerle birlikte kullanılabileceğini önermiyor. Yine de deneyeceğim.

+0

[boto] (http://boto.readthedocs.org/en/ ile test edilmiştir En son /), popüler bir Python AWS kütüphanesi, bunu zarif bir şekilde ele alır. Daha fazla bilgi için [bu cevap] bölümüne bakın (http://stackoverflow.com/a/11130701/877115). – Christopher

cevap

11

emin değilim, ama bu arada AWS::CloudFormation::Init içinde files ve sources bölümler için S3 indirmeleri kimlik doğrulaması için bir IAM rol kullanabilirsiniz.

Sadece (detaylar için AWS::CloudFormation::Authentication bakınız) mesela roleName yerine & secretKeyaccessKeyId kullanın:

"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

Bunun nasıl bir yanıt olduğunu göremiyorum. Ek olarak, rolün ec2 örneğinin kendisine eklenmesini sağlamalısınız. –

1

Bu çalışmayı başardım. Kullandığım kod şu koddur: https://forums.aws.amazon.com/message.jspa?messageID=319465

Kod, IAM İlkelerini kullanmaz - bunun yerine AWS :: S3 :: BucketPolicy kullanır.

Bulut oluşumu kod parçacığı: En değerlerle

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

    ]]}}   
    } 
} 

Açıkçası değiştirilmesi MY_BUCKET, my_file, MY_INSTANCE_ID, MY_SECURITY_GROUP. destek eklendiğinde