Buduję stos, który potrzebuje dostępu do prywatnego zasobnika S3, aby pobrać najnowszą wersję mojej aplikacji. Używam IAM roles, względnie nowej funkcji AWS, która pozwala na przypisanie określonych instancji EC2 do określonych ról, które następnie są powiązane z zasadami IAM. Niestety te role mają tymczasowe referencje API wygenerowane podczas tworzenia instancji. To nie paraliżuje, ale to zmusiło mnie do robienia rzeczy, jak ten skrypt cloud-init (uproszczonej do zaledwie odpowiedniej bit):Czy tymczasowe dane logowania do roli IAM mogą być używane w szablonach Cloudformation?
#!/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
Przede wszystkim: To działa, i działa całkiem dobrze. Mimo to, chciałbym skorzystać z istniejącej obsługi CloudFormation dla dostępu do źródła. W szczególności, cfn-init
obsługuje użycie authentication resources, aby uzyskać chronione dane, w tym wiadra S3. Czy mimo to można uzyskać te klucze z poziomu cfn-init
, a może powiązać rolę IAM z zasobem uwierzytelniania?
Przypuszczam, że jedną alternatywą byłoby umieszczenie mojego źródła za inną uwierzytelnioną usługą, ale obecnie nie jest to realną opcją.
Kolejną obiecującą przewagą jest AWS::IAM::AccessKey resource,, ale dokumenty nie sugerują, że można z niej korzystać. I tak spróbuję.
[Boto] (http://boto.readthedocs.org/en/ latest /), popularna biblioteka zapytań AWS, radzi sobie z tym elegancko. Aby uzyskać więcej informacji, zobacz [tę odpowiedź] (http://stackoverflow.com/a/11130701/877115). – Christopher