放大发布导致 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 完成的,因此理论上应该可以工作:
云端:
- 源域名或路径:
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 小时。我仍然得到 "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 access
到 Yes
根据AWS documentation
如果您希望要求用户始终使用 CloudFront URL 而不是 Amazon S3 URL 访问您的 Amazon S3 内容,请单击“是”。当您使用签名 URL 或签名 cookie 来限制对您的内容的访问时,这很有用。在帮助中,请参阅“通过 CloudFront
提供私有内容
现在创建new Identity
或select 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/
我通过 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 完成的,因此理论上应该可以工作:
云端:
- 源域名或路径:
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 小时。我仍然得到 "access denied".
我怀疑这与 S3
存储桶不在默认 us-east-1
区域中有关,并且在这种情况下放大没有正确设置 Cloudfront
。
我怎样才能放大以正确设置 S3
存储桶和 Cloudfront
以便我可以通过 Cloudfront
URL 访问我的网站?
感谢您提供更多信息。
您的 S3
存储桶策略看起来不错。
关于
[= 更新它43=]Origin Domain name or Path
,它总是S3
桶出现在下拉列表中,所以不需要用region
但是您的
Cloudfront Origin
中缺少一项设置。
你需要 selectRestrict Bucket access
到Yes
根据
AWS documentation
如果您希望要求用户始终使用 CloudFront URL 而不是 Amazon S3 URL 访问您的 Amazon S3 内容,请单击“是”。当您使用签名 URL 或签名 cookie 来限制对您的内容的访问时,这很有用。在帮助中,请参阅“通过 CloudFront 提供私有内容
现在创建
new Identity
或select 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/