首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >"aws s3 ls“和"aws s3api list-objects”的不同行为

"aws s3 ls“和"aws s3api list-objects”的不同行为
EN

Stack Overflow用户
提问于 2013-12-05 07:14:27
回答 2查看 7.2K关注 0票数 7

我看到了aws、s3 ls、aws s3api list-bucket的不同行为。

这是第一个:

代码语言:javascript
复制
$ aws s3 ls s3://demo.for.customers

Bucket: demo.for.customers
Prefix: 

      LastWriteTime     Length Name
      -------------     ------ ----
                           PRE 5CE4D191-FD14-4C85-8146-9FB8C29B7A7B/
                           PRE FFBC4675-F864-40E9-8AB8-BDF7A0437010/

因此,我能够列出桶demo.for.customers中的对象

现在,当我使用s3api运行相同的操作时,访问被拒绝:

代码语言:javascript
复制
$ aws s3api list-objects --bucket demo.for.customers
A client error (AccessDenied) occurred: Access Denied

问题:为什么要拒绝通过s3api列出对象的访问。

我提出这个问题的原因是,如果我使用AWS S3 Ruby ,就会遇到同样的问题。

但是,当我使用aws s3 ls时,一切都很好。

因此,AWS S3 Ruby aws s3api表现出了相同的行为。因此,我只粘贴aws s3api CLI问题。

顺便说一句,下面是应用于运行上述所有命令的用户的IAM策略:

代码语言:javascript
复制
{
  "Statement": [
    {
      "Action": [
        "s3:ListAllMyBuckets",
        "s3:GetBucketLocation"
      ],
      "Effect": "Allow",
      "Resource": [
        "arn:aws:s3:::"
      ]
    },
    {
      "Action": [
        "s3:ListBucket"
      ],
      "Effect": "Allow",
      "Resource": [
        "arn:aws:s3:::demo.for.customers"
      ],
      "Condition": {
        "StringEquals": {
          "s3:prefix": [
            "",
            "FFBC4675-F864-40E9-8AB8-BDF7A0437010/"
          ],
          "s3:delimiter": [
            "/"
          ]
        }
      }
    },
    {
      "Effect": "Allow",
      "Action": [
        "s3:PutObject",
        "s3:GetObject",
        "s3:DeleteObject"
      ],
      "Resource": [
        "arn:aws:s3:::demo.for.customers/FFBC4675-F864-40E9-8AB8-BDF7A0437010/"
      ]
    }
  ]
}

这是红宝石代码,它产生完全相同的错误;

代码语言:javascript
复制
#!/usr/bin/ruby

require 'aws-sdk'
require 'awesome_print'
AWS.config( :access_key_id      => 'whatever', 
            :secret_access_key  => 'again whatever',
            :region             => 'us-west-2')

s3 = AWS.s3
buckets = s3.client.list_objects(:bucket_name => "demo.for.customers")
ap buckets

产出如下:

代码语言:javascript
复制
# ruby s3policies.rb 
/var/lib/gems/1.9.1/gems/aws-sdk-1.14.1/lib/aws/core/client.rb:366:in `return_or_raise': Access Denied (AWS::S3::Errors::AccessDenied)
EN

回答 2

Stack Overflow用户

发布于 2014-11-22 04:55:44

根据您定义的角色,对列表对象的调用同时需要前缀和分隔符。

下面的命令将适用于您:

代码语言:javascript
复制
aws s3api list-objects --bucket demo.for.customers --prefix "" --delimiter "/"

如果您在ListBucket策略中移除分隔符条件,那么这将适用于您:

代码语言:javascript
复制
aws s3api list-objects --bucket demo.for.customers --prefix ""

如果您还删除了前缀条件,那么这将适用于您:

代码语言:javascript
复制
aws s3api list-objects --bucket demo.for.customers

测试上述内容的一个好方法是复制您的角色策略,并逐步删除条件,直到它按预期的方式运行为止。

票数 4
EN

Stack Overflow用户

发布于 2016-01-12 06:43:13

确保从运行此实用程序的位置(目录)设置了正确的权限。

目录应该具有正确的所有权(所有者应该是运行此实用程序的用户,而不是根用户或任何其他用户),并且拥有创建目录的足够权限。

票数 -2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20393722

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档