放大发布导致 AccessDenied 错误

Amplify publish causes AccessDenied error

我通过 amplify publish 将一个简单的 Web 应用程序部署到 S3。托管已启用 Cloudfront(我在设置托管时在 amplify 中选择了 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 完成的,因此理论上应该可以工作:

云端:

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 小时。我仍然得到 "access denied".

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

我怎样才能放大以正确设置 S3 存储桶和 Cloudfront 以便我可以通过 Cloudfront URL 访问我的网站?

感谢您提供更多信息。

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

  • 关于 Origin Domain name or Path,它总是 S3 桶出现在下拉列表中,所以不需要用 region

    [= 更新它43=]
  • 但是您的 Cloudfront Origin 中缺少一项设置。
    你需要 select Restrict Bucket accessYes

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

  • 提供私有内容
  • 现在创建new Identityselect Existing Identity

  • 单击“创建”按钮以保存 Origin。

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

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

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

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

如果您键入 Amplify add hosting(或 Amplify update hosting 用于现有站点),Amplify 会为您提供 Hosting with Amplify Console.

的选项

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

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

{ "席德": "Allow-Public-Access-To-Bucket", "效果": "允许", "校长": "", “行动”:“s3:GetObject”, “资源”:[ “arn:aws:s3:::DOC-EXAMPLE-BUCKET/” ] }

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