AWS CloudFront 编程访问导致 AccessDenied,没有任何解释

AWS CloudFront programmatic access results in AccessDenied with no explanation

我正在按照本指南 here 使用 cloudfront cdn 在 aws s3 上设置静态 nuxtjs 站点。

向导的每一步都成功了。我可以从 url 访问我网站的测试图像。但是,以编程方式访问 CloudFront 发行版的指南的最后一步给我以下错误:

我已验证程序化用户的政策是准确的:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "s3:ListBucket"
            ],
            "Resource": [
                "arn:aws:s3:::bucket"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "s3:PutObject",
                "s3:PutObjectAcl",
                "s3:GetObject",
                "s3:GetObjectAcl",
                "s3:DeleteObject",
                "s3:ListMultipartUploadParts",
                "s3:AbortMultipartUpload"
            ],
            "Resource": [
                "arn:aws:s3:::bucket/*"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "cloudfront:CreateInvalidation",
                "cloudfront:GetInvalidation",
                "cloudfront:ListInvalidations",
                "cloudfront:UnknownOperation"
            ],
            "Resource": "*"
        }
    ]
}

为什么我会得到 AccessDenied?我什至尝试为 CloudFront/S3 打开 * 的操作,但仍然被拒绝了。我已验证我的 secret/access 密钥也与程序化用户与策略相匹配。

有没有什么方法可以让我得到更具体的错误消息,说明出了什么问题?

更新:错误似乎发生在 gulpfile 中的以下操作之一期间:

g = g.pipe(cloudfront(config));

// create a cache file to speed up consecutive uploads
g = g.pipe(publisher.cache());

// print upload updates to console
g = g.pipe(awspublish.reporter());

我想我会梳理 aws publisher 插件来寻找它们。也许该指南已过时并忘记了权限。

解决了。 NuxtJS 指南所依赖的创建 CDN/S3 的指南让您创建一个私有存储桶,但他们的 gulpfile 中的设置是针对 public-read 存储桶的。

要解决此错误,您只需添加:

'x-amz-acl': 'private'

到您的 gulpfile 中的 headers。

编辑:我还要说的是,这篇文章对另一篇文章的依赖是造成混乱的根源。另一篇文章是关于设置一个私有存储桶,其内容可以像 cdn 一样通过 CloudFront 访问。但我发现仅使用特定于存储桶的选项来托管静态站点(使其 public)更容易。