当我在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
6条答案
按热度按时间r8xiu3jd1#
我刚查了一个类似的案子,这归结为一个事实,即在尝试与S3通信时返回403的机器上的系统时间是错误的。不正确的系统时间意味着请求签名的计算不正确。将系统时间设置为正确的值解决了问题--如果您确保Docker容器设置了系统时间(例如通过使用NTP),您的问题可能会像我的一样消失。
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
dtcbnfnu3#
提供sessionToken即可完成此工作。在Dockerfile中添加ENV AWS_SESSION_TOKEN=****沿着访问密钥和secret_access_key
taor4pac4#
查看错误:
An error occurred (403) when calling the HeadObject operation: Forbidden
它找到了凭据,但没有访问存储桶的权限。更新您的IAM权限以包括您的存储桶的
s3:ListBucket
权限:arn:aws:s3:::mybucket/*
或仅将策略AmazonS3ReadOnlyAccess
附加到IAM用户/角色。您可以尝试这样做,并看到它打印正确的凭据:
xmakbtuz5#
我猜你没有设置正确的环境变量。使用
env
检查你的主机上设置了什么,并在容器中设置类似的变量,或者使用-e
将它们传递给docker run
。编辑:由于您在注解中指定了要使用凭据文件,请将其传递到
-v ~/.aws/credentials:/root/.aws/credentials
容器中。这是假设设置了正确的HOME
,并且您使用的是root
用户。有些映像没有这样做,您可能需要将其放在/.aws/credentials
的根文件夹中。如果您有特定的用户,则路径需要在他的主文件夹中。bkkx9g8r6#
我解决这个问题的方法是在我的容器上安装awscli并更新boto3〉1.4