web-dev-qa-db-ja.com

boto3とインラインで承認メカニズムを構成する方法

フランクフルト地域にあるS3のオブジェクトに影響を与えるためにawslambdaでboto3を使用しています。

v4が必要です。そうしないと、次のエラーが返されます

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

Signature_versionを構成するための実現された方法 http://boto3.readthedocs.org/en/latest/guide/configuration.html

しかし、AWS lambdaを使用しているため、基盤となる構成プロファイルにアクセスできません

AWSラムダ関数のコード

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を構成することは可能ですか?たとえば、Sessionを使用します。または、これに関する回避策はありますか?

12
Hello lad

セッションアプローチを試しましたが、問題がありました。この方法は私にとってよりうまくいきました、あなたのマイレージは変わるかもしれません:

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

これを機能させるには、botocore.clientからConfigをインポートする必要があります。バケットをテストするための機能的な方法については、以下を参照してください(オブジェクトを一覧表示します)。これは、Amazon EC2やIAMロールを持つLambdaなど、認証が管理されている環境から実行していることを前提としています。

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'

テストするには、バケット名を使用してメソッドを呼び出すだけです。あなたの役割は適切な許可を与える必要があります。

5
Andy G