Tenho trabalhado em um aplicativo da web que quer recuperar um arquivo CSS (ativos FontAwesome auto-hospedados), atualmente hospedado no Amazon S3. A tag import se parece com o seguinte:
<link rel="stylesheet" href="https://docsbymario-env.s3.eu-north-1.amazonaws.com/fontawesome/css/all.min.css?v=1.0">
No entanto, ao olhar para o console, recebo um código de status 403 Proibido na GET
solicitação.
Minhas políticas de bucket permitem explicitamente solicitações vindas das máquinas EC2 que hospedam o site (criado pelo meu ambiente Beanstalk), e também para alguma função IAM (para CodePipeline). As declarações de política se parecem com isto:
{
"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"
]
}
}
}
]
}
Os dois endereços IP acima são os endereços IP públicos das instâncias do EC2 nas quais desejo carregar o script CSS.
Também habilitei o acesso público ao meu bucket S3. O CodePipeline pode acessar o bucket corretamente por meio da função, mas o EC2 não pode, usando as duas últimas políticas de bucket baseadas em IP.
Pensei que também poderia estar relacionado ao CORS, então tentei adicionar políticas CORS ao intervalo:
[
{
"AllowedHeaders": [
"*"
],
"AllowedMethods": [
"GET"
],
"AllowedOrigins": [
"http://docsbymario.com",
"http://api.docsbymario.com"
],
"ExposeHeaders": [
"ETag"
],
"MaxAgeSeconds": 3000
}
]
... onde os dois nomes de domínio realmente apontam para esses dois endereços IP públicos. Nenhuma mudança, no entanto.
Qual poderia ser o problema?