【问题标题】:Boto3 Error: botocore.exceptions.NoCredentialsError: Unable to locate credentialsBoto3 错误:botocore.exceptions.NoCredentialsError:无法找到凭据
【发布时间】:2016-01-22 16:26:25
【问题描述】:

当我简单地运行以下代码时,我总是得到这个错误。

s3 = boto3.resource('s3')
bucket_name = "python-sdk-sample-%s" % uuid.uuid4()
print("Creating new bucket with name:", bucket_name)
s3.create_bucket(Bucket=bucket_name)

我已将我的凭据文件保存在

C:\Users\myname\.aws\credentials,博托应该从那里读取我的凭据。

我的设置错了吗?

这是boto3.set_stream_logger('botocore', level='DEBUG')的输出。

2015-10-24 14:22:28,761 botocore.credentials [DEBUG] Skipping environment variable credential check because profile name was explicitly set.
2015-10-24 14:22:28,761 botocore.credentials [DEBUG] Looking for credentials via: env
2015-10-24 14:22:28,773 botocore.credentials [DEBUG] Looking for credentials via: shared-credentials-file
2015-10-24 14:22:28,774 botocore.credentials [DEBUG] Looking for credentials via: config-file
2015-10-24 14:22:28,774 botocore.credentials [DEBUG] Looking for credentials via: ec2-credentials-file
2015-10-24 14:22:28,774 botocore.credentials [DEBUG] Looking for credentials via: boto-config
2015-10-24 14:22:28,774 botocore.credentials [DEBUG] Looking for credentials via: iam-role

【问题讨论】:

  • 您可以通过在代码前添加boto3.set_stream_logger('botocore', level='DEBUG') 来发布调试输出吗?它会显示它在哪里寻找凭据。
  • Boto 似乎为凭据配置文件寻找的位置很少,但显然由于某种原因没有查看我的主目录...
  • 尝试将环境变量HOME 设置为指向C:\Users\myname 或设置AWS_SHARED_CREDENTIALS_FILE 直接指向您的凭据文件。
  • 我按照您的描述设置了环境变量 HOME,但现在出现以下错误。 botocore.exceptions.NoRegionError: You must specify a region. *my config file↓ 与我的凭据位于同一文件夹中。 [default] ap-northeast-1
  • 我可以使用 garnaat's comment 解决问题。

标签: boto boto3


【解决方案1】:

尝试手动指定键

    s3 = boto3.resource('s3',
         aws_access_key_id=ACCESS_ID,
         aws_secret_access_key= ACCESS_KEY)

出于安全考虑,请确保您没有将ACCESS_IDACCESS_KEY 直接包含在代码中。 考虑使用环境配置并将它们注入@Tiger_Mike 建议的代码中。

对于 Prod 环境,请考虑使用轮换访问密钥: https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_access-keys.html#Using_RotateAccessKey

【讨论】:

  • 这种方式在直接在 Django 上处理时很有用。谢谢。
  • 这更危险,因为您将秘密放入代码中,最终可能会进入版本控制。
  • @nueverest 这是正确的,但是您可以通过将声明移动到设置文件然后通过环境变量注入来避免这种情况。
  • 虽然这可行,但我想说它没有遵循最佳实践。
  • 谢谢。这可以用作开发设置中的临时修复。从.env 文件(未提交)加载这些变量是理想的,并且比从~/.aws/ 文件夹中选择要好。
【解决方案2】:

我遇到了同样的问题,发现我的~/.aws/credentials 文件格式错误。

它适用于包含以下内容的文件:

[default]
aws_access_key_id=XXXXXXXXXXXXXX
aws_secret_access_key=YYYYYYYYYYYYYYYYYYYYYYYYYYY

请注意,必须有一个配置文件名称“[default]”。一些官方文档引用了一个名为“[credentials]”的配置文件,这对我不起作用。

【讨论】:

  • 也适用于 Windows (C:\Users\User\.aws\credentials)
  • 您可以使用 session = boto3.Session(profile_name=) 指定在 boto3 中使用哪个配置文件
  • 如果您安装了 aws-cli,也可以使用 aws configure
  • 我是通过 ansible 运行它的,所以要寻找的另一件事是,如果您在运行命令时成为不同的用户。例如,请确保您没有使用“sudo”来执行此操作,否则它将尝试访问 root aws 凭据,如果它们不存在则失败。
  • 您不需要有默认配置文件,您可以将环境变量 AWS_PROFILE 设置为您想要的任何配置文件(例如 credentialsexport AWS_PROFILE=credentials 并且当您执行您的代码,它将检查 AWS_PROFILE 值,然后它将从 .aws\credentials 文件中获取相应的凭证(在此示例中,它将搜索 credentials 配置文件
【解决方案3】:

如果您正在寻找替代方法,请尝试使用 AmazonCLI

从终端类型:-

aws configure

然后填写您的密钥和区域。

【讨论】:

    【解决方案4】:

    确保您在 Unix 中的 ~/.aws/credentials 文件如下所示:

    [MyProfile1]
    aws_access_key_id = yourAccessId
    aws_secret_access_key = yourSecretKey
    
    [MyProfile2]
    aws_access_key_id = yourAccessId
    aws_secret_access_key = yourSecretKey
    

    您的 Python 脚本应该如下所示,并且可以正常工作:

    from __future__ import print_function
    import boto3
    import os
    
    os.environ['AWS_PROFILE'] = "MyProfile1"
    os.environ['AWS_DEFAULT_REGION'] = "us-east-1"
    
    ec2 = boto3.client('ec2')
    
    # Retrieves all regions/endpoints that work with EC2
    response = ec2.describe_regions()
    print('Regions:', response['Regions'])
    

    来源:https://boto3.readthedocs.io/en/latest/guide/configuration.html#interactive-configuration

    【讨论】:

    • output = json 通常放在~/.aws/config[profile MyProfile1] 部分中。如果在 credentials 文件中指定,它可能不起作用。
    • @Curt J. Sampson 没有检查,我相信你是对的。谢谢指正。
    • 我确实导出了 AWS_PROFILE=myprofle,但它不起作用,但它起作用了。关于为什么会发生这种情况的任何解释。
    【解决方案5】:

    我也遇到了同样的问题,可以通过在主目录中创建配置和凭据文件来解决。下面显示了我为解决此问题所做的步骤。

    创建配置文件:

    touch ~/.aws/config
    

    我在那个文件中输入了该区域

    [default]
    region = us-west-2
    

    然后创建凭证文件:

    touch ~/.aws/credentials
    

    然后输入您的凭据

    [Profile1]
    aws_access_key_id = XXXXXXXXXXXXXXXXXXXX 
    aws_secret_access_key = YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY
    

    设置完所有这些,然后我的python文件来连接bucket。运行这个文件会列出所有的内容。

    import boto3
    import os
    
    os.environ['AWS_PROFILE'] = "Profile1"
    os.environ['AWS_DEFAULT_REGION'] = "us-west-2"
    
    s3 = boto3.client('s3', region_name='us-west-2')
    print("[INFO:] Connecting to cloud")
    
    # Retrieves all regions/endpoints that work with S3
    
    response = s3.list_buckets()
    print('Regions:', response)
    

    您也可以参考以下链接:

    【讨论】:

      【解决方案6】:

      使用您的凭据创建一个 S3 客户端对象

      AWS_S3_CREDS = {
          "aws_access_key_id":"your access key", # os.getenv("AWS_ACCESS_KEY")
          "aws_secret_access_key":"your aws secret key" # os.getenv("AWS_SECRET_KEY")
      }
      s3_client = boto3.client('s3',**AWS_S3_CREDS)
      

      从操作系统环境中获取凭据总是好的

      要设置环境变量,在终端中运行以下命令

      如果是 linux 或 mac

      $ export AWS_ACCESS_KEY="aws_access_key"
      $ export AWS_SECRET_KEY="aws_secret_key"
      

      如果窗口

      c:System\> set AWS_ACCESS_KEY="aws_access_key"
      c:System\> set AWS_SECRET_KEY="aws_secret_key"
      

      【讨论】:

      • 您还需要添加会话令牌和区域信息
      【解决方案7】:

      导出凭证也可以,在 linux 中:

      export AWS_SECRET_ACCESS_KEY="XXXXXXXXXXXX"
      export AWS_ACCESS_KEY_ID="XXXXXXXXXXX"
      

      【讨论】:

        【解决方案8】:

        从终端类型:-

        aws configure
        

        然后填写您的密钥和区域。

        在此之后执行下一步使用任何环境。根据您的帐户,您可以拥有多个密钥。可以管理多个环境或键

        import boto3
        aws_session = boto3.Session(profile_name="prod")
        # Create an S3 client
        s3 = aws_session.client('s3')
        

        【讨论】:

          【解决方案9】:

          这些说明适用于具有 AWS 单一用户配置文件的 Windows 机器。确保您的 ~/.aws/credentials 文件看起来像这样

          [profile_name]
          aws_access_key_id = yourAccessId
          aws_secret_access_key = yourSecretKey
          

          我必须将AWS_DEFAULT_PROFILE环境变量设置为您的凭据中的profile_name
          然后我的python能够连接。例如来自here

          import boto3
          
          # Let's use Amazon S3
          s3 = boto3.resource('s3')
          
          # Print out bucket names
          for bucket in s3.buckets.all():
              print(bucket.name)
          

          【讨论】:

          • 如果你在win10的机器部分设置环境变量,你可能也需要重新启动。
          • @Trevor,我在装有 Jupyter notebook 的 Windows 7 机器上测试了这个,我不得不重新启动 Jupyter 服务器,它对我有用,但我认为重新启动是个好主意。
          【解决方案10】:

          我在一家大公司工作,遇到了同样的错误,但需要不同的解决方法。我的问题与代理设置有关。我已经设置了代理,所以我需要将我的 no_proxy 设置为 AWS 白名单,然后才能让一切正常工作。如果您不想使用操作系统设置混淆 Python 代码,也可以在 bash 脚本中进行设置。

          Python:

          import os
          os.environ["NO_PROXY"] = "s3.amazonaws.com"
          

          重击:

          export no_proxy = "s3.amazonaws.com"
          

          编辑:以上假设为美国东部 S3 区域。对于其他区域:使用 s3.[region].amazonaws.com,其中区域类似于 us-east-1 或 us-west-2

          【讨论】:

          • 我遇到了类似的问题 - 但必须为 169.254.169.254no_proxy,以便 AWS 客户端可以访问元数据服务来查找实例配置文件。
          【解决方案11】:

          如果您在~/.aws/credentials 中有多个 aws 配置文件,例如...

          [Profile 1]
          aws_access_key_id = *******************
          aws_secret_access_key = ******************************************
          [Profile 2]
          aws_access_key_id = *******************
          aws_secret_access_key = ******************************************
          

          执行两个步骤:

          1. 在终端中使用export AWS_DEFAULT_PROFILE=Profile 1 命令将您想要用作默认设置。

          2. 确保在您使用 boto3 或打开编辑器的同一终端中运行上述命令。[了解以下场景]

          场景:

          • 如果您打开了两个终端,称为 t1t2
          • 如果您在 t1 中运行导出命令并从 t2 打开 JupyterLab 或任何其他命令,您将收到 NoCredentialsError: Unable to locate credentials 错误。

          解决方案:

          • t1 中运行导出命令,然后从同一终端t1 打开 JupyterLab 或任何其他命令。

          【讨论】:

            【解决方案12】:

            在 MLflow 的情况下,如果您无法写入 AWS3/MinIO 数据湖,则调用 mlflow.log_artifact() 将引发此错误。

            原因是没有在您的 python 环境中设置凭据(作为这两个环境变量):

            os.environ['DATA_AWS_ACCESS_KEY_ID'] = 'login'
            os.environ['DATA_AWS_SECRET_ACCESS_KEY'] = 'password'
            

            请注意,您也可以使用 minio 客户端直接访问 MLflow 工件(这需要与数据湖的单独连接,除了 mlflow 的连接)。这个客户端可以这样启动:

            minio_client_mlflow = minio.Minio(os.environ['MLFLOW_S3_ENDPOINT_URL'].split('://')[1],
                                access_key=os.environ['AWS_ACCESS_KEY_ID'],
                                secret_key=os.environ['AWS_SECRET_ACCESS_KEY'],
                                secure=False)
            

            【讨论】:

              【解决方案13】:

              我已经解决了这样的问题:

              aws configure
              

              后来我手动输入:

              AWS Access Key ID [None]: xxxxxxxxxx
              AWS Secret Access Key [None]: xxxxxxxxxx
              Default region name [None]: us-east-1
              Default output format [None]: just hit enter
              

              之后它对我有用

              【讨论】:

                【解决方案14】:

                boto3 正在寻找类似文件夹中的凭据

                C:\ProgramData\Anaconda3\envs\tensorflow\Lib\site-packages\botocore\.aws
                

                您应该在此文件夹中保存两个文件credentialsconfig

                您可能想查看 boto3 在this link 中搜索凭据的一般顺序。查看配置凭据子标题。

                【讨论】:

                  【解决方案15】:

                  如果您确定您的 aws 配置正确,只需确保该项目的用户可以从 ./aws 读取或仅以 root 身份运行您的项目

                  【讨论】:

                    【解决方案16】:

                    我刚遇到这个问题。这对我有用:

                    pip install botocore==1.13.20
                    

                    来源:https://github.com/boto/botocore/issues/1892

                    【讨论】:

                      猜你喜欢
                      • 2022-07-20
                      • 2020-06-03
                      • 2019-11-26
                      • 1970-01-01
                      • 1970-01-01
                      • 2021-04-25
                      • 2022-08-11
                      • 1970-01-01
                      • 1970-01-01
                      相关资源
                      最近更新 更多