AWS: Como redirecionar muitos domínios para uma página em outro domínio?

AWS: Como redirecionar muitos domínios para uma página em outro domínio?

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

  1. domínio apex usando http(por exemplo http://mydomain01.com)
  2. domínio apex usando https(por exemplo https://mydomain01.com)
  3. subdomínios usando http(por exemplo, http://www.mydomain01.comou http://blog.mydomain01.com)
  4. subdomínios usando https(por exemplo, https://www.mydomain01.comou https://blog.mydomain01.com)
  5. quaisquer caminhos (por exemplo, http://mydomain01.com/some_pathou https://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

  1. 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 para https.
  2. 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 httpe https. (Também fala sobre o uso de um Application Load Balancer, mas acho que isso está além do escopo aqui...)
  3. Este artigo da AWSadiciona mais alguns detalhes sobre como configurar uma distribuição do CloudFront e como obter insights sobre arquivos de log.
  4. 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):

  1. Preciso criar um bucket no AWS S3 e configurar o redirecionamento nele,
  2. Preciso criar uma distribuição no AWS CloudFront;
  3. para usar um domínio personalizado no CloudFront, preciso criar um certificado no AWS ACM,
  4. Preciso criar uma zona hospedada no AWS Route 53 e configurar registros nela.

Meu trabalho até agora

A AWS CLI mais recente está instalada regione outputconfigurada em ~/.aws/config, as credenciais são configuradas em ~/.aws/credentials(cada uma para cada conta da AWS);AWS_*variáveis ​​ambientaissão exporteditados.

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

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

  1. 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 HostNamestring 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

  • usandoHTTPiena casca em vez de curlou wgetporque é 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 LocationURL 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 wwwregistro de subdomínioabaixo). Alguém por favor me corrija se eu estiver errado:

  1. P:O requisito "nome do bucket == nome de domínio" se aplica mesmo se eu usar o CloudFront?
    A:Sim.
  2. 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

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

{
  "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.compara DNSName.

Os documentos da AWS falam em todos os tipos de lugares sobre example.comou 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/ Namevalor JSON.

crie um registro para o domínio apex, cont.

  • usarjqpara 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

  • testehttp
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 httpcom um caminho
http http://mydomain01.com/some/path
 ... similar output as above ...
  • testehttps
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 wwwsubdomínio

  • a única diferença é o Namevalor 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 wwwregistro de subdomínio

  • testehttp
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

criar um certificado

  • request-certificateDocumentos 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.compara 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 depois certificate/é apenas um UUID

obter detalhes do certificado

  • describe-certificateDocumentos do AWS ACM
  • salve a resposta em um arquivo local temporário; extrair ResourceRecord.Namee ResourceRecord.Valueusarjq
  • necessário para o registro AWS Route 53 que comprova que possuomydomain01.com
  • alternativamente, use --queryo 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-distributionDocumentos do AWS CloudFront
  • novamente, CallerReferencedeve 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.jsonpara valores complexos; conteúdo abaixo
  • MinimumProtocolVersion: obter valor deeste artigo da AWS
  • OriginProtocolPolicy: usando http-onlyporque a origem (o bucket S3) só pode fazerhttp
  • ViewerProtocolPolicy: usar redirect-to-httpscomo objetivo principal da criação desta distribuição é redirecionar de httpparahttps
  • 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-pagerpara 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 DomainNameda resposta
jq -r '.Distribution.DomainName' create-distribution.response.json
abcdefghij1234.cloudfront.net
  • testehttp
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.netpara https://abcdefghij1234.cloudfront.net- como deveria; foi para isso que foi criado.

  • testehttps
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.updatejsonexecutando sedo arquivo anteriorchange-batch.apex.json
  • use UPSERTem vez de CREATE: O registro já existe e deve ser atualizado.
  • HostedZoneId: substitua o valor antigo Z3AQBSTGFYJSTF(para S3) por Z2FDTNDATAQYW2, algum valor mágico retirado dechange-resource-record-setsdocumentos
  • DNSName: Citação dochange-resource-record-setsdocumentos

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

  • testehttp
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 httpcom um caminho
http http://mydomain01.com/some/path
 ... similar output as above ...

--> parece bom

  • testehttps
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 CloudFrontanterior. 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.netdireto também vem do S3, não do CloudFront, então o problema parece estar bem claro:

Minhas perguntas #2

  1. Por que o bucket S3 nega acesso?
  2. É 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?
  3. Igual aum bucket S3 por ápice/subdomínio, também preciso de uma distribuição do CloudFront por ápice/subdomínio?
  4. Nesse caso, acho que adicionar *.mydomain01.comum 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.comdomí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.comum 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.

informação relacionada