Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/amazon-s3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Amazon web services Boto3错误:您提供的AWS访问密钥Id在我们的记录中不存在_Amazon Web Services_Amazon S3_Boto_Boto3 - Fatal编程技术网

Amazon web services Boto3错误:您提供的AWS访问密钥Id在我们的记录中不存在

Amazon web services Boto3错误:您提供的AWS访问密钥Id在我们的记录中不存在,amazon-web-services,amazon-s3,boto,boto3,Amazon Web Services,Amazon S3,Boto,Boto3,我目前正在尝试在虚拟机中访问Amazon S3并下载如下文件: s3 = boto3.resource('s3', aws_access_key_id="xxxxxxxxxxx", aws_secret_access_key="xxxxxxxxxxxxxxxxx") s3client = boto3.client('s3') bucket = s3.Bucket('bucketone') for obj in bucket.objects.all():

我目前正在尝试在虚拟机中访问Amazon S3并下载如下文件:

s3 = boto3.resource('s3',
         aws_access_key_id="xxxxxxxxxxx",
         aws_secret_access_key="xxxxxxxxxxxxxxxxx")
s3client = boto3.client('s3')

bucket = s3.Bucket('bucketone')

for obj in bucket.objects.all():
    s3client.download_file(bucket_name, obj.key, filename)
但我得到了一个错误:

botocore.exceptions.ClientError:调用ListObjects操作时,InvalidAccessKeyId出错:您提供的AWS访问密钥Id在我们的记录中不存在


我可能做错了什么?我多次检查了我的aws\u访问\u密钥\u id和aws\u机密\u访问\u密钥,但仍然得到相同的错误。相同的代码在本地(但不是在虚拟机上)实际上也在不同的计算机上工作。我必须硬编码按键,这是有原因的。

您需要设置boto3会话的访问权限。你不想把你的钥匙放在你的代码里。我建议首先运行“aws配置”,并在.credentials文件中设置您的aws\u访问密钥\u id和aws\u密码\u访问密钥。然后在代码中执行以下操作:

session = boto3.Session(profile_name='name_of_your_profile')
如果您只有默认配置文件,您可能不需要这样做,或者为了更好地衡量,只需输入:

session = boto3.Session(profile_name='default')
一旦在代码中有了这些内容,您就可以通过以下方式建立与s3的连接:

s3 = session.resource('s3')
bucket = s3.Bucket('bucketone')
for obj in bucket.objects.all():
   print(obj.key)
您的代码也有一些问题。您正在创建一个s3客户端。S3客户端没有Bucket方法或属性。要对s3客户端执行相同的操作,您将执行以下操作:

s3client = session.client('s3')
response = s3client.get_object(Bucket='bucketone', key='your key')
然后,您可以遍历返回的响应以查看bucket中的对象列表

这应该会解决你的错误

初始答案:如果您使用的是EC2/Lambda/etc,您将得到一个值,这意味着您需要使用AWS_SESSION_令牌环境变量并将其传递给boto3

忽略它将抛出InvalidAccessKeyId错误


更新:我记不清了,但我想我当时问题的原因根本不是因为AWS_会话_令牌,而是因为我使用Zappa将自己的boto3库绑定到Lambda应用程序。在我使用Lambda的内置boto3移除boto3后,问题就消失了

您需要设置AWS命令行界面并配置其设置。 1.下载并安装AWS CLI。 2.运行aws configure`命令并提供访问密钥和密钥。
如果仍然出现错误,请检查IAM用户的编程访问是否处于活动状态。删除现有的访问密钥并创建一个新的密钥以供使用。

不要在EC2实例中使用您的凭据,根据AWS,这不是一种安全良好做法,创建IAM角色而不是使用AWS凭据访问密钥id和机密访问密钥

IAM->Create Role->AWS Service单击EC2->Next Permissions->选择AmazonS3FullAccess或AmazonS3ReadOnlyAccess,或您喜欢的任何内容。创建后,返回实例并将创建的角色名称附加到实例

这很好用

两个用户都要小心

TL;博士 如果使用临时凭据通过Boto3连接到AWS服务,则必须将当前AWS_会话_令牌作为参数包含到Boto3.session.session实例中

从boto3.session导入会话 理想情况下,这是拿起你的环境。 标识= 秘密= 令牌=令牌 会话=会话 aws\u访问\u键\u id=id, aws_secret_access_key=secret, aws_会话_令牌=令牌, 地区名称= 在服务上测试它您的服务可能会有所不同 s3=会话。资源“s3” 打印出存储桶名称 对于s3.bucket.all中的bucket: printbucket.name 解释 在Boto3中测试凭据时,这是一条至关重要的信息: 您收到的错误可能会这样说

ClientError:调用ListBucket操作时,InvalidAccessKeyId出错:您提供的AWS访问密钥Id在我们的记录中不存在

但如果您使用的是临时凭据(在我的示例中是基于角色的凭据),则可能意味着您缺少aws_会话_令牌

根据AWS文档,这些是boto3.session.session对象可用的参数,但是,对于boto3中的这种行为,没有任何指示或说明:

Parameters
aws_access_key_id (string) -- AWS access key ID
aws_secret_access_key (string) -- AWS secret access key
aws_session_token (string) -- AWS temporary session token
region_name (string) -- Default region when creating new connections
botocore_session (botocore.session.Session) -- Use this Botocore session instead of creating a new default one.
profile_name (string) -- The name of a profile to use. If not given, then the default profile is used.
关于aws_会话_令牌

指定用作凭据的一部分以验证用户身份的AWS会话令牌。仅当手动指定临时安全凭据时,才需要会话令牌

资源
请检查这是否有帮助:是否尝试连接aws cli?运行aws配置后,运行aws s3 ls并检查其是否工作。还可以尝试将region_name参数传递给boto3.resource。您的访问密钥id是否以AKIA开头。。。或者是亚洲…?如果你能详细说明这个答案,特别是关于如何使用AWS_会话_令牌,那将非常有用:你真的不想把你的密钥放在你的代码中-是的,不!有时候你不想把它们放进你的代码里。我不得不投反对票,因为你的回答只是权宜之计。