2012-06-21 55 views
22

我正在嘗試使用AWS最近宣佈的「ECAM的IAM角色」功能,該功能可以讓安全證書自動傳遞到EC2實例。 (見http://aws.amazon.com/about-aws/whats-new/2012/06/11/Announcing-IAM-Roles-for-EC2-instances/)。boto問題與IAM角色

我已經建立了一個具有IAM角色的實例,如上所述。我還可以通過curl(看似)獲得適當的訪問密鑰/證書。

但是,boto未能做一個簡單的調用,如「get_all_buckets」,儘管我已經打開了該角色的所有S3權限。

我得到的錯誤是

「你提供我們的記錄中不存在的AWS訪問密鑰」然而,在錯誤中列出的訪問密鑰相匹配的一個我從捲曲得到。

這裏是失敗的腳本,在EC2實例與給所有S3權限連接的IAM角色運行:

import urllib2 
import ast 
from boto.s3.connection import S3Connection 

resp=urllib2.urlopen('http://169.254.169.254/latest/meta-data/iam/security-credentials/DatabaseApp').read() 
resp=ast.literal_eval(resp) 
print "access:" + resp['AccessKeyId'] 
print "secret:" + resp['SecretAccessKey'] 
conn = S3Connection(resp['AccessKeyId'], resp['SecretAccessKey']) 
rs= conn.get_all_buckets() 

回答

60

如果您使用的博託2.5.1或更高版本,它實際上比這更簡單。只要在環境變量或boto配置文件中找不到其他憑據,Boto就會自動在實例元數據中爲您找到憑據並使用它們。所以,你應該能夠簡單地做這在EC2實例:

>>> import boto 
>>> c = boto.connect_s3() 
>>> rs = c.get_all_buckets() 

的原因,你的手工做法失敗是與IAM角色相關聯的證書是一個臨時會話證書,由一個access_key的,一個secret_key和一個security_token,您需要將這三個值提供給S3Connection構造函數。

+0

對於手動方法,你是對的,加入security_token就可以解決它。謝謝!我將你標記爲「答案」。 – Nils

+0

您發佈的簡化版本在升級到2.5.1後也可以使用。所以如果我能給你兩個接受,我會的! – Nils

+0

太棒了,很高興它現在適合你。我喜歡新的IAM角色功能,它非常漂亮。 – garnaat

5

我不知道這個答案是否會幫助任何人,但我得到同樣的錯誤,我不得不解決我的問題有點不同。 首先,我的amazon實例沒有任何IAM角色。我以爲我可以只使用訪問密鑰和密鑰,但我一直只有這兩個密鑰纔得到這個錯誤。我讀過我也需要一個安全令牌,但我沒有,因爲我沒有任何IAM角色。這是我爲糾正問題所做的:

  1. 使用AmazonS3FullAccess權限創建IAM角色。
  2. 開始一個新實例並附加我新創建的角色。
  3. 即使這樣做,它仍然沒有工作。我只好也與下面的代碼連接到正確的區域:

    進口boto.s3.connection
    康恩= boto.s3.connect_to_region( '你的區域')
    conn.get_all_buckets()

+2

謝謝,它的幫助,我現在有同樣的問題。 – timesking

+0

設置AWS_DEFAULT_REGION訣竅,但爲什麼博託不能從實例數據中獲取? –