3

stackoverflow でこれに関する多くの質問を見つけましたが、問題を解決したものはありません。多くのグーグル検索の後、まだ AccessDenied Exception に直面しています:

<Error>
<Code>AccessDenied</Code>
</Message><RequestId>ADF9C0DE6C86DF4F</RequestId>
<HostId>JwQLkNB0LuJvh0jwrsJe9wazxLsd+hrZ2qwvjCvmXYd2A/ckCrsotRMHm</HostId>
</Error>

ユーザーとグループのポリシー ドキュメントは次のとおりです。

ユーザー ポリシー:

{
"Statement":[
  {
     "Sid":"AllowListBucketIfSpecificPrefixIsIncludedInRequest",
     "Action":"s3:*",
     "Effect":"Allow",
     "Resource":["arn:aws:s3::: mybucket", "arn:aws:s3:::mybucket/*"],
     "Condition":{
        "StringLike":{"s3:prefix":["Development/*"]
        }
     }
  },
  {
    "Sid":"AllowUserToReadWriteObjectDataInDevelopmentFolder", 
    "Action":"s3:*",
    "Effect":"Allow",
    "Resource":["arn:aws:s3::: mybucket/Development/*"]
  },
  {
     "Sid": "ExplicitlyDenyAnyRequestsForAllOtherFoldersExceptDevelopment",
     "Action": ["s3:ListBucket"],
     "Effect": "Deny",
     "Resource": ["arn:aws:s3::: mybucket", "arn:aws:s3::: mybucket/*"],
     "Condition":{  "StringNotLike": {"s3:prefix":["Development/*"] },
                    "Null"         : {"s3:prefix":false }
      }
  }
]
}

グループ ポリシー:

{
"Statement": [
{
  "Sid": "AllowGroupToSeeBucketListAndAlsoAllowGetBucketLocationRequiredForListBucket",
  "Action": ["s3:ListAllMyBuckets", "s3:GetBucketLocation"],
  "Effect": "Allow",
  "Resource": ["arn:aws:s3:::*"]
},
{
  "Sid": "AllowRootLevelListingOfCompanyBucket",
  "Action": ["s3:ListBucket"],
  "Effect": "Allow",
  "Resource": ["arn:aws:s3::: mybucket", "arn:aws:s3::: mybucket/*"],
  "Condition":{
      "StringEquals":{"s3:prefix":[""]}
   }
},
{
  "Sid": "RequireFolderStyleList",
  "Action": ["s3:ListBucket"],
  "Effect": "Deny",
  "Resource": ["arn:aws:s3:::*"],
  "Condition":{
      "StringNotEquals":{"s3:delimiter":"/"}
   }
 },
{
  "Sid": "ExplictDenyAccessToPrivateFolderToEveryoneInTheGroup",
  "Action": ["s3:*"],
  "Effect": "Deny",
  "Resource":["arn:aws:s3:::mybucket/Private/*"]
},
{
  "Sid": "DenyListBucketOnPrivateFolder",
  "Action": ["s3:ListBucket"],
  "Effect": "Deny",
  "Resource": ["arn:aws:s3:::*"],
  "Condition":{
      "StringLike":{"s3:prefix":["Private/"]}
   }
}
]
}

ユーザー名 - testuser でユーザーを作成し、この IAM ユーザーの access_key と secret_access_key を取得しました。これで、AWS Web コンソールと Cyber​​duck を使用して mybucket とそのサブフォルダーにアクセスできるようになりました。

しかし、 boto を使用してアクセスしようとすると、AccessDenied Exception (エラー 403) が発生します。

ボトコード:

<!-- language: python -->
from boto.s3.connection import S3Connection
connect = S3Connection('_______________________','_____________________')
# Without Validate
bucket = conn.get_bucket('mybucket', validate=False) #here got bucket object
bucket.get_key('one/two/three.png') # AccessDenied


#With Validate
bucket = conn.get_bucket('mybucket') #AccessDenied

boto-rsyncを使用しようとしたときにも同じ問題に直面しました。

助言がありますか ??

4

1 に答える 1

5

エラー 403 は Access Denied を意味するため、認証に問題があります。API 呼び出しと応答を分析するには、次の行を使用できます。

boto.set_stream_logger('boto')

私が気づいたいくつかの点:

  • 「mybucket」の前の先頭のスペースが削除されているため、グループとユーザーのルールは問題ありません
  • 最初のディレクトリ名は「one」ではなく「Development」です
  • 「検証なし」は、ファイルに直接アクセスすることを意味します

次のコードは正常に動作します。

import boto
conn = boto.connect_s3("id","secret")
bucket = conn.get_bucket('mybucket', validate=False)
bucket.get_key('Development/two/three.png')
# <Key: mybucket,Development/two/three.png>

しかし、私は IAM を初めて使用し、「With Validate」は最初に「/mybucket/」を読み取ろうとするようですが、ユーザー ポリシー ExplicitlyDenyAnyRequestsForAllOtherFoldersExceptDevelopment によって拒否されます。

「開発内のすべてのキーにアクセスするには」とコメントするように編集して、これを試してください::

list = bucket.list("Development/",delimiter="/")
for key in list:
    print key.name
于 2013-12-18T12:34:12.677 に答える