当前位置: 首页 > 知识库问答 >
问题:

Boto3不从凭据中承担IAM角色,而aws-cli没有问题

羊和光
2023-03-14

我正在设置一些文件传输脚本,并正在使用boto3来做这件事。

我需要从本地发送一些文件到第三方AWS帐户(跨帐户)。我在另一个帐户上设置了一个角色,具有写入桶的权限,并将此角色分配给了我帐户上的一个用户。

我可以在CLI上做到这一点,但Boto一直在为桶踢出一个AccessDenied错误。

[myuser]
aws_access_key_id = XXXXXXXXXXXXXXXXXXXXXX
aws_secret_access_key = XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
[profile crossaccount]
region = eu-west-2
source_profile=myuser
role_arn = arn:aws:iam::0123456789:role/crossaccountrole
    #set-up variables
    bucket_name = 'otheraccountbucket'
    file_name = 'C:\\Users\\test\\testfile.csv'
    object_name = 'testfile.csv'

    #create a boto session with profile name for assume role call to be made with correct credentials
    session = boto3.Session(profile_name='crossaccount')
    #Create s3_client from that profile based session
    s3_client = session.client('s3')

    #try and upload the file
    response = s3_client.upload_file(
                    file_name, bucket, object_name,
                    ExtraArgs={'ACL': 'bucket-owner-full-control'}
                )

编辑:作为对John的多部分权限评论的回应,我尝试通过put_object方法上传以绕过此操作-但仍然被访问,但现在是在PutObject权限上-我已经确认它是正确的:-

    #set-up variables
    bucket_name = 'otheraccountbucket'
    file_name = 'C:\\Users\\test\\testfile.csv'
    object_name = 'testfile.csv'

    #create a boto session with profile name for assume role call to be made with correct credentials
    session = boto3.Session(profile_name='crossaccount')
    #Create s3_client from that profile based session
    s3_client = session.client('s3')

    #try and upload the file
    with open(file_name, 'rb') as fd:
            response = s3_client.put_object(
                                ACL='bucket-owner-full-control',
                                Body=fd,
                                Bucket=bucket,
                                ContentType='text/csv',
                                Key=object_name
                            )

Crossaccountrole具有PutObject权限-错误为:-

An error occurred (AccessDenied) when calling the PutObject operation: Access Denied

结束编辑

aws s3 cp "C:\Users\test\testfile.csv" s3://otheraccountbucket --profile crossaccount

我希望它能像等效的cli代码那样正确上传,但相反,我得到了一个S3UploadFailedError异常--在调用CreateMultipartUpload操作时发生了一个错误(AccessDenied):Access Denied

如有任何帮助,将不胜感激

共有1个答案

阎麒
2023-03-14

我也有同样的问题,我的问题最终是,我用不同的凭据配置了AWS CLI,而不是我的python应用程序,我试图使用Boto3将文件上传到s3 bucket中。

以下是对我有效的方法,这只适用于安装了AWS CLI的人:

  1. 打开命令行或终端
  2. 键入AWS配置
  3. 在出现提示时,输入您为python boto3应用程序使用的IAM用户的ID和密钥
  4. 运行您的python应用程序并测试boto3,您应该不会再得到访问拒绝消息
 类似资料:
  • 在我们的应用程序中,我们使用自定义角色访问aws API。在开发者环境中,我们在app.config中提供访问密钥和秘密密钥,它工作得很好。 在prod环境中,我们设置了一个IAM角色,该角色对自定义角色具有必要的权限,EC2实例将使用该IAM角色启动。当我们尝试使用代码切换角色时,我们会遇到以下错误 消息:用户:arn:aws:sts::XXXXXXXXX:假定角色//i-0490fbbb5ea

  • 是否可以将IAM角色链接到Cognito用户池中Cognito用户的Cognito组? 我的配置: Cognito用户池: 认知用户属于 认知组已分配给. null null 这段代码允许我对Cognito用户池进行身份验证: 然后从cognito标识池中获取链接到cognito用户池的凭据:

  • 获取错误 引起原因:org.springframework.beans.BeanInstantiationExc0019:未能实例化[software.amazon.awssdk.services.dynamodb.DynamoDbClient]:工厂方法'amazonDynamoDB'抛出异常;嵌套异常java.lang.NullPointerExc0019: STS客户端不得为空。atspri

  • 问题内容: 我有两个AWS账户-假设A和B. 在帐户B中,我定义了一个角色,该角色允许从帐户A中访问另一个角​​色。我们称其为角色B 在帐户A中,我定义了一个角色,该角色允许root用户承担角色。让我们称之为角色A 角色A附加了以下策略 作为帐户A的用户,我担任角色A。现在使用此临时凭据,我想承担角色B并访问帐户B拥有的资源。我有以下代码 该代码适用于我从客户端获得的一组角色,但不适用于我在我有权

  • 创建了一个Java应用程序并部署在EC2实例中,将EC2实例配置文件角色与实例相关联 通过AWS调用AWS API时JavaSDK V2以及V1得到以下错误 无法从系统设置加载凭据。必须通过环境变量(AWS_Access_key_ID)或系统属性(AWS.accessKeyId)指定访问密钥。 是否有任何与权限/设置相关的内容 注意:我不想在应用程序中使用访问密钥和密钥,我想使用STS承担角色

  • 我尝试将该角色用作: 但我得到了一个错误: 因此,IAM的角色似乎无法取代 根据http://boto3.readthedocs.io/en/latest/guide/configuration.html 我仍然需要使用密钥,这可能会带来安全风险,即使没有在代码中使用 有没有一种方法可以在不使用aws API凭据的情况下使用具有管理员权限的boto3? 所以基本上: > #!/usr/bin/en