如何配置与boto3内联的授权机制
How to configure authorization mechanism inline with boto3
我在 aws lambda 中使用 boto3 来检测位于法兰克福地区的 S3 中的对象。
v4 是必需的。否则以下错误将 return
"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_versionhttp://boto3.readthedocs.org/en/latest/guide/configuration.html
但是因为我使用的是 AWS lambda,所以我无权访问底层配置文件
我的 AWS lambda 函数的代码
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?使用会话为例。或者有什么解决方法吗?
尝试使用来自 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')
我尝试了会话方法,但遇到了问题。这种方法对我来说效果更好,你的里程可能会有所不同:
s3 = boto3.resource('s3', config=Config(signature_version='s3v4'))
您需要从 botocore.client 导入 Config 才能完成这项工作。请参阅下面的功能方法来测试存储桶(列出对象)。这假设您 运行 来自管理身份验证的环境,例如具有 IAM 角色的 Amazon EC2 或 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'
要对其进行测试,只需使用存储桶名称调用该方法即可。您的角色必须授予适当的权限。
使用适合我的资源。
from botocore.client import Config
import boto3
s3 = boto3.resource("s3", config=Config(signature_version="s3v4"))
return s3.meta.client.generate_presigned_url(
"get_object", Params={"Bucket": AIRFLOW_BUCKET, "Key": key}, ExpiresIn=expTime
)
我在 aws lambda 中使用 boto3 来检测位于法兰克福地区的 S3 中的对象。
v4 是必需的。否则以下错误将 return
"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_versionhttp://boto3.readthedocs.org/en/latest/guide/configuration.html
但是因为我使用的是 AWS lambda,所以我无权访问底层配置文件
我的 AWS lambda 函数的代码
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?使用会话为例。或者有什么解决方法吗?
尝试使用来自 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')
我尝试了会话方法,但遇到了问题。这种方法对我来说效果更好,你的里程可能会有所不同:
s3 = boto3.resource('s3', config=Config(signature_version='s3v4'))
您需要从 botocore.client 导入 Config 才能完成这项工作。请参阅下面的功能方法来测试存储桶(列出对象)。这假设您 运行 来自管理身份验证的环境,例如具有 IAM 角色的 Amazon EC2 或 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'
要对其进行测试,只需使用存储桶名称调用该方法即可。您的角色必须授予适当的权限。
使用适合我的资源。
from botocore.client import Config
import boto3
s3 = boto3.resource("s3", config=Config(signature_version="s3v4"))
return s3.meta.client.generate_presigned_url(
"get_object", Params={"Bucket": AIRFLOW_BUCKET, "Key": key}, ExpiresIn=expTime
)