O probrema
Como todos sabem já tinha um tempo que eu havia migrado a maioria dos meus projetos para arquivos com markdown. O último deles que ainda está em Wordpress é o Louco por Android que, pelo tamanho gerou uma série de problemas para que eu o migrasse para o Hugo ou Jekyll.
A estrutura que eu iria precisar para colocar ele, pelo menos na primeira build, aqui, seria assustador. E, portanto, eu acabei focando neste aqui.
Aliás, nem foi foco, vamos ser sinceros, né ? Foi necessidade. O site rodava em uma versão antiga para caramba do Drupal, e, no fim, foi invadido. Como eu já estava sem saco de manter um CMS, optei pelo Hugo. E, sinceridade ? Foi minha melhor escolha.
Como eu estou num processo muito grande de migrar para DevOps e, no trabalho estava tendo uma necessidade de estudo de CI/CD montei um para este blog e, também, criei uma estrutura na AWS. Aliás, uma boa escolha pois a estrutura inteira está custando por volta de US$3,00.
E no processo eu tive aquela necessidade. Um bucket s3 para hospedar meus arquivos (html, css, imagens, áudios, etc ) que só pudesse ser acessado diretamente pelo Cloudfront .
E, pesquisando, cai no blog que está de referência lá no final do artigo que inclusive, cita outro post no Reddit ( também lá no final do post ) que conseguiu resolver o problema.
O caminho
A solução em si é bem interessante, até porque por ser uma nuvem muito antiga a AWS tem quase tudo mapeado.
O Cloudfront permite que possamos injetar alguns cabeçalhos personalizados na solicitação ao bucket ou qualquer outro tipo de solução abaixo.
A idéia neste caso é conseguir mandar uma sequência bem longa ( e bem aleatória também ) para o bucket e, na sua política ele conseguir validar todas as solicitações que ele recebe ( para quem notou é bem parecido com uma autenticação com senha ).
E o legal é que o Cloufront em sua documentação fornece uma série de cabeçalhos personalizados que podem ser usados e, que, também podem ser referenciados na política do Bucket.
No Reddit o carinha usou o referer, que foi uma dica do pessoal da Amazon. Mas, na solução que eu segui, o usado foi o User-Agent ( que é o aws:UserAgent na política do Bucket ).
A solução
Primeiro, você terá que ir no seu Cloudfront e criar um cabeçalho User-Agent com o valor que você queira ( referenciado abaixo como UmaStringBemLongaPorFavor ).
Ai no seu bucket, que eu espero que você tenha configurado como public e colocado uma política mais ou menos assim :
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "PublicReadGetObject",
"Effect": "Allow",
"Principal": "*",
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::example-bucket/*"
}
]
}
E, finalmente, esta será a política que irá resolver o problema do seu blog :
{
"Version": "2012-10-17",
"Statement": [
{
"Action": [
"s3:GetObject"
],
"Effect": "Allow",
"Principal": "*",
"Resource": [
"arn:aws:s3:::my-static-site.example.com"
],
"Condition": {
"StringEquals": {
"aws:UserAgent": "VeryLongVeryRandomStringHere"
}
}
}
]
}
E ter sua estrutura online tal qual este blog aqui está.
Via A Brige to /dev/null and Reddit