2012-06-21 34 views
22

Tôi đang cố gắng sử dụng tính năng "IAM role for EC2" được công bố gần đây của AWS, cho phép ủy nhiệm bảo mật tự động được gửi tới các phiên bản EC2. (xem http://aws.amazon.com/about-aws/whats-new/2012/06/11/Announcing-IAM-Roles-for-EC2-instances/).boto vấn đề với vai trò IAM

Tôi đã thiết lập một cá thể có vai trò IAM như được mô tả. Tôi cũng có thể nhận được (dường như) khóa truy cập/thông tin xác thực phù hợp với curl.

Tuy nhiên, boto không thực hiện cuộc gọi đơn giản như "get_all_buckets", mặc dù tôi đã bật TẤT CẢ quyền S3 cho vai trò.

Các lỗi tôi nhận được là "The ID Khóa AWS truy cập mà bạn cung cấp không tồn tại trong hồ sơ của chúng tôi"

Tuy nhiên, phím truy cập được liệt kê trong các lỗi phù hợp với một tôi nhận được từ curl.

Đây là kịch bản thất bại, chạy trên một thể hiện EC2 với một vai trò quan IAM kèm theo cung cấp cho tất cả các quyền S3:

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() 

Trả lời

60

Nếu bạn đang sử dụng boto 2.5.1 hay muộn nó thực sự dễ dàng hơn nhiều so với này. Boto sẽ tự động tìm thông tin đăng nhập trong siêu dữ liệu cá thể cho bạn và sử dụng chúng miễn là không có thông tin xác thực khác được tìm thấy trong biến môi trường hoặc trong tệp cấu hình boto. Vì vậy, bạn nên có thể chỉ cần làm điều này trên EC2:

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

Lý do mà phương pháp thủ công của mình là không là các thông tin liên quan đến vai trò IAM là một phiên chứng chỉ tạm thời và bao gồm một access_key, a secret_keysecurity_token và bạn cần cung cấp cả ba giá trị đó cho hàm tạo S3Connection.

+0

Đối với phương pháp thủ công, bạn nói đúng, thêm security_token đã sửa nó. Cảm ơn bạn! Tôi đánh dấu bạn là 'câu trả lời' cho điều đó. – Nils

+0

Phiên bản đơn giản mà bạn đã đăng cũng hoạt động sau khi nâng cấp lên 2.5.1. Vì vậy, nếu tôi có thể cung cấp cho bạn 2 chấp nhận, tôi sẽ! – Nils

+0

Tuyệt vời, vui vì nó làm việc cho bạn bây giờ. Tôi thích tính năng IAM Roles mới, nó thực sự mượt mà. – garnaat

5

Tôi không biết câu trả lời này có giúp ích gì cho ai không nhưng tôi đã gặp lỗi tương tự, tôi phải giải quyết vấn đề của mình một chút khác biệt. Đầu tiên, ví dụ amazon của tôi không có bất kỳ vai trò IAM nào. Tôi nghĩ rằng tôi chỉ có thể sử dụng khóa truy cập và khóa bí mật nhưng tôi vẫn nhận được lỗi này chỉ với hai khóa đó. Tôi đọc Tôi cần một mã thông báo bảo mật là tốt, nhưng tôi không có một bởi vì tôi không có bất kỳ vai trò IAM. Đây là những gì tôi đã làm để khắc phục sự cố:

  1. Tạo vai trò IAM với quyền truy cập AmazonS3FullTruy cập.
  2. Bắt đầu phiên bản mới và đính kèm vai trò mới được tạo của tôi.
  3. Ngay cả sau khi thực hiện việc này, nó vẫn không hoạt động. Tôi cũng đã để kết nối với các khu vực thích hợp với mã dưới đây:

    nhập khẩu boto.s3.connection
    conn = boto.s3.connect_to_region ('bạn vùng')
    conn.get_all_buckets()

+2

Cảm ơn, hữu ích của nó, tôi đã nhận được cùng một vấn đề những ngày này. – timesking

+0

thiết lập AWS_DEFAULT_REGION đã làm các trick, nhưng tại sao không boto nhận được rằng từ các dữ liệu dụ quá? –

Các vấn đề liên quan