【问题标题】:Amazon S3 upload failed - access deniedAmazon S3 上传失败 - 访问被拒绝
【发布时间】:2019-02-03 10:57:53
【问题描述】:

我正在尝试通过 AWS Amplify 将文件上传到现有的 s3 存储桶。
我没有使用 AWS MobileHub
我根据this guide 创建了新的身份池,最后这是我对这个角色的政策:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "VisualEditor0",
            "Effect": "Allow",
            "Action": [
                "s3:*",
                "mobileanalytics:PutEvents",
                "cognito-sync:*"
            ],
            "Resource": "*"
        }
    ]
}

在我的代码中,我将 Amplify 配置如下:

Amplify.configure({
  'aws_cognito_identity_pool_id': 'us-east-2:f37baa...',
  'aws_cognito_region': 'us-east-2',
  'aws_user_files_s3_bucket': 'demo',
  'aws_user_files_s3_bucket_region': 'us-east-1',
});

我得到了错误:

Error: Access Denied
    at Request.extractError (s3.js:580)
    at Request.callListeners (aws-sdk-core-react-native.js:3610)
    at Request.emit (aws-sdk-core-react-native.js:3582)
    at Request.emit (aws-sdk-core-react-native.js:7723)
    at Request.transition (aws-sdk-core-react-native.js:7062)
    at AcceptorStateMachine.runTo (aws-sdk-core-react-native.js:7867)
    at aws-sdk-core-react-native.js:7879
    at Request.<anonymous> (aws-sdk-core-react-native.js:7078)
    at Request.<anonymous> (aws-sdk-core-react-native.js:7725)
    at Request.callListeners (aws-sdk-core-react-native.js:3620)



更新

import Amplify from 'aws-amplify';
import { Storage } from 'aws-amplify';

Amplify.configure({
  'aws_cognito_identity_pool_id': 'us-east-2:f37...',
  'aws_cognito_region': 'us-east-2',
  'aws_user_files_s3_bucket': 'demo',
  'aws_user_files_s3_bucket_region': 'us-east-1',
});

export default class App extends Component<Props> {
...
uploadImage = async uri => {
    const fileName = 'example.jpg';
    await Storage.put(fileName, blob, {
      contentType: 'image/jpeg',
      level: 'public'
    }).then(data => console.log(data))
      .catch(err => console.log(err))

这是整个代码,我只是没有添加文件来获取,但它确实有效。 当我使用移动集线器aws-exports.js 时,我可以上传文件,但 MobileHub 会创建一些存储桶,而我的用例涉及使用我现有的存储桶。

【问题讨论】:

  • 你确定这个错误是关于 S3 的吗?堆栈跟踪中没有任何显示。您可以将代码提取添加到问题中吗?另外:“演示”桶是你的吗?存储桶名称是全球唯一的,如果您有一个名为 "demo" 的存储桶,我会感到惊讶。命令“aws s3 ls --region us-east-1”将列出您的存储桶。我敢打赌,您正在尝试访问不属于您的存储桶。
  • 我更新了问题。如果我添加移动集线器并从中导出配置,它可以工作,但它会创建一些额外的存储桶,我需要将放大添加到现有项目。没有“演示”只是虚拟的,例如它有不同的名称。我应该在哪里输入该命令?

标签: amazon-web-services react-native amazon-s3 aws-amplify


【解决方案1】:

如果我理解得很好,您的代码是在尝试访问现有的 S3 存储桶,而不是由 Amplify / Mobile Hub 创建的存储桶?

如果我是正确的,您需要更新 Cognito 策略以授予您的用户对现有 S3 存储桶的访问权限。

IAM -&gt; Roles 控制台中,您会发现 Amplify 创建的两个角色。角色名称为 YOUR_PROJECT____DATE_TAG___[un]authrole 例如在我的控制台中:photoalbums-20190202155011-unauthRolephotoalbums-20190202155011-authRole

根据您是要授予已认证用户还是未认证用户的访问权限,修改适当的角色,或者如果您希望已认证用户和未认证用户都可以访问 S3,请修改相应的角色。

添加 S3 托管策略 AmazonS3ReadOnlyAccess 将授予您的用户对您的存储桶的只读访问权限。 (请不要添加AmazonS3FullAccesss3:*,因为它会让您的用户创建和删除您帐户上的存储桶和对象)

【讨论】:

  • “由放大创建的角色”是什么意思?从放大我只是将它安装在我的项目中
  • Amplify 是一个命令行工具,用于配置云资源和一个库,可在您的前端应用程序中使用以轻松访问这些资源。请查看 amplify 的“入门”部分以了解如何使用它aws-amplify.github.io/docs/js/… 如果您尝试将 Amplify 库与您自己的后端服务一起使用,您将需要手动配置许多服务,从而导致潜在的错误。如果您在代码中使用 Amplify,让它也更容易创建您的云资源。
  • 您在问题开始时发布的角色似乎还可以(尽管过于宽松,但获得这些权限的实体将可以在 S3 上执行一切,包括更改权限和删除东西,这可能不是你的意思)。这个角色附属于什么实体?您如何将此角色附加到您的代码/用户?我猜您正在使用 Cognito 用户池来验证您的用户。 cognito 用户如何获得您列出的权限?
  • 我认为使用 amplify 插件和上传文件会更容易。我将继续使用预签名的网址。我认为最好有太多的配置围绕这个
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-09-18
  • 2017-08-04
  • 2012-10-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-17
相关资源
最近更新 更多