2015-11-07 23 views
10

Tôi đang sử dụng boto3 trong aws lambda để đối tượng fecth trong S3 nằm ở khu vực Frankfurt.Làm thế nào để cấu hình cơ chế ủy quyền nội tuyến với boto3

v4 là cần thiết. nếu không thì báo lỗi sau sẽ trở lại

"errorMessage": "An error occurred (InvalidRequest) when calling 
the GetObject operation: The authorization mechanism you have 
provided is not supported. Please use AWS4-HMAC-SHA256." 

cách Nhận ra để cấu hình signature_version http://boto3.readthedocs.org/en/latest/guide/configuration.html

Nhưng kể từ khi tôi đang sử dụng AWS lambda, tôi không có quyền truy cập vào cấu hình cơ bản tiểu sử

Mã hàm lambda AWS của tôi

from __future__ import print_function 
import boto3 


def lambda_handler (event, context): 
    input_file_bucket = event["Records"][0]["s3"]["bucket"]["name"] 
    input_file_key = event["Records"][0]["s3"]["object"]["key"] 
    input_file_name = input_file_bucket+"/"+input_file_key 

    s3=boto3.resource("s3") 
    obj = s3.Object(bucket_name=input_file_bucket, key=input_file_key) 
    response = obj.get() 
    return event #echo first key valuesdf 

Có thể định cấu hình signature_version trong mã này không? sử dụng Phiên làm ví dụ. Hay có cách giải quyết nào về vấn đề này không?

Trả lời

16

Thay vì sử dụng phiên mặc định, hãy thử sử dụng phiên tùy chỉnh và cấu hình từ boto3.session

import boto3 
import boto3.session 
session = boto3.session.Session(region_name='eu-central-1') 
s3client = session.client('s3', config= boto3.session.Config(signature_version='s3v4')) 
s3client.get_object(Bucket='<Bkt-Name>', Key='S3-Object-Key') 
+0

Có cách nào để định cấu hình điều này từ tệp không? Tôi hỏi vì tôi đang sử dụng một đoạn mã mà 'boto3' là sự phụ thuộc, vì vậy tôi không có quyền truy cập trực tiếp để thay đổi cuộc gọi' client() '. – bstempi

+0

bạn có thể đặt boto3.session.Session (profile_name = 'profile1') trong đó profile1 là tên của cấu hình được xác định trong tệp .aws/credentials với khóa AWS, mã thông báo, vùng mong muốn và các thông số cần thiết khác – omuthu

+0

Điều gì xảy ra nếu tôi không bằng cách sử dụng khóa AWS và thay vào đó tôi dựa vào dịch vụ siêu dữ liệu của cá thể EC2? – bstempi

4

Tôi đã thử các cách tiếp cận phiên, nhưng tôi đã có vấn đề. Phương pháp này hiệu quả hơn đối với tôi, số dặm của bạn có thể thay đổi:

s3 = boto3.resource('s3', config=Config(signature_version='s3v4')) 

Bạn sẽ cần phải nhập cấu hình từ botocore.client để thực hiện công việc này. Xem bên dưới để biết phương pháp chức năng để kiểm tra một nhóm (liệt kê các đối tượng). Điều này giả định bạn đang chạy nó từ một môi trường nơi xác thực của bạn được quản lý, chẳng hạn như Amazon EC2 hoặc Lambda với một vai trò IAM:

import boto3 
from botocore.client import Config 
from botocore.exceptions import ClientError 

def test_bucket(bucket): 
    print 'testing bucket: ' + bucket 
    try: 
     s3 = boto3.resource('s3', config=Config(signature_version='s3v4')) 
     b = s3.Bucket(bucket) 
     objects = b.objects.all() 

     for obj in objects: 
      print obj.key 
     print 'bucket test SUCCESS' 
    except ClientError as e: 
     print 'Client Error' 
     print e 
     print 'bucket test FAIL' 

Để kiểm tra nó, chỉ cần gọi phương thức với một tên xô. Vai trò của bạn sẽ phải cấp quyền thích hợp.

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