【问题标题】:Amplify publish causes AccessDenied error放大发布导致 AccessDenied 错误
【发布时间】:2020-01-20 12:05:05
【问题描述】:

我通过amplify publish 将一个简单的网络应用程序部署到S3。主机启用了Cloudfront(我在设置主机时选择了放大的PROD环境)并且我在eu-central-1区域工作。但每当我尝试访问Cloudfront URL 时,都会收到AccessDenied 错误。

我遵循https://medium.com/quasar-framework/creating-a-quasar-framework-application-with-aws-amplify-services-part-1-4-9a795f38e16d 的教程,唯一不同的是区域(教程使用us-east-1,而我使用eu-central-1)。

S3 和 Cloudfront 的配置是通过 amplify 完成的,所以理论上应该可以工作:

云端:

  • 源域名或路径:quasar-demo-hosting-bucket-dev.s3-eu-central-1.amazonaws.com(原本是没有eu-central-1的,但是我手动添加的,后来失效了)。
  • 来源ID:hostingS3Bucket
  • 来源类型:S3 Origin

S3 存储桶政策:

{
    "Version": "2012-10-17",
    "Id": "MyPolicy",
    "Statement": [
        {
            "Sid": "APIReadForGetBucketObjects",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::cloudfront:user/CloudFront Origin Access Identity ********"
            },
            "Action": "s3:GetObject",
            "Resource": "arn:aws:s3:::quasar-demo-hosting-bucket-dev/*"
        }
    ]
}

研究表明,Cloudfront 在其他地区访问 S3 存储桶时可能会出现暂时性问题。但我手动将区域添加到Cloudfront 的原点,我已经等了 24 小时。我仍然收到“拒绝访问”。

我怀疑这与 S3 存储桶不在默认 us-east-1 区域中有关,并且在这种情况下无法正确设置 Cloudfront

我如何才能正确设置S3 存储桶和Cloudfront,以便我可以通过Cloudfront URL 访问我的网站?

【问题讨论】:

  • 能否分享一下您的 S3 和 Cloudfront 分发配置。
  • 我将信息添加到问题@RajPaliwal。一切都是通过amplify 自动配置的。我唯一更改的(在它不起作用之后)是将eu-central-1 部分添加到 Cloudfront 中配置的 S3 路径。

标签: amazon-web-services amazon-s3 amazon-cloudfront aws-amplify


【解决方案1】:

对于第一个解决方案不起作用的人,还要确保您的project-config.json 文件中的javascript.config.DistributionDir 配置正确。这也可能导致 AccessDenied 错误(正如我刚刚学到的那样)。

Amplify 期望您的应用入口点 (index.html) 位于您配置的目录中的第一级。因此,如果您接受放大默认配置 (dist) 并使用将构建文件置于层次结构中更深层次的项目(在角度 8 的情况下为dist/<project name>),则它表现为 403 AccessDenied 错误发表后。放大和 s3 托管选项都是如此。

文档:https://docs.aws.amazon.com/amplify/latest/userguide/manual-deploys.html(见末尾)

【讨论】:

  • 所以要解决这个问题,编辑amplify/.config/project-config.json并将其更新为:"DistributionDir": "dist/<project_name>"
【解决方案2】:

虽然@raj-paliwal 的回答极大地帮助我解决了我最初的问题,但 Amplify 已经用一个新选项解决了这个问题。

如果您输入Amplify add hosting(或Amplify update hosting 用于现有网站),Amplify 会为您提供Hosting with Amplify Console 选项。

选择此选项还将使用 S3 和 CloudFront 创建一个托管环境,但 Amplify 将为您管理一切。有了这个选项,我完全没有问题。看来这第一个选项修复了我遇到的错误。

如果您想将现有站点从手动 CloudFront 和 S3 托管升级到 Hosting with Amplify Console,您必须致电 amplify update hosting 并选择新选项。

【讨论】:

    【解决方案3】:

    感谢您提供更多信息。

    您的 S3 存储桶策略看起来不错。

    • 关于Origin Domain name or Path,下拉列表中始终显示S3,因此无需使用region更新它

    • 但是,您的Cloudfront Origin 中缺少一项设置。
      你需要选择Restrict Bucket accessYes

      根据AWS documentation
      如果您希望用户始终使用 CloudFront URL 而不是 Amazon S3 URL 访问您的 Amazon S3 内容,请单击是。当您使用签名 URL 或签名 cookie 来限制对您的内容的访问时,这很有用。在帮助中,请参阅“通过 CloudFront 提供私有内容

    • 现在创建new Identityselect Existing Identity

    • 点击创建按钮保存原点。

    【讨论】:

    • 太棒了!非常感谢您的详细解释。现在它起作用了。所以他们没有设置Restricted Bucket Access似乎是放大的一个错误——我会向他们报告。
    • @morgler 你举报了吗?你有他们回复的链接吗?我也遇到了同样的问题。
    • @cyrf 我没有报告。在我看来,Amplify 距离生产使用还有很长的路要走。在过去的 12 个月里,他们一直在努力解决许多问题,我决定离开 Amplify。我现在使用 serverless.com 来设置我的环境。我只能希望 Amplify 有朝一日可以投入生产。
    • @morgler 我不确定你们在哪里遇到此错误,但 8 个月后,我仍然面临同样的问题。该死的,放大。
    • @morgler 哦,非常感谢您的意见。事实上,我在几个小时前就开始工作了。
    【解决方案4】:

    { "Sid": "允许公共访问桶", “效果”:“允许”, “校长”:“”, "动作": "s3:GetObject", “资源”:[ “arn:aws:s3:::DOC-EXAMPLE-BUCKET/” ] }

    已解决:将此添加到存储桶策略 https://aws.amazon.com/premiumsupport/knowledge-center/s3-website-cloudfront-error-403/

    【讨论】:

    • 正如目前所写,您的答案尚不清楚。请edit 添加其他详细信息,以帮助其他人了解这如何解决所提出的问题。你可以找到更多关于如何写好答案的信息in the help center
    猜你喜欢
    • 2011-04-11
    • 2018-11-06
    • 1970-01-01
    • 1970-01-01
    • 2020-11-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-16
    相关资源
    最近更新 更多