使用Docker内部的boto3从S3下载文件失败

k75qkfdt  于 2023-01-20  发布在  Docker
关注(0)|答案(6)|浏览(212)

当我在Docker容器中运行它时,这是失败的,但当我在OS X的virtualenv中运行它时,它工作正常。你知道什么可能出错吗?Docker+boto有任何已知的问题吗?

>>> import boto3                                                                                                                   
>>> s3 = boto3.client('s3')                                                                                                        
>>> s3.download_file("mybucket", "myfile.txt", "myfile2.txt")                                                                
Traceback (most recent call last):                                                                                                 
  File "<stdin>", line 1, in <module>                                                                                              
  File "/opt/conda/lib/python2.7/site-packages/boto3/s3/inject.py", line 104, in download_file                                     
    extra_args=ExtraArgs, callback=Callback)                                                                                       
  File "/opt/conda/lib/python2.7/site-packages/boto3/s3/transfer.py", line 666, in download_file                                   
    object_size = self._object_size(bucket, key, extra_args)                                                                       
  File "/opt/conda/lib/python2.7/site-packages/boto3/s3/transfer.py", line 729, in _object_size                                    
    Bucket=bucket, Key=key, **extra_args)['ContentLength']                                                                         
  File "/opt/conda/lib/python2.7/site-packages/botocore/client.py", line 258, in _api_call                                         
    return self._make_api_call(operation_name, kwargs)                                                                             
  File "/opt/conda/lib/python2.7/site-packages/botocore/client.py", line 548, in _make_api_call                                    
    raise ClientError(parsed_response, operation_name)                                                                             
botocore.exceptions.ClientError: An error occurred (403) when calling the HeadObject operation: Forbidden
r8xiu3jd

r8xiu3jd1#

我刚查了一个类似的案子,这归结为一个事实,即在尝试与S3通信时返回403的机器上的系统时间是错误的。不正确的系统时间意味着请求签名的计算不正确。将系统时间设置为正确的值解决了问题--如果您确保Docker容器设置了系统时间(例如通过使用NTP),您的问题可能会像我的一样消失。

wyyhbhjk

wyyhbhjk2#

我在这里遇到了同样的问题,一个在windows上运行的docker。问题是,一旦你的电脑进入待机模式,Hyper-V时间就停止了。这导致了问题,因为我的请求和AWS桶的时间戳是不同的。
对我来说解决问题的是简单地重新启动docker/我的电脑...
还要记住,将您的AWS - Profile /凭据作为环境变量发送。看起来,这是Docker的一个问题:
https://forums.docker.com/t/docker-for-windows-should-resync-vm-time-when-computer-resumes-from-sleep/17825/28

dtcbnfnu

dtcbnfnu3#

提供sessionToken即可完成此工作。在Dockerfile中添加ENV AWS_SESSION_TOKEN=****沿着访问密钥和secret_access_key

taor4pac

taor4pac4#

查看错误:An error occurred (403) when calling the HeadObject operation: Forbidden
它找到了凭据,但没有访问存储桶的权限。更新您的IAM权限以包括您的存储桶的s3:ListBucket权限:arn:aws:s3:::mybucket/*或仅将策略AmazonS3ReadOnlyAccess附加到IAM用户/角色。
您可以尝试这样做,并看到它打印正确的凭据:

>>> import botocore.session
>>> session = botocore.session.get_session()

>>> session.get_credentials().access_key
'AKIAABCDEF6RWSGI234Q'

>>> session.get_credentials().secret_key
'abcdefghijkl+123456789+qbcd'
xmakbtuz

xmakbtuz5#

我猜你没有设置正确的环境变量。使用env检查你的主机上设置了什么,并在容器中设置类似的变量,或者使用-e将它们传递给docker run
编辑:由于您在注解中指定了要使用凭据文件,请将其传递到-v ~/.aws/credentials:/root/.aws/credentials容器中。这是假设设置了正确的HOME,并且您使用的是root用户。有些映像没有这样做,您可能需要将其放在/.aws/credentials的根文件夹中。如果您有特定的用户,则路径需要在他的主文件夹中。

bkkx9g8r

bkkx9g8r6#

我解决这个问题的方法是在我的容器上安装awscli并更新boto3〉1.4

pip install awscli
pip install --upgrade boto3

相关问题