我一直在开发一个 Web 应用程序,它想要检索 CSS 文件(自托管 FontAwesome 资产),该文件目前位于 Amazon S3 上。导入标签如下所示:
<link rel="stylesheet" href="https://docsbymario-env.s3.eu-north-1.amazonaws.com/fontawesome/css/all.min.css?v=1.0">
但是,查看控制台,我在请求中得到了403 Forbidden状态代码GET
。
我的存储桶策略明确允许来自托管网站的 EC2 计算机(由我的 Beanstalk 环境创建)以及某些 IAM 角色(用于 CodePipeline)的请求。策略声明如下所示:
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "AllowListBucketToRole",
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::390527449299:role/DocsByMarioRole"
},
"Action": "s3:ListBucket",
"Resource": "arn:aws:s3:::docsbymario-env"
},
{
"Sid": "AllowReadAccessToRole",
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::390527449299:role/DocsByMarioRole"
},
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::docsbymario-env/*"
},
{
"Sid": "AllowListBucketToIPs",
"Effect": "Allow",
"Principal": "*",
"Action": "s3:ListBucket",
"Resource": "arn:aws:s3:::docsbymario-env",
"Condition": {
"IpAddress": {
"aws:SourceIp": [
"13.51.220.94/32",
"16.16.36.18/32"
]
}
}
},
{
"Sid": "AllowReadAccessToIP",
"Effect": "Allow",
"Principal": "*",
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::docsbymario-env/*",
"Condition": {
"IpAddress": {
"aws:SourceIp": [
"13.51.220.94/32",
"16.16.36.18/32"
]
}
}
}
]
}
上面的两个 IP 地址是我要将 CSS 脚本加载到的 EC2 实例的公网 IP 地址。
我还启用了对我的 S3 存储桶的公共访问。CodePipeline 可以通过角色正确访问存储桶,但 EC2 无法使用最后两个基于 IP 的存储桶策略。
我认为这也可能与 CORS 有关,因此我尝试将 CORS 策略添加到存储桶中:
[
{
"AllowedHeaders": [
"*"
],
"AllowedMethods": [
"GET"
],
"AllowedOrigins": [
"http://docsbymario.com",
"http://api.docsbymario.com"
],
"ExposeHeaders": [
"ETag"
],
"MaxAgeSeconds": 3000
}
]
... 这两个域名实际上指向这两个公共 IP 地址。但是没有变化。
可能存在什么问题?