HTTP代码400使用python中的Boto3从AWS S3 bucket获取对象

HTTP代码400使用python中的Boto3从AWS S3 bucket获取对象,python,amazon-s3,boto,aws-cli,boto3,Python,Amazon S3,Boto,Aws Cli,Boto3,我正在编写一个脚本,该脚本应该从我的s3存储桶下载一个文件,然后对其进行一些更改。 问题是,我的脚本在以root用户身份执行时运行良好,但在使用专用用户执行时运行不好 下面是我们感兴趣的一段代码: s3 = boto3.client('s3', aws_access_key_id='xxx', aws_secret_access_key='xxx') s3.download_file('my-bucket', 'my_file.csv', '/my/path/to/file.csv') 当我

我正在编写一个脚本,该脚本应该从我的s3存储桶下载一个文件,然后对其进行一些更改。 问题是,我的脚本在以root用户身份执行时运行良好,但在使用专用用户执行时运行不好

下面是我们感兴趣的一段代码:

s3 = boto3.client('s3', aws_access_key_id='xxx', aws_secret_access_key='xxx')

s3.download_file('my-bucket', 'my_file.csv', '/my/path/to/file.csv')
当我以root用户身份运行脚本时,没有问题,文件被下载,脚本继续,但由我的专用用户执行:

logstash:x:501:501::/home/logstash:/sbin/nologin
,它不工作

我尝试将Python解释器作为root和logstash运行,并逐个命令执行脚本命令,它作为root而不是logstash运行。以下是错误:

Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/local/lib/python2.7/site-packages/boto3/s3/inject.py", line 126, in download_file
extra_args=ExtraArgs, callback=Callback)
File "/usr/local/lib/python2.7/site-packages/boto3/s3/transfer.py", line 299, in download_file
future.result()
File "/usr/local/lib/python2.7/site-packages/s3transfer/futures.py", line 73, in result
return self._coordinator.result()
File "/usr/local/lib/python2.7/site-packages/s3transfer/futures.py", line 233, in result
raise self._exception
botocore.exceptions.ClientError: An error occurred (400) when calling the HeadObject operation: Bad Request
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
文件“/usr/local/lib/python2.7/site packages/boto3/s3/inject.py”,下载文件第126行
额外参数=额外参数,回调=回调)
文件“/usr/local/lib/python2.7/site packages/boto3/s3/transfer.py”,第299行,在下载文件中
future.result()
文件“/usr/local/lib/python2.7/site packages/s3transfer/futures.py”,结果中的第73行
返回self.\u coordinator.result()
文件“/usr/local/lib/python2.7/site packages/s3transfer/futures.py”,第233行,在结果中
提出自己的意见
botocore.exceptions.ClientError:调用HeadObject操作时发生错误(400):请求错误
我在谷歌上搜索了很多,但是没有关于这个特殊的“用户切换”案例的主题。

我是第一个:)

用户
logstash
的权限是否为您下载到的目录正确设置


您是否碰巧错过了
chown-R日志中的
-R

以防其他人出于与我相同的原因遇到此错误: 对我来说,修复方法是在初始化s3客户端时提供一个区域,例如:

    s3 = boto3.client("s3", region_name="eu-central-1")
其中“欧盟中央1号”需要被真正存在水桶的地区所取代。 它看起来像是这个bug:,尽管听起来它应该被修复。 仅供参考,由于未设置此区域,我遇到的两个错误如下

botocore.exceptions.ClientError:调用GetCallerIdentity操作时发生错误(InvalidClientTokenId):请求中包含的安全令牌无效

问题中已经提到的:

botocore.exceptions.ClientError:调用HeadObject操作时发生错误(400):请求错误


有趣的是,一些电话在“eu-central-1”中没有这一功能,但在中国“cn-north-1”中同样的请求失败了。

也有同样的错误。问题在于文件路径不正确

您是否以logstash身份登录?否,因为我不使用它们作为根用户(我也不想)。我使用硬编码凭证来实现可移植性(我知道这是一种糟糕的做法)。。。凭据在boto3.client arguments中非常奇怪,它对我有效。可能异常是误导性的,您没有权限写入启动python脚本的目录…我太愚蠢了
chown-R logstash:。
解决了我的问题。我一定忘记了上一个
chown
上的
-R
选项。无论如何,谢谢你!遗憾的是,这不是解决办法。因为当我完成
chown-R
时,我的下载目录中已经有了
文件.csv
(以前是作为root下载的)。因此,我也更改了对它的权限,但作为logstash执行的脚本无法自行下载该文件,并使用以前的文件(作为root和已更改的所有者)继续该过程…您是否尝试过用户和组的
chown-R logstash:logstash
,这就是我在你之前的回答中所写的评论
chown-R logstash:
我想也是这样。我不知道,是否是一样的。无论如何我都会尝试:)对不起,我不知道,我想原因可能是你用户的权限。。