Я создаю стек, которому нужен доступ к частному ведро S3, чтобы загрузить самую последнюю версию моего приложения. Я использую роли IAM, относительно новую функцию AWS, которая позволяет экземплярам EC2 назначать определенные роли, которые затем сочетаются с политиками IAM. К сожалению, эти роли связаны с временными учетными данными API, созданными при создании экземпляра. Это не искалечило, но это заставило меня делать такие вещи, как этот cloud-init script (упрощенный только соответствующий бит):
#!/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
В первую очередь: это работает и работает очень хорошо. Тем не менее, я бы хотел использовать существующую поддержку CloudFormation для доступа к источнику. В частности, cfn-init
поддерживает использование ресурсов аутентификации для получения защищенных данных, включая ведра S3. В любом случае, чтобы получить эти ключи из cfn-init
или, возможно, привязать роль IAM к ресурсу проверки подлинности?
Я полагаю, что одна из альтернатив будет помещать мой источник в другую аутентифицированную службу, но это не жизнеспособный вариант в настоящее время.
Другим перспективным направлением является AWS:: IAM:: AccessKey ресурс, но документы не предполагают, что он может использоваться с ролями, Я все равно попробую.