2015-11-07 12 views
10

私は、フランクフルト地域にあるS3のオブジェクトにaws lambdaでboto3を使用しています。承認メカニズムをboto3とインラインで設定する方法

v4が必要です。それ以外の場合は次のエラーがsignature_version http://boto3.readthedocs.org/en/latest/guide/configuration.html

を設定するには、しかし、私はAWSのラムダを使用しておりますので、私は基本的な構成プロファイルへのアクセス

私のAWSのラムダ関数のコードを持っていない方法を実現

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

を返します。

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 

このコードでsignature_versionを設定することは可能ですか?セッションを使用します。またはこれに対処する方法はありますか?代わりに、デフォルトのセッションを使用しての

答えて

16

、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

ファイルからこれを設定する方法はありますか? 'boto3'が依存関係のコードを使用しているので私は尋ねています。したがって、' client() '呼び出しを変更するための直接アクセス権がありません。 – bstempi

+0

boto3.session.Session(profile_name = 'profile1')を設定できます。ここで、profile1は.aws/credentialsファイルで定義されているAWSキー、トークン、希望地域、その他の必要なパラメータを持つプロファイルの名前です – omuthu

+0

AWSキーを使用して、代わりにEC2インスタンスのメタデータサービスに頼っていますか? – bstempi

4

からカスタムセッションとConfig]を使用してみてください私は、セッションアプローチを試してみましたが、私は問題を抱えていました。この方法は私のために、あなたの走行距離は異なる場合があり良く働いた:

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

あなたがこの作品を作るためにbotocore.clientからコンフィグをインポートする必要があります。バケット(リストオブジェクト)をテストするための機能的なメソッドについては、以下を参照してください。これは、IAMロールを持つようにアマゾンEC2やラムダとして、あなたの認証が管理された環境から、それを実行している前提としています

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' 

単にバケット名でメソッドを呼び出し、それをテストします。あなたの役割は、適切な権限を与える必要があります。