Как использовать роль IAM для доступа к ресурсам с использованием временных учетных данных?

Я использую роли AWS IAM, которые позволяют экземпляру иметь доступ к определенным ресурсам, используя временные учетные данные API (ключ доступа, секретный ключ и токен безопасности).

Когда я проверяю временные учетные данные с помощью этого скрипта ruby, он работает без проблем:

require 'rubygems'
require 'aws-sdk'
AWS.config(
    :access_key_id     => "MY ACCESS KEY GOES HERE",
    :secret_access_key => "MY SECRET KEY GOES HERE",
    :session_token     => "MY TOKEN GOES HERE")
s3 = AWS::S3.new()
myfile = s3.buckets['My-Config'].objects["file.sh"]
File.open("/tmp/file.sh", "w") do |f|
    f.write(myfile.read)
end

Но при использовании командной строки для запуска cfn-describe-stacks я получаю сообщение об ошибке:

export AWS_CREDENTIAL_FILE=aws_credentials.cfg
cfn-describe-stacks
cfn-describe-stacks:  Refused: The security token included in the request is invalid

а вот мой aws_credentials.cfg:

AWSAccessKeyId=MY ACCESS KEY
AWSSecretKey=My SECRET KEY
AWSToken="MY TOKEN=="

Так что мне здесь не хватает? Спасибо!


person PapelPincel    schedule 24.08.2012    source источник


Ответы (2)


Я не думаю, что инструменты CLI поддерживают временные учетные данные. Если они это сделали, вы сможете передать свой «AWSToken» в качестве параметра командной строки. Но согласно документации, он поддерживает только передача идентификатора ключа доступа и секретного ключа в качестве параметров.

-I, --access-key-id ЗНАЧЕНИЕ

Укажите VALUE в качестве используемого идентификатора доступа AWS.

-S, --secret-key ЗНАЧЕНИЕ

Укажите VALUE в качестве используемого секретного ключа AWS.

person GalacticJello    schedule 24.08.2012
comment
Я думаю, что это еще не поддерживается, потому что служба IAM Roles все еще новая (около месяца назад). Я смотрел документацию, форумы, много гуглил, но, похоже, на данный момент поддержки нет. В любом случае, спасибо за ответ. - person PapelPincel; 24.08.2012

Это легко сделать с помощью сценария пользовательских данных. Например, этот фрагмент получит ваши временные учетные данные и загрузит ресурс с S3. Я использую его для развертывания WAR.

# Install updates and dependencies
yum -y install ruby-devel
yum -y install rubygems
yum install -y rubygem-nokogiri
gem install --no-rdoc --no-ri aws-sdk
gem install --no-rdoc --no-ri json

# Grab credentials and parse them
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'];")

# Download myFile
cat << EOF > /etc/getFile.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["myFile"]
File.open("myLocalFile", "w") do |f|
  f.write(myfile.read)
end
EOF

ruby /etc/getFile.rb

Поместите его в свой шаблон CloudFormation и соответствующим образом зарегистрируйте. Это будет работать как шарм. Вы можете использовать профили экземпляра с LaunchConfigs и Ресурсы EC2 без проблем. Я уверен в этом на 100%. Они связались с AWS, когда их специалисты по документации добавили эти ссылки в документацию.

person Christopher    schedule 27.08.2012
comment
Отлично. Чтобы избавиться от жестко запрограммированной роли, вы можете сделать: ROLE==$(curl -s http://169.254.169.254/latest/meta-data/iam/security-credentials/), а затем CREDENTIALS=$(curl -s http://169.254.169.254/latest/meta-data/iam/security-credentials/${ROLE}) - person GalacticJello; 28.08.2012
comment
Кроме того, последняя версия AWS ruby ​​sdk не требует передачи ключа, секрета и токена. Он будет использовать их за кадром, если используется роль экземпляра. Таким образом, строка AWS.config и захват учетных данных больше не нужны в последней версии SDK. - person GalacticJello; 28.08.2012
comment
О, это впечатляюще. Я обязательно обновлю свои скрипты соответствующим образом. Значит, я могу полностью пропустить спецификацию учетных данных? - person Christopher; 28.08.2012