Meu objetivo
Tenho vários domínios (por exemplo, 10 ou 20) e gostaria de redirecionarqualquervisitantes paraem qualquer lugarnessas páginas para uma página em outro domínio (por exemplo, minha página de perfil stackoverflow.com).
Isso inclui
- domínio apex usando
http
(por exemplohttp://mydomain01.com
) - domínio apex usando
https
(por exemplohttps://mydomain01.com
) - subdomínios usando
http
(por exemplo,http://www.mydomain01.com
ouhttp://blog.mydomain01.com
) - subdomínios usando
https
(por exemplo,https://www.mydomain01.com
ouhttps://blog.mydomain01.com
) - quaisquer caminhos (por exemplo,
http://mydomain01.com/some_path
ouhttps://www.mydomain01.com/another/path.html
)
mais o mesmo para todos os meus outros domínios ( mydomain02.com
, mydomain03.com
, etc .; cada um com os casos de uso acima).
Minha pesquisa
- Este artigo da AWSexplica como redirecionar o tráfego da Internet de um domínio Apex para outro domínio (caso nº 1 no meuIsso incluilista acima) usandoAWS S3eAWS Rota 53: Isso funciona para
http
, mas não parahttps
. - Este artigo da AWSexplica como redirecionar o tráfego da Internet para vários casos (pelo que parece, cobrindo todos os casos no meuIsso incluilista acima) usandoAWS S3,AWS Rota 53eAWS CloudFront: Isso funciona para ambos
http
ehttps
. (Também fala sobre o uso de um Application Load Balancer, mas acho que isso está além do escopo aqui...) - Este artigo da AWSadiciona mais alguns detalhes sobre como configurar uma distribuição do CloudFront e como obter insights sobre arquivos de log.
- Este artigo da AWSregras de redirecionamento de documentos para usar redirecionamentos condicionais avançados: Não tenho certeza se preciso ir até lá para atingir meu objetivo, então ainda não investiguei isso ainda.
Além disso, obviamente há muitas perguntas sobre SO (vejaRelacionadoà direita desta pergunta) e outros posts sobre o assunto; O problema com a maioria deles é que eles usam capturas de tela de versões anteriores da IU do Console AWS: a maior parte do conteúdo ainda deve ser a mesma, mas correlacionar essas capturas de tela com a IU IMO atual adiciona outra camada de confusão.
Principais conclusões dos documentos da AWS (e outros):
- Preciso criar um bucket no AWS S3 e configurar o redirecionamento nele,
- Preciso criar uma distribuição no AWS CloudFront;
- para usar um domínio personalizado no CloudFront, preciso criar um certificado no AWS ACM,
- Preciso criar uma zona hospedada no AWS Route 53 e configurar registros nela.
Meu trabalho até agora
A AWS CLI mais recente está instalada region
e output
configurada em ~/.aws/config
, as credenciais são configuradas em ~/.aws/credentials
(cada uma para cada conta da AWS);AWS_*
variáveis ambientaissão export
editados.
Estou usando a região da AWS US East (N. Virginia) (us-east-1)
para tudo, a fim de evitar problemas adicionais causados pela indisponibilidade de recursos da AWS em uma região.
$ aws --version
aws-cli/2.2.23 Python/3.9.6 Darwin/19.6.0 source/x86_64 prompt/off
Omiti quaisquer prompts do shell ou >
caracteres de continuação de linha do shell para facilitar a cópia desta postagem para o shell.
Configurar um bucket S3
Aviso:Isso cria um bucket “totalmente público” sem quaisquer restrições de acesso. Nesse caso, isso não deveria importar, pois não há conteúdo de bucket para proteger, mas esse bucket público é uma prática ruim em geral. Além disso, estou usando um bucket público para evitar problemas adicionais causados por restrições de acesso:Primeiro, faça funcionar; segundo, torne-o seguro.
crie o balde
aws s3api create-bucket --bucket mydomain01.com
- resposta:
{
"Location": "/mydomain01.com"
}
configurar o redirecionamento
put-bucket-website
Documentos da AWS- não faz sentido redigir meu perfil SO ...
aws s3api put-bucket-website --bucket mydomain01.com --website-configuration \
'{ "RedirectAllRequestsTo": { "HostName": "stackoverflow.com/users/217844/ssc" } }'
- sem resposta
Peguei vocês:O nome do bucket S3 deve corresponder ao nome de domínio apex.
Usar qualquer nome de intervalo, mas mydomain01.com
(no meu exemplo) parece falhar sem qualquer indicação da causa. Os documentos da AWS não deixam isso muito claro - na verdade, ainda não tenho certeza se entendi mal alguma coisa aqui, mas pelo que posso dizer, a documentação oficial da AWS é um tanto desleixada nisso - IMO - ponto-chave crucial : Por exemplo,#2apenas diz
- Crie um bucket S3 com um nome global exclusivo.
o que poderia serqualquernome globalmente exclusivo.#1menciona isso de alguma forma - uma vez que você saiba como ler esses trechos...
Por outro lado, esse artigo nº 2 continua a me confundir com
Se você não estiver usando um domínio personalizado...
Por que eu deverianãoestar usando um domínio personalizado?!? O objetivo é redirecionar meu domínio personalizado, não é?!? Bom, de qualquer forma...
Peguei vocês:Não deve preceder o protocolo ao nome do host.
Nem o Console AWS nem a AWS CLI parecem testar se um protocolo ( http://
ou https://
) foi inserido noNome de anfitriãoCampo UI/passado na HostName
string JSON. No entanto, se um for acrescentado, o redirecionamento falhará; verredirecionamento de testeabaixo.
Peguei vocês:Bug na interface do console AWS S3.
Após a configuração do redirecionamento, o Console AWS exibe um link clicável em sua UI para o URL do bucket ( http://mydomain01.com.s3-website-us-east-1.amazonaws.com
) na parte inferior da página do bucket.Propriedadesguia, naHospedagem de site estáticoseção.
Clicar nesse link não abre a página, aparentemente porque o Console AWS bagunça a URL e tenta abrir http://https//stackoverflow.com/users/217844/ssc/
, independentemente do protocolo.
redirecionamento de teste
- usando
HTTPie
na casca em vez decurl
ouwget
porque é isso que as crianças legais parecem usar hoje em dia - copie o link do Console AWS no navegador para o shell
http http://mydomain01.com.s3-website-us-east-1.amazonaws.com/
HTTP/1.1 301 Moved Permanently
Content-Length: 0
Date: Mon, 02 Aug 2021 12:39:09 GMT
Location: http://stackoverflow.com/users/217844/ssc/
Server: AmazonS3
x-amz-id-2: rakAqUMnRraGvo/WkSa6AnbuhWn/9YZX/CAlI/OJQKYoWp/OdQIbyhsvHSwNved3suwMdgglqpE=
x-amz-request-id: C5BBG833Q9TQ9J6X
-> parece funcionar
- teste o redirecionamento se o protocolo tiver sido anexado erroneamente ao nome do host; observe o
Location
URL quebrado:
http http://mydomain01.com.s3-website-us-east-1.amazonaws.com/
HTTP/1.1 301 Moved Permanently
Content-Length: 0
Date: Mon, 02 Aug 2021 12:52:10 GMT
Location: http://https://stackoverflow.com/users/217844/ssc/
Server: AmazonS3
x-amz-id-2: Ee2/ob0faTpRdp6mGITdmClozXNmF1Q2oTbPioms8O91VA8n5VA3MoHhveeFz7v2VS65YKFKlDA=
x-amz-request-id: ZJP653R50YD5HSRS
Minhas perguntas #1
NOTA: Eu tive essas perguntas quando comecei a escrever isto; EUpensarEu mesmo fui capaz de respondê-las desde (vejatestar www
registro de subdomínioabaixo). Alguém por favor me corrija se eu estiver errado:
- P:O requisito "nome do bucket == nome de domínio" se aplica mesmo se eu usar o CloudFront?
A:Sim. - P:Preciso criar um bucket para cada domínio apex e cada subdomínio? então, no meu exemplo
mydomain01.com
www.mydomain01.com
blog.mydomain01.com
?
A:Sim.
Configurar uma zona hospedada do Route 53
criar a zona hospedada
- Documentos do AWS Route
create-hosted-zone
53 caller-reference
deve ser simplesmente uma string única
aws route53 create-hosted-zone --caller-reference "$(date '+%Y%m%d-%H%M%S')" --name mydomain01.com
- resposta
{
"Location": "https://route53.amazonaws.com/2013-04-01/hostedzone/Z123456789EXAMPLE0SKX",
"HostedZone": {
"Id": "/hostedzone/Z123456789EXAMPLE0SKX",
"Name": "mydomain01.com.",
"CallerReference": "20210802-150736",
"Config": {
"PrivateZone": false
},
"ResourceRecordSetCount": 2
},
"ChangeInfo": {
"Id": "/change/C1234567890SKXEXAMPLE",
"Status": "PENDING",
"SubmittedAt": "2021-08-02T13:07:37.860000+00:00"
},
"DelegationSet": {
"NameServers": [
"ns-1234.awsdns-12.com",
"ns-5678.awsdns-34.co.uk",
"ns-1234.awsdns-56.net",
"ns-5678.awsdns-78.org"
]
}
}
- anote o ID da zona hospedada
Z123456789EXAMPLE0SKX
, necessário nas próximas etapas
crie um registro para o domínio apex
- Documentos do AWS Route
change-resource-record-sets
53 - isso deve funcionar para
http
, mas não parahttps
- o JSON a ser transmitido é um tanto complexo; crie um arquivo temporário local
change-batch.apex.json
com o conteúdo abaixo - obter valores para
HostedZoneId
eDNSName
deEndpoints do site do Amazon S3: O bucket foi criado emUS East (N. Virginia)
, então useZ3AQBSTGFYJSTF
{
"Changes": [
{
"Action": "CREATE",
"ResourceRecordSet": {
"Name": "mydomain01.com.",
"Type": "A",
"AliasTarget": {
"HostedZoneId": "Z3AQBSTGFYJSTF",
"DNSName": "s3-website-us-east-1.amazonaws.com",
"EvaluateTargetHealth": false
}
}
}
]
}
Peguei vocês:Deve ser usado literalmente s3-website-us-east-1.amazonaws.com
para DNSName
.
Os documentos da AWS falam em todos os tipos de lugares sobre example.com
ou example.com.s3-website-us-east-1.amazonaws.com
, etc. Neste caso, este não é um exemplo a ser substituído por valores próprios (por exemplo mydomain01.com.s3-website-us-east-1.amazonaws.com
), maso valor literal domesa, ou sejas3-website-us-east-1.amazonaws.com
.
Peguei vocês:Não deve preceder o protocolo ao nome do host.
Semelhante à pegadinha acima, tanto o Console AWS quanto a AWS CLI aceitam com prazer um protocolo ( http://
ou https://
) anexado ao valor inserido noNome de anfitriãoCampo UI/passado como DNSName
. Pelo menos, isso parecemuitoerrado no console, por exemplohttp\072\057\057mydomain01.s3-website-us-east-1.amazonaws.com.
Ambas as dicas são um tanto atenuadas no Console AWS, onde os valores podem ser selecionados em uma caixa suspensa quando um registro é criado ou editado; ao usar a AWS CLI, você deve verificar novamente o que envia.
A mesma pegadinha e mitigação se aplicam aoNome do registroCampo UI/ Name
valor JSON.
crie um registro para o domínio apex, cont.
- usar
jq
para um teste rápido, o arquivo temporário contém json válido
jq . < change-batch.apex.json 1> /dev/null
- sem saída -> JSON válido
aws route53 change-resource-record-sets --hosted-zone-id Z123456789EXAMPLE0SKX \
--change-batch "file://$(pwd)/change-batch.apex.json"
- resposta
{
"ChangeInfo": {
"Id": "/change/C1234567890EXAMPLESKX",
"Status": "PENDING",
"SubmittedAt": "2021-08-02T14:20:09.370000+00:00"
}
}
testar registro de domínio apex
- teste
http
http http://mydomain01.com
HTTP/1.1 301 Moved Permanently
Content-Length: 0
Date: Mon, 02 Aug 2021 15:06:08 GMT
Location: http://stackoverflow.com/users/217844/ssc/
Server: AmazonS3
x-amz-id-2: EfDtCxif2iV4eInskirSBAOjQS7o9arzJCeZjscF6mW7cwwmm9Nxb7QJT50x2kjdslX2fOxA+lk=
x-amz-request-id: WM7K9TDEF75A6P1V
--> parece bom
- teste
http
com um caminho
http http://mydomain01.com/some/path
... similar output as above ...
- teste
https
http https://mydomain01.com
http: error: ConnectionError: HTTPSConnectionPool(host='mydomain01.com', port=443):
Max retries exceeded with url: / (Caused by NewConnectionError('<urllib3.connection.HTTPSConnection object at 0x101a48100>:
Failed to establish a new connection: [Errno 60] Operation timed out')) while doing a GET request to URL: https://mydomain01.com/
- (resposta agrupada para facilitar a leitura)
-> expira (após 60 anos?) - como esperado: o redirecionamento usando um bucket S3 não funciona https
(veja acima)
Peguei vocês:Atraso de propagação de alteração de DNS.
AWS e Google sãomuitorápido em termos de propagação de alterações nas configurações de DNS (como em segundos ou minutos), mas pode haver outros servidores de nomes "mais lentos" envolvidos. Ignore-os conforme descritoaquipara eliminar essa fonte de confusão. Essa abordagem só funciona no macOS, mas o conceito é o mesmo para qualquer sistema operacional.
Peguei vocês:Cache do navegador.
Ao testar alterações de DNS não no shell, mas no navegador, o navegador pode obter resultados de seu cache. Faço a maior parte do meu trabalho usando o Chrome, mas uso o Firefox (ou Safari) para testes, para poder limpar todo o cache antes de cada teste para eliminar esse problema potencial - sem sair do Google, AWS, etc.
criar um registro para www
subdomínio
- a única diferença é o
Name
valor JSON
sed -e 's|mydomain01.com.|www.mydomain01.com.|g' change-batch.apex.json > change-batch.www.json
aws route53 change-resource-record-sets --hosted-zone-id Z123456789EXAMPLE0SKX \
--change-batch "file://$(pwd)/change-batch.www.json
- resposta semelhante à acima
testar www
registro de subdomínio
- teste
http
http http://www.mydomain01.com
HTTP/1.1 404 Not Found
Content-Length: 363
Content-Type: text/html; charset=utf-8
Date: Mon, 02 Aug 2021 15:28:05 GMT
Server: AmazonS3
x-amz-id-2: MGLcynq1iEGKh+pT6N6iRpCuQSN243q/5zm2Y7rXTnM7iW9nvDokF6s20xEUBr7QiEtBPEzZmII=
x-amz-request-id: TK83G35EMYFR8SKX
<html>
<head><title>404 Not Found</title></head>
<body>
<h1>404 Not Found</h1>
<ul>
<li>Code: NoSuchBucket</li>
<li>Message: The specified bucket does not exist</li>
<li>BucketName: www.mydomain01.com</li>
<li>RequestId: TK83G35EMYFR8SKX</li>
<li>HostId: MGLcynq1iEGKh+pT6N6iRpCuQSN243q/5zm2Y7rXTnM7iW9nvDokF6s20xEUBr7QiEtBPEzZmII=</li>
</ul>
<hr/>
</body>
</html>
- Acho que isso responde ao segundo deMinhas perguntas #1acima: preciso de um bucket S3 por domínio apex/sub para encaminhar.
Configurar uma distribuição do CloudFront
- NOTA: O Console AWS torna muito fácilsolicitar um certificadoe valide-o usando DNS.
criar um certificado
request-certificate
Documentos do AWS ACM- o certificado deve funcionar para o ápice e todos os subdomínios, portanto, é necessárioadicione outro nome a este certificado/ passar
--subject-alternative-names
; vereste artigo da AWS(a caixa azul superior). - adicione aspas
*.mydomain01.com
para que o shell não interprete o*
aws acm request-certificate --domain-name mydomain01.com --validation-method DNS \
--subject-alternative-names '*.mydomain01.com'
- resposta:
{
"CertificateArn": "arn:aws:acm:us-east-1:123456789012:certificate/12345678-90ab-cdef-1234-1234567890ab"
}
123456789012
é o ID da minha conta AWS; tudo depoiscertificate/
é apenas um UUID
obter detalhes do certificado
describe-certificate
Documentos do AWS ACM- salve a resposta em um arquivo local temporário; extrair
ResourceRecord.Name
eResourceRecord.Value
usarjq
- necessário para o registro AWS Route 53 que comprova que possuo
mydomain01.com
- alternativamente, use
--query
o parâmetro comaws acm describe-certificate
aws acm describe-certificate \
--certificate-arn "arn:aws:acm:us-east-1:123456789012:certificate/12345678-90ab-cdef-1234-1234567890ab" \
> describe-certificate.json
jq -r '.Certificate.DomainValidationOptions[0].ResourceRecord.Name' describe-certificate.json
_1234567890abcdef1234567890abcdef.mydomain01.com.
jq -r '.Certificate.DomainValidationOptions[0].ResourceRecord.Value' describe-certificate.json
_1234567890abcdef1234567890abcdef.weirdchars.acm-validations.aws.
crie um registro do Route 53 para validação de certificado
- será verificado automaticamente pelo AWS ACM e o certificado será validado assim que este registro for encontrado
- como antes, use um arquivo local temporário
change-batch.cert.json
, veja, por exemplocrie um registro para o domínio apex; conteúdo:
{
"Changes": [
{
"Action": "CREATE",
"ResourceRecordSet": {
"Name": "_1234567890abcdef1234567890abcdef.mydomain01.com.",
"Type": "CNAME",
"TTL": 300,
"ResourceRecords": [
{
"Value": "_1234567890abcdef1234567890abcdef.weirdchars.acm-validations.aws."
}
]
}
}
]
}
- comando shell:
aws route53 change-resource-record-sets --hosted-zone-id Z123456789EXAMPLE0SKX \
--change-batch "file://$(pwd)/change-batch.cert.json
- resposta semelhante à da criação de registros acima
- NOTA: Pode levar alguns minutos para o ACM validar o certificado.
criar a distribuição do CloudFront
create-distribution
Documentos do AWS CloudFront- novamente,
CallerReference
deve ser simplesmente uma string única; use, por exemplo,date '+%Y%m%d-%H%M%S'
no shell para criar e copiar em arquivo; vercriar a zona hospedada - como antes, use um arquivo local temporário
create-distribution.json
para valores complexos; conteúdo abaixo MinimumProtocolVersion
: obter valor deeste artigo da AWSOriginProtocolPolicy
: usandohttp-only
porque a origem (o bucket S3) só pode fazerhttp
ViewerProtocolPolicy
: usarredirect-to-https
como objetivo principal da criação desta distribuição é redirecionar dehttp
parahttps
- NOTA: não sei (e os documentos da AWS não informam) quais campos são obrigatoriamente obrigatórios; o comando AWS CLI exibe uma mensagem clara e detalhada se algo nos dados enviados estiver faltando ou errado.
{
"CallerReference": "20210802-191725",
"Aliases": {
"Quantity": 2,
"Items": ["mydomain01.com", "*.mydomain01.com"]
},
"Origins": {
"Quantity": 1,
"Items": [
{
"Id": "mydomain01.com.s3.us-east-1.amazonaws.com_20210802-191725",
"DomainName": "mydomain01.com.s3.us-east-1.amazonaws.com",
"CustomOriginConfig": {
"HTTPPort": 80,
"HTTPSPort": 443,
"OriginProtocolPolicy": "http-only"
}
}
]
},
"OriginGroups": {
"Quantity": 0
},
"DefaultCacheBehavior": {
"TargetOriginId": "mydomain01.com.s3.us-east-1.amazonaws.com_20210802-191725",
"ForwardedValues": {
"QueryString": false,
"Cookies": {
"Forward": "none"
},
"Headers": {
"Quantity": 0
},
"QueryStringCacheKeys": {
"Quantity": 0
}
},
"TrustedSigners": {
"Enabled": false,
"Quantity": 0
},
"ViewerProtocolPolicy": "redirect-to-https",
"MinTTL": 0,
"AllowedMethods": {
"Quantity": 2,
"Items": [
"HEAD",
"GET"
],
"CachedMethods": {
"Quantity": 2,
"Items": [
"HEAD",
"GET"
]
}
},
"SmoothStreaming": false,
"DefaultTTL": 86400,
"MaxTTL": 31536000,
"Compress": false,
"LambdaFunctionAssociations": {
"Quantity": 0
},
"FieldLevelEncryptionId": ""
},
"CacheBehaviors": {
"Quantity": 0
},
"CustomErrorResponses": {
"Quantity": 0
},
"Comment": "",
"Logging": {
"Enabled": false,
"IncludeCookies": false,
"Bucket": "",
"Prefix": ""
},
"PriceClass": "PriceClass_All",
"Enabled": true,
"ViewerCertificate": {
"ACMCertificateArn": "arn:aws:acm:us-east-1:123456789012:certificate/12345678-90ab-cdef-1234-1234567890ab",
"MinimumProtocolVersion": "TLSv1.2_2021",
"SSLSupportMethod": "sni-only"
},
"Restrictions": {
"GeoRestriction": {
"RestrictionType": "none",
"Quantity": 0
}
},
"WebACLId": "",
"HttpVersion": "http2",
"IsIPV6Enabled": true
}
- comando shell:
- NOTA: adicione
--no-cli-pager
para desativar a paginação e armazenar a resposta em um arquivo local temporário para inspeção
aws --no-cli-pager cloudfront create-distribution \
--distribution-config "file://$(pwd)/create-distribution.json"
> create-distribution.response.json
- resposta: uma grande estrutura JSON, principalmente a configuração enviada com algumas meta informações de distribuição
Peguei vocês:A distribuição do CloudFront demora um pouco para ser implantada.
NoDistribuiçõesvisão geral, há umaÚltima modificaçãocampo que dizImplantandopor um tempo após cada mudança; dependendo da largura da tela e da janela do navegador, este campo pode estar oculto, então a UI pode parecer que a distribuição está instalada e funcionando, mas na verdade não está.
distribuição de teste
- obter
DomainName
da resposta
jq -r '.Distribution.DomainName' create-distribution.response.json
abcdefghij1234.cloudfront.net
- teste
http
http http://abcdefghij1234.cloudfront.net
HTTP/1.1 301 Moved Permanently
Connection: keep-alive
Content-Length: 183
Content-Type: text/html
Date: Mon, 02 Aug 2021 20:14:27 GMT
Location: https://abcdefghij1234.cloudfront.net/
Server: CloudFront
Via: 1.1 8640a37b586353bc916562c577770223.cloudfront.net (CloudFront)
X-Amz-Cf-Id: ooT0Y1QvDE7_yoRmb0p0Un2Db6O713rBvudtmz1xer7YwEU0GE8smw==
X-Amz-Cf-Pop: HAM50-C2
X-Cache: Redirect from cloudfront
<html>
<head><title>301 Moved Permanently</title></head>
<body bgcolor="white">
<center><h1>301 Moved Permanently</h1></center>
<hr><center>CloudFront</center>
</body>
</html>
Portanto, a distribuição redireciona de http://abcdefghij1234.cloudfront.net
para https://abcdefghij1234.cloudfront.net
- como deveria; foi para isso que foi criado.
- teste
https
HTTP/1.1 403 Forbidden
Connection: keep-alive
Content-Type: application/xml
Date: Mon, 02 Aug 2021 20:14:35 GMT
Server: AmazonS3
Transfer-Encoding: chunked
Via: 1.1 c3e656776c8a9f0e1ea24405ab1dcc85.cloudfront.net (CloudFront)
X-Amz-Cf-Id: or4SC8urWEv_8c3jDURv5IINwFU1TDVLSQ3_X7tya7Ncz8ujyz0-IQ==
X-Amz-Cf-Pop: HAM50-C2
X-Cache: Error from cloudfront
x-amz-bucket-region: us-east-1
<?xml version="1.0" encoding="UTF-8"?>
<Error>
<Code>AccessDenied</Code>
<Message>Access Denied</Message>
<RequestId>EAST1CM5WJR8QM3S</RequestId>
<HostId>zF2dJm2vsuSM633NHuzcA5VqrCrNkfYGu31FRmKKIkebuI5+6l5DlVnr4kk9be262hcqktoiROw=</HostId>
</Error>
- (xml formatado para facilitar a leitura)
Isso não parece bom. Não tenho certeza se isso é esperado?!?
Atualizar os registros do AWS Route 53
- mudar do uso do bucket S3 para a distribuição do CloudFront
- como antes, crie um arquivo local temporário
change-batch.apex.updatejson
executandosed
o arquivo anteriorchange-batch.apex.json
- use
UPSERT
em vez deCREATE
: O registro já existe e deve ser atualizado. HostedZoneId
: substitua o valor antigoZ3AQBSTGFYJSTF
(para S3) porZ2FDTNDATAQYW2
, algum valor mágico retirado dechange-resource-record-sets
documentosDNSName
: Citação dochange-resource-record-sets
documentos
Especifique o nome de domínio que o CloudFront atribuiu quando você criou sua distribuição.
Sua distribuição do CloudFront deve incluir um nome de domínio alternativo que corresponda ao nome do conjunto de registros de recursos. Por exemplo, se o nome do conjunto de registros de recursos for acme.example.com, sua distribuição do CloudFront deverá incluir acme.example.com como um dos nomes de domínio alternativos.
-> substituir s3-website-us-east-1.amazonaws.com
(para S3) por abcdefghij1234.cloudfront.net
:
sed -e 's|CREATE|UPSERT|g' \
-e 's|Z3AQBSTGFYJSTF|Z2FDTNDATAQYW2|g' \
-e 's|s3-website-us-east-1.amazonaws.com|abcdefghij1234.cloudfront.net|g' \
change-batch.apex.json > change-batch.apex.update.json
- conteúdo do arquivo:
{
"Changes": [
{
"Action": "UPSERT",
"ResourceRecordSet": {
"Name": "mydomain01.com.",
"Type": "A",
"AliasTarget": {
"HostedZoneId": "Z2FDTNDATAQYW2",
"DNSName": "abcdefghij1234.cloudfront.net",
"EvaluateTargetHealth": false
}
}
}
]
}
- comando shell
aws route53 change-resource-record-sets \
--hosted-zone-id Z123456789EXAMPLE0SKX \
--change-batch "file://$(pwd)/change-batch.apex.update.json"
- resposta semelhante à da criação de registros acima
testar registro de domínio apex
- teste
http
http http://mydomain01.com
HTTP/1.1 301 Moved Permanently
Connection: keep-alive
Content-Length: 183
Content-Type: text/html
Date: Mon, 02 Aug 2021 19:08:27 GMT
Location: https://mydomain01.com/
Server: CloudFront
Via: 1.1 2408979685aa1bdb752824d292e63bf7.cloudfront.net (CloudFront)
X-Amz-Cf-Id: Ww60Ol_0fdR8SsgcHeRYUd_de1rVejX6w_wuK80aR21e3IHstB-irA==
X-Amz-Cf-Pop: HAM50-C2
X-Cache: Redirect from cloudfront
<html>
<head><title>301 Moved Permanently</title></head>
<body bgcolor="white">
<center><h1>301 Moved Permanently</h1></center>
<hr><center>CloudFront</center>
</body>
</html>
- a resposta agora vem do CloudFront e não mais do S3, então o registro DNS atualizado parece funcionar :-)
- teste
http
com um caminho
http http://mydomain01.com/some/path
... similar output as above ...
--> parece bom
- teste
https
http https://mydomain01.com
HTTP/1.1 403 Forbidden
Connection: keep-alive
Content-Type: application/xml
Date: Mon, 02 Aug 2021 18:53:51 GMT
Server: AmazonS3
Transfer-Encoding: chunked
Via: 1.1 ea89c67081222c8c680e7a37ad75f4f0.cloudfront.net (CloudFront)
X-Amz-Cf-Id: 5prv5_g5zXOX3aRBp2Gq64JJPuwC2o5dHIp9RCAHm6Ls8hK6EFghXw==
X-Amz-Cf-Pop: HAM50-C2
X-Cache: Error from cloudfront
x-amz-bucket-region: us-east-1
<?xml version="1.0" encoding="UTF-8"?>
<Error>
<Code>AccessDenied</Code>
<Message>Access Denied</Message>
<RequestId>T78ASF3FA9QGV4T5</RequestId>
<HostId>xaEgwEtbeesL4XfxMdxVoPAt9Lpb1ZDM9Fs5W4htBbcWNbV9sMUTjVAPIuWwAQ3Xh1yRhh4b4Ts=</HostId>
</Error>
- (como antes, xml formatado para facilitar a leitura)
NOTA: Esta resposta vem de AmazonS3
, não da CloudFront
anterior. O bucket S3 não possui nenhuma restrição de acesso - então, como pode haver umaacesso negado?!?
verifique novamente as permissões do bucket
aws s3api get-bucket-policy --bucket mydomain01.com
An error occurred (NoSuchBucketPolicy) when calling the GetBucketPolicy operation: The bucket policy does not exist
Isso corresponde ao vazioPolítica de intervalocampo no console AWS S3 - mas é realmente aceitável que não exista nenhuma política de bucket?!?
Agora aquele olhar para trásdistribuição de testeacima, vejo que a resposta ao acesso abcdefghij1234.cloudfront.net
direto também vem do S3, não do CloudFront, então o problema parece estar bem claro:
Minhas perguntas #2
- Por que o bucket S3 nega acesso?
- É normal que um bucket S3 não tenha nenhuma política de acesso? Normalmente não tem buckets "públicos" com uma política que permita explicitamente o acesso a qualquer pessoa?
- Igual aum bucket S3 por ápice/subdomínio, também preciso de uma distribuição do CloudFront por ápice/subdomínio?
- Nesse caso, acho que adicionar
*.mydomain01.com
um domínio alternativo ao certificado (e à distribuição) não faz muito sentido, não é?!? Também precisaria de um certificado por distribuição, dedicado a um domínio, correto?
Responder1
Você está no caminho certo em geral. Apenas um comentário: Route53 pode ser omitido se o seu domínio já usar algum outro provedor de serviços DNS.
P: O requisito "nome do bucket == nome de domínio" se aplica mesmo se eu usar o CloudFront?
Não, se você usa o CloudFront. O CNAME é configurado separadamente no CloudFront.
P: Preciso criar um bucket para cada domínio apex e cada subdomínio?
Não, você não precisa de um bucket por domínio/subdomínio.
Por que o bucket S3 nega acesso?
Você deve usar seu s3-website-us-east-1.amazonaws.com
domínio como origem do CF.
É normal que um bucket S3 não tenha nenhuma política de acesso? Normalmente não tem buckets "públicos" com uma política que permita explicitamente o acesso a qualquer pessoa?
Se você usar o bucket apenas para redirecionar o tráfego, nenhuma política de acesso deverá servir.
Semelhante a um bucket S3 por ápice/subdomínio, também preciso de uma distribuição do CloudFront por ápice/subdomínio?
Sim, você precisa de uma distribuição do CloudFront por domínio/subdomínio porque uma distribuição pode anexar no máximo um certificado ACM.
Nesse caso, acho que adicionar
*.mydomain01.com
um domínio alternativo ao certificado (e à distribuição) não faz muito sentido, não é?!? Também precisaria de um certificado por distribuição, dedicado a um domínio, correto?
Adicionar o domínio curinga faz sentido, pois a distribuição CF também precisa lidar com o tráfego de subdomínios.
Se você tiver mais dúvidas, entre noBate-papo AWSe @ eu no chat.