AWS: ¿Cómo redirigir muchos dominios a una página de otro dominio?

AWS: ¿Cómo redirigir muchos dominios a una página de otro dominio?

Mi objetivo

Tengo varios dominios (por ejemplo, 10 o 20) y me gustaría redirigircualquiervisitantes aen cualquier lugaren esas páginas a una página en otro dominio (por ejemplo, mi página de perfil de stackoverflow.com).

Esto incluye

  1. dominio ápice usando http(p. ej http://mydomain01.com.)
  2. dominio ápice usando https(p. ej https://mydomain01.com.)
  3. subdominios usando http(por ejemplo , http://www.mydomain01.como http://blog.mydomain01.com)
  4. subdominios usando https(por ejemplo , https://www.mydomain01.como https://blog.mydomain01.com)
  5. cualquier camino (por ejemplo, http://mydomain01.com/some_patho https://www.mydomain01.com/another/path.html)

más lo mismo para todos mis otros dominios ( mydomain02.com,, mydomain03.cometc.; cada uno con los casos de uso anteriores).

Mi investigación

  1. Este artículo de AWSexplica cómo redirigir el tráfico de Internet desde un dominio apex a otro dominio (caso n.° 1 en miEsto incluyelista arriba) usandoAWS S3yRuta 53 de AWS: Esto funciona para http, pero no para https.
  2. Este artículo de AWSexplica cómo redirigir el tráfico de Internet para varios casos (por lo que parece, cubre todos los casos en miEsto incluyelista arriba) usandoAWS S3,Ruta 53 de AWSyAWS CloudFront: Esto funciona tanto para httpcomo para https. (También habla sobre el uso de un balanceador de carga de aplicaciones, pero supongo que eso está más allá del alcance aquí...)
  3. Este artículo de AWSagrega más detalles sobre la configuración de una distribución de CloudFront y cómo obtener información sobre los archivos de registro.
  4. Este artículo de AWSreglas de redireccionamiento de documentos para usar redireccionamientos condicionales avanzados: no estoy seguro de si necesito ir allí para lograr mi objetivo, así que todavía no lo he investigado.

Además, obviamente hay muchas preguntas SO (verRelacionadoa la derecha de esta pregunta) y otras publicaciones sobre el tema; El problema con la mayoría de ellos es que usan capturas de pantalla de versiones anteriores de la interfaz de usuario de la consola de AWS: la mayoría del contenido debería seguir siendo el mismo, pero correlacionar esas capturas de pantalla con la interfaz de usuario actual, en mi opinión, agrega otra capa de confusión.

Conclusiones clave de los documentos de AWS (y otros):

  1. Necesito crear un depósito en AWS S3 y configurar la redirección en él.
  2. Necesito crear una distribución en AWS CloudFront;
  3. Para utilizar un dominio personalizado en CloudFront, necesito crear un certificado en AWS ACM,
  4. Necesito crear una zona alojada en AWS Route 53 y configurar registros en ella.

mi trabajo hasta ahora

La última AWS CLI está instalada regiony outputconfigurada en ~/.aws/config, las credenciales se configuran en ~/.aws/credentials(cada una para cada cuenta de AWS);AWS_*Variables de entornoson exported.

Estoy usando la región de AWS US East (N. Virginia) (us-east-1)para todo para evitar problemas adicionales causados ​​por recursos de AWS que no estén disponibles en una región.

$ aws --version
aws-cli/2.2.23 Python/3.9.6 Darwin/19.6.0 source/x86_64 prompt/off

Omito los mensajes del shell o >los caracteres de continuación de la línea del shell para facilitar la copia desde esta publicación al shell.

Configurar un depósito S3

Advertencia:Esto crea un depósito "totalmente público" sin restricciones de acceso. En este caso, esto no debería importar ya que no hay ningún contenido del depósito que proteger, pero un depósito público de este tipo es una mala práctica en general. Además, estoy usando un depósito público para evitar problemas adicionales causados ​​por restricciones de acceso:Primero, haz que funcione; segundo, hazlo seguro.

crear el cubo

aws s3api create-bucket --bucket mydomain01.com
  • respuesta:
{
    "Location": "/mydomain01.com"
}

configurar la redirección

aws s3api put-bucket-website --bucket mydomain01.com --website-configuration \
    '{ "RedirectAllRequestsTo": { "HostName": "stackoverflow.com/users/217844/ssc" } }'
  • ninguna respuesta

Entendido:El nombre del depósito de S3 debe coincidir con el nombre de dominio de Apex.

El uso de cualquier nombre de depósito pero mydomain01.com(para mi ejemplo) parece fallar sin ninguna indicación de la causa. Los documentos de AWS realmente no dejan esto muy claro; de hecho, todavía no estoy seguro de si entiendo mal algo aquí, pero por lo que puedo decir, la documentación oficial de AWS es en realidad algo descuidada en ese sentido. En mi opinión, punto clave crucial. : Por ejemplo,#2solo dice

  1. Cree un depósito de S3 con un nombre único global.

que podría sercualquiernombre globalmente único.#1menciona eso de alguna manera - una vez que sabes cómo leer esos bits...

Como nota al margen, ese artículo n.º 2 sigue confundiéndome con

Si no estás utilizando un dominio personalizado...

Por qué habríano¿Estará usando un dominio personalizado? El objetivo es redirigir mi dominio personalizado, ¿no es así? Bueno, de cualquier modo...

Entendido:No debe anteponer el protocolo al nombre de host.

Ni la consola de AWS ni la CLI de AWS parecen probar si se ingresó un protocolo ( http://o ) en elhttps://Nombre de hostCampo UI / pasado en la HostNamecadena JSON. Sin embargo, si se antepone uno, la redirección falla; verredirección de pruebaabajo.

Entendido:Error en la interfaz de usuario de la consola AWS S3.

Una vez configurada la redirección, la consola de AWS muestra un enlace en el que se puede hacer clic en su interfaz de usuario a la URL del depósito ( http://mydomain01.com.s3-website-us-east-1.amazonaws.com) en la parte inferior de la página del depósito.Propiedadespestaña, en laAlojamiento de sitios web estáticossección.

Al hacer clic en ese enlace no se puede abrir la página, aparentemente porque la consola de AWS estropea la URL e intenta abrirla http://https//stackoverflow.com/users/217844/ssc/, sin importar el protocolo.

redirección de prueba

  • usandoHTTPieen el caparazón en lugar de curlo wgetporque eso es lo que los chicos geniales parecen usar hoy en día
  • copie el enlace de la consola de AWS en el navegador al 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

  • probar la redirección si el protocolo se antepuso erróneamente al nombre del host; tenga en cuenta la URL rota Location:
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

Mis preguntas #1

NOTA: Tenía estas preguntas cuando comencé a escribir esto; IpensarPude responderlas yo mismo ya que (verwwwregistro de subdominio de pruebaabajo). Alguien por favor corríjame si me equivoco:

  1. P:¿Se aplica el requisito "nombre del depósito == nombre de dominio" incluso si uso CloudFront?
    A:Sí.
  2. P:¿Necesito crear un depósito para cada dominio principal y cada subdominio? entonces, en mi ejemplo
    • mydomain01.com
    • www.mydomain01.com
    • blog.mydomain01.com?
      A:Sí.

Configurar una zona hospedada de Route 53

crear la zona alojada

aws route53 create-hosted-zone --caller-reference "$(date '+%Y%m%d-%H%M%S')" --name mydomain01.com
  • respuesta
{
    "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"
        ]
    }
}
  • tome nota del ID de la zona alojada Z123456789EXAMPLE0SKX, necesaria en los siguientes pasos

crear un registro para el dominio apex

{
  "Changes": [
    {
      "Action": "CREATE",
      "ResourceRecordSet": {
        "Name": "mydomain01.com.",
        "Type": "A",
        "AliasTarget": {
          "HostedZoneId": "Z3AQBSTGFYJSTF",
          "DNSName": "s3-website-us-east-1.amazonaws.com",
          "EvaluateTargetHealth": false
        }
      }
    }
  ]
}

Entendido:Debe usarse palabra por palabra s3-website-us-east-1.amazonaws.compara DNSName.

Los documentos de AWS hablan en todo tipo de lugares sobre example.como example.com.s3-website-us-east-1.amazonaws.com, etc. En este caso, este no es un ejemplo que deba ser reemplazado por valores propios (por ejemplo mydomain01.com.s3-website-us-east-1.amazonaws.com), sinoel valor literal de lamesa, es decirs3-website-us-east-1.amazonaws.com.

Entendido:No debe anteponer el protocolo al nombre de host.

De manera similar al problema anterior, tanto la consola de AWS como la CLI de AWS aceptan con gusto un protocolo ( http://o https://) antepuesto al valor ingresado en elNombre de hostCampo UI / pasado como DNSName. Al menos esto parecemuyincorrecto en la consola, por ejemplohttp\072\057\057mydomain01.s3-website-us-east-1.amazonaws.com.

Ambos problemas se mitigan de alguna manera en la consola de AWS, donde los valores se pueden seleccionar en un cuadro desplegable cuando se crea o edita un registro; Cuando utilice AWS CLI, debe volver a verificar lo que envía.

El mismo problema y mitigación se aplica a laNombre del registroCampo UI/ Namevalor JSON.

crear un registro para el dominio apex, cont.

  • usarjqpara una prueba rápida, el archivo temporal contiene json válido
jq . < change-batch.apex.json 1> /dev/null
  • sin salida --> JSON válido
aws route53 change-resource-record-sets --hosted-zone-id Z123456789EXAMPLE0SKX \
    --change-batch "file://$(pwd)/change-batch.apex.json"
  • respuesta
{
    "ChangeInfo": {
        "Id": "/change/C1234567890EXAMPLESKX",
        "Status": "PENDING",
        "SubmittedAt": "2021-08-02T14:20:09.370000+00:00"
    }
}

probar el registro de dominio ápice

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

--> se ve bien

  • prueba httpcon un camino
http http://mydomain01.com/some/path
 ... similar output as above ...
  • pruebahttps
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/
  • (respuesta ajustada para facilitar la lectura)

--> se agota el tiempo de espera (¿después de los 60?) - como se esperaba: la redirección usando un depósito S3 no funciona https(ver arriba)

Entendido:Retraso en la propagación del cambio de DNS.

AWS y Google sonmuyrápido en términos de propagación de cambios en la configuración de DNS (como en segundos o minutos), pero puede haber otros servidores de nombres "más lentos" involucrados. Evítelos como se describeaquípara eliminar esa fuente de confusión. Ese enfoque sólo funciona en macOS, pero el concepto es el mismo para cualquier sistema operativo.

Entendido:Caché de navegador.

Al probar los cambios de DNS no en el shell, sino en el navegador, el navegador puede obtener resultados de su caché. Hago la mayor parte de mi trabajo usando Chrome, pero uso Firefox (o Safari) para realizar pruebas, por lo que puedo borrar todo el caché antes de cada prueba para eliminar ese problema potencial, sin cerrar sesión en Google, AWS, etc.

crear un registro para wwwel subdominio

  • la única diferencia es el 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
  • respuesta similar a la anterior

wwwregistro de subdominio de prueba

  • pruebahttp
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>
  • Creo que eso responde a la segunda deMis preguntas #1arriba: necesito un depósito S3 por dominio principal/subdominio para reenviar.

Configurar una distribución de CloudFront

crear un certificado

  • Documentos de AWS request-certificateACM
  • Se supone que el certificado funciona para el vértice y todos los subdominios, por lo que es necesarioagregar otro nombre a este certificado/ aprobar --subject-alternative-names; vereste artículo de AWS(el cuadro azul superior).
  • agregue comillas *.mydomain01.compara que el shell no interprete el*
aws acm request-certificate --domain-name mydomain01.com --validation-method DNS \
    --subject-alternative-names '*.mydomain01.com'
  • respuesta:
{
    "CertificateArn": "arn:aws:acm:us-east-1:123456789012:certificate/12345678-90ab-cdef-1234-1234567890ab"
}
  • 123456789012es mi ID de cuenta de AWS; todo lo que sigue certificate/es solo un UUID

obtener detalles del certificado

  • Documentos de AWS describe-certificateACM
  • guardar la respuesta en un archivo local temporal; extraer ResourceRecord.Namey ResourceRecord.Valueusarjq
  • necesario para el registro de AWS Route 53 que demuestra que soy dueñomydomain01.com
  • alternativamente, use --queryel parámetro conaws 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.

crear un registro de Ruta 53 para la validación del certificado

  • AWS ACM comprobará automáticamente y el certificado se validará una vez que se encuentre este registro.
  • Como antes, utilice un archivo local temporal change-batch.cert.json, consulte, por ejemplo.crear un registro para el dominio apex; contenido:
{
  "Changes": [
    {
      "Action": "CREATE",
      "ResourceRecordSet": {
        "Name": "_1234567890abcdef1234567890abcdef.mydomain01.com.",
        "Type": "CNAME",
        "TTL": 300,
        "ResourceRecords": [
          {
            "Value": "_1234567890abcdef1234567890abcdef.weirdchars.acm-validations.aws."
          }
        ]
      }
    }
  ]
}
  • comando de shell:
aws route53 change-resource-record-sets --hosted-zone-id Z123456789EXAMPLE0SKX \
    --change-batch "file://$(pwd)/change-batch.cert.json
  • respuesta similar a cuando se crean registros anteriores
  • NOTA: Es posible que ACM tarde un par de minutos en validar el certificado.

crear la distribución de CloudFront

  • Documentos de AWS create-distributionCloudFront
  • nuevamente, CallerReferencedebe ser simplemente una cadena única; utilizar, por ejemplo, date '+%Y%m%d-%H%M%S'en shell para crear y copiar en un archivo; vercrear la zona alojada
  • como antes, utilice un archivo local temporal create-distribution.jsonpara valores complejos; contenidos a continuación
  • MinimumProtocolVersion: obtener valor deeste artículo de AWS
  • OriginProtocolPolicy: usando http-onlyporque el origen (el depósito S3) solo puede hacerhttp
  • ViewerProtocolPolicy: redirect-to-httpsel objetivo principal de crear esta distribución es redirigir de httpahttps
  • NOTA: No sé (y los documentos de AWS no lo dicen) qué campos son obligatorios; El comando AWS CLI muestra un mensaje claro y detallado si falta algo o hay algún error en los datos enviados.
{
    "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 de shell:
  • NOTA: agregue --no-cli-pagerpara deshabilitar la paginación y almacene la respuesta en un archivo local temporal para su inspección
aws --no-cli-pager cloudfront create-distribution \
    --distribution-config "file://$(pwd)/create-distribution.json"
 > create-distribution.response.json
  • respuesta: una estructura JSON grande, principalmente la configuración enviada con alguna metainformación de distribución

Entendido:La distribución de CloudFront tarda un momento en implementarse.

En elDistribucionesvisión general, hay unaÚltima modificacióncampo que diceImplementandopor un tiempo después de cada cambio; Dependiendo del ancho de la pantalla y de la ventana del navegador, este campo puede estar oculto, por lo que la interfaz de usuario puede parecer que la distribución está en funcionamiento, cuando en realidad no es así.

distribución de prueba

  • obtener DomainNamede la respuesta
jq -r '.Distribution.DomainName' create-distribution.response.json
abcdefghij1234.cloudfront.net
  • pruebahttp
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>

Entonces la distribución redirige de http://abcdefghij1234.cloudfront.neta https://abcdefghij1234.cloudfront.net- como debería; para eso fue creado.

  • pruebahttps
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>
  • (formateado xml para facilitar la lectura)

Eso no tiene buena pinta. ¿No estás seguro de si eso es de esperarse?

Actualizar los registros de AWS Route 53

  • cambiar de usar el depósito S3 a usar la distribución CloudFront
  • Como antes, cree un archivo local temporal change-batch.apex.updatejsonejecutando sedel archivo anterior.change-batch.apex.json
  • utilizar UPSERTen lugar de CREATE: el registro ya existe y debe actualizarse.
  • HostedZoneId: reemplace el valor anterior Z3AQBSTGFYJSTF(para S3) por Z2FDTNDATAQYW2algún valor mágico tomado dechange-resource-record-setsdocumentos
  • DNSName: cita dechange-resource-record-setsdocumentos

Especifique el nombre de dominio que CloudFront asignó cuando creó su distribución.

Su distribución de CloudFront debe incluir un nombre de dominio alternativo que coincida con el nombre del conjunto de registros de recursos. Por ejemplo, si el nombre del conjunto de registros de recursos es acme.example.com, su distribución de CloudFront debe incluir acme.example.com como uno de los nombres de dominio alternativos.

--> reemplazar 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
  • contenido del archivo:
{
  "Changes": [
    {
      "Action": "UPSERT",
      "ResourceRecordSet": {
        "Name": "mydomain01.com.",
        "Type": "A",
        "AliasTarget": {
          "HostedZoneId": "Z2FDTNDATAQYW2",
          "DNSName": "abcdefghij1234.cloudfront.net",
          "EvaluateTargetHealth": false
        }
      }
    }
  ]
}
  • comando de shell
aws route53 change-resource-record-sets \
    --hosted-zone-id Z123456789EXAMPLE0SKX \
    --change-batch "file://$(pwd)/change-batch.apex.update.json"
  • respuesta similar a cuando se crean registros anteriores

probar el registro de dominio ápice

  • pruebahttp
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>
  • la respuesta ahora proviene de CloudFront y ya no de S3, por lo que el registro DNS actualizado parece funcionar :-)
  • prueba httpcon un camino
http http://mydomain01.com/some/path
 ... similar output as above ...

--> se ve bien

  • pruebahttps
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, formato xml para facilitar la lectura)

NOTA: Esta respuesta proviene de AmazonS3, no de CloudFrontla anterior. El depósito S3 no tiene restricciones de acceso de ningún tipo, entonces, ¿cómo puede haber unaacceso denegado?!?

verificar dos veces los permisos del depósito

aws s3api get-bucket-policy --bucket mydomain01.com

An error occurred (NoSuchBucketPolicy) when calling the GetBucketPolicy operation: The bucket policy does not exist

Eso coincide con el vacíoPolítica de depósitocampo en la consola AWS S3, pero ¿está realmente bien que no exista ninguna política de depósito?

Ahora que miramos hacia atrásdistribución de pruebaarriba, veo que la respuesta al acceso abcdefghij1234.cloudfront.netdirecto también proviene de S3, no de CloudFront, por lo que el problema parece ser bastante claro:

Mis preguntas #2

  1. ¿Por qué el depósito S3 deniega el acceso?
  2. ¿Es normal que un depósito de S3 no tenga ninguna política de acceso? ¿No suele tener depósitos "públicos" una política que permita explícitamente el acceso a cualquiera?
  3. Similar aun depósito S3 por ápice/subdominio¿Necesito también una distribución de CloudFront por vértice/subdominio?
  4. Si es así, supongo que agregar *.mydomain01.comun dominio alternativo al certificado (y a la distribución) realmente no tiene ningún sentido, ¿verdad? También necesitaría un certificado por distribución, dedicado a un dominio, ¿correcto?

Respuesta1

Estás en el camino correcto en general. Solo un comentario: se puede omitir Route53 si su dominio ya utiliza algún otro proveedor de servicios DNS.

P: ¿Se aplica el requisito "nombre del depósito == nombre de dominio" incluso si uso CloudFront?

No, si usa CloudFront. El CNAME se configura por separado en CloudFront.

P: ¿Necesito crear un depósito para cada dominio principal y cada subdominio?

No, no necesitas un depósito por dominio/subdominio.

¿Por qué el depósito S3 deniega el acceso?

Debes utilizar tu s3-website-us-east-1.amazonaws.comdominio como origen de CF.

¿Es normal que un depósito de S3 no tenga ninguna política de acceso? ¿No suele tener depósitos "públicos" una política que permita explícitamente el acceso a cualquiera?

Si usa el depósito solo para redirigir el tráfico, ninguna política de acceso debería estar bien.

De manera similar a un depósito de S3 por subdominio/ápice, ¿también necesito una distribución de CloudFront por subdominio/ápice?

Sí, necesita una distribución de CloudFront por dominio/subdominio porque una distribución puede adjuntar como máximo un certificado ACM.

Si es así, supongo que agregar *.mydomain01.comun dominio alternativo al certificado (y a la distribución) realmente no tiene ningún sentido, ¿verdad? También necesitaría un certificado por distribución, dedicado a un dominio, ¿correcto?

Agregar el dominio comodín tiene sentido ya que la distribución CF también necesita manejar el tráfico del subdominio.

Si tiene más preguntas, únase alChat de AWSy @yo en el chat.

información relacionada