AWS: Wie leite ich viele Domänen auf eine Seite einer anderen Domäne um?

AWS: Wie leite ich viele Domänen auf eine Seite einer anderen Domäne um?

Mein Ziel

Ich habe mehrere Domänen (z. B. 10 oder 20) und möchte diese umleitenbeliebigBesucher zuüberallauf diesen Seiten zu einer Seite in einer anderen Domäne (beispielsweise meiner Profilseite auf stackoverflow.com).

Das beinhaltet

  1. Apex-Domäne verwenden http(zB http://mydomain01.com)
  2. Apex-Domäne verwenden https(zB https://mydomain01.com)
  3. Subdomains mit http(zB http://www.mydomain01.comoder http://blog.mydomain01.com)
  4. Subdomains mit https(zB https://www.mydomain01.comoder https://blog.mydomain01.com)
  5. beliebige Pfade (zB http://mydomain01.com/some_pathoder https://www.mydomain01.com/another/path.html)

und dasselbe für alle meine anderen Domänen ( mydomain02.com,, mydomain03.comusw.; jeweils mit den oben genannten Anwendungsfällen).

Meine Forschung

  1. Dieser AWS-Artikelerklärt, wie man Internetverkehr von einer Apex-Domäne auf eine andere Domäne umleitet (Fall Nr. 1 in meinemDas beinhaltetListe oben) mitAWS S3UndAWS Route 53: Dies funktioniert für http, aber nicht für https.
  2. Dieser AWS-Artikelerklärt, wie man den Internetverkehr für eine Reihe von Fällen umleitet (wie es aussieht, deckt es alle Fälle in meinemDas beinhaltetListe oben) mitAWS S3,AWS Route 53UndAWS CloudFront: Dies funktioniert sowohl für httpals auch für https. (Es wird auch über die Verwendung eines Application Load Balancers gesprochen, aber das geht hier wohl über den Rahmen hinaus …)
  3. Dieser AWS-Artikelfügt einige weitere Details zum Einrichten einer CloudFront-Verteilung und zum Erhalt von Einblick in Protokolldateien hinzu.
  4. Dieser AWS-Artikeldokumentiert Umleitungsregeln zur Verwendung erweiterter bedingter Umleitungen: Ich bin nicht sicher, ob ich dorthin gehen muss, um mein Ziel zu erreichen, daher habe ich mich noch nicht wirklich damit befasst.

Außerdem gibt es natürlich jede Menge SO-Fragen (sieheVerwandtrechts neben dieser Frage) und andere Beiträge zu diesem Thema. Das Problem bei den meisten davon besteht darin, dass sie Screenshots aus früheren Versionen der AWS Console-Benutzeroberfläche verwenden: Die meisten Inhalte sollten noch dieselben sein, aber die Korrelation dieser Screenshots mit der aktuellen Benutzeroberfläche fügt meiner Meinung nach eine weitere Ebene der Verwirrung hinzu.

Wichtige Erkenntnisse aus den AWS-Dokumenten (und anderen Dokumenten):

  1. Ich muss einen Bucket in AWS S3 erstellen und darin die Umleitung konfigurieren.
  2. Ich muss eine Verteilung in AWS CloudFront erstellen;
  3. Um eine benutzerdefinierte Domäne in CloudFront zu verwenden, muss ich ein Zertifikat in AWS ACM erstellen.
  4. Ich muss eine gehostete Zone in AWS Route 53 erstellen und darin Datensätze konfigurieren.

Meine bisherige Arbeit

Die neueste AWS CLI ist installiert regionund outputin konfiguriert ~/.aws/config, die Anmeldeinformationen sind in eingerichtet ~/.aws/credentials(jeweils für jedes AWS-Konto).AWS_*Umgebungsvariablensind exported.

Ich verwende US East (N. Virginia) (us-east-1)für alles die AWS-Region, um zusätzliche Probleme zu vermeiden, die durch die Nichtverfügbarkeit von AWS-Ressourcen in einer Region verursacht werden.

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

Ich lasse sämtliche Shell-Eingabeaufforderungen oder >Shell-Zeilenfortsetzungszeichen weg, um das Kopieren von diesem Beitrag in die Shell zu erleichtern.

Einrichten eines S3-Buckets

Warnung:Dadurch wird ein „rein öffentlicher“ Bucket ohne Zugriffsbeschränkungen erstellt. In diesem Fall sollte dies keine Rolle spielen, da es keinen Bucket-Inhalt zu schützen gibt, aber ein solcher öffentlicher Bucket ist im Allgemeinen eine schlechte Praxis. Außerdem verwende ich einen öffentlichen Bucket, um zusätzliche Probleme durch Zugriffsbeschränkungen zu vermeiden:Erstens: Sorgen Sie für die Funktionsfähigkeit, zweitens: für die Sicherheit.

Erstelle den Bucket

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

Umleitung einrichten

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

Erwischt:Der S3-Bucket-Name muss mit dem Apex-Domänennamen übereinstimmen.

Die Verwendung eines beliebigen Bucket-Namens mydomain01.com(für mein Beispiel) scheint jedoch zu scheitern, ohne dass ein Hinweis auf die Ursache vorliegt. Die AWS-Dokumente machen dies nicht wirklich deutlich - tatsächlich bin ich mir immer noch nicht sicher, ob ich hier etwas massiv missverstehe, aber soweit ich das beurteilen kann, ist die offizielle AWS-Dokumentation in diesem - meiner Meinung nach - entscheidenden Punkt tatsächlich etwas schlampig: Zum Beispiel#2sagt nur

  1. Erstellen Sie einen S3-Bucket mit einem weltweit eindeutigen Namen.

Das könnte seinbeliebigglobal eindeutiger Name.#1erwähnt das in gewisser Weise – wenn man erst einmal weiß, wie man diese Teile liest …

Nebenbei bemerkt, dieser Artikel Nr. 2 verwirrt mich weiterhin mit

Wenn Sie keine benutzerdefinierte Domäne verwenden ...

Warum sollte ichnichteine benutzerdefinierte Domäne verwenden?!? Der Sinn des Ganzen besteht doch darin, meine benutzerdefinierte Domäne umzuleiten, oder nicht?!? Na ja, jedenfalls...

Erwischt:Dem Hostnamen darf kein Protokoll vorangestellt werden.

Weder die AWS-Konsole noch die AWS-CLI scheinen zu prüfen, ob ein Protokoll ( http://oder https://) in dasHostnameUI-Feld / im HostNameJSON-String übergeben. Wenn jedoch eins vorangestellt wird, schlägt die Umleitung fehl; sieheTestumleitungunten.

Erwischt:Fehler in der Benutzeroberfläche der AWS S3-Konsole.

Nachdem die Umleitung eingerichtet wurde, zeigt die AWS-Konsole in ihrer Benutzeroberfläche einen anklickbaren Link zur Bucket-URL ( http://mydomain01.com.s3-website-us-east-1.amazonaws.com) ganz unten im Bucket an.Eigenschaftenin der RegisterkarteStatisches Website-HostingAbschnitt.

Wenn Sie auf diesen Link klicken, wird die Seite nicht geöffnet. Der Grund dafür ist anscheinend, dass die AWS-Konsole die URL durcheinanderbringt und versucht, sie zu öffnen http://https//stackoverflow.com/users/217844/ssc/, unabhängig vom Protokoll.

Testumleitung

  • mitHTTPiein der Schale statt curloder wgetweil das das ist, was die coolen Kids heutzutage zu verwenden scheinen
  • Kopieren Sie den Link von der AWS-Konsole im Browser in die 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

--> scheint zu funktionieren

  • Testen Sie die Umleitung, wenn das Protokoll fälschlicherweise dem Hostnamen vorangestellt wurde. Beachten Sie die fehlerhafte LocationURL:
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

Meine Fragen #1

HINWEIS: Diese Fragen stellte ich mir, als ich begann, dies zu schreiben.denkenIch konnte sie selbst beantworten, da (sieheTesten Sie wwwden Subdomäneneintragunten). Korrigiert mich bitte, wenn ich falsch liege:

  1. Q:Gilt die Anforderung „Bucket-Name == Domänenname“, auch wenn ich CloudFront verwende?
    A:Ja.
  2. Q:Muss ich für die Apex-Domäne und jede Subdomäne jeweils einen Bucket erstellen? In meinem Beispiel
    • mydomain01.com
    • www.mydomain01.com
    • blog.mydomain01.com?
      A:Ja.

Einrichten einer gehosteten Route 53-Zone

Erstellen Sie die gehostete Zone

aws route53 create-hosted-zone --caller-reference "$(date '+%Y%m%d-%H%M%S')" --name mydomain01.com
  • Antwort
{
    "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"
        ]
    }
}
  • notieren Sie sich die gehostete Zonen-ID Z123456789EXAMPLE0SKX, die in den nächsten Schritten benötigt wird

Erstellen Sie einen Datensatz für die Apex-Domäne

  • AWS Route 53 change-resource-record-sets-Dokumente
  • das sollte funktionieren für http, aber nicht fürhttps
  • Das zu übergebende JSON ist etwas komplex. Erstellen Sie eine lokale temporäre Datei change-batch.apex.jsonmit dem folgenden Inhalt
  • Werte abrufen für HostedZoneIdund DNSNamevonAmazon S3-Website-Endpunkte: Bucket wurde in erstellt US East (N. Virginia), also verwenden SieZ3AQBSTGFYJSTF
{
  "Changes": [
    {
      "Action": "CREATE",
      "ResourceRecordSet": {
        "Name": "mydomain01.com.",
        "Type": "A",
        "AliasTarget": {
          "HostedZoneId": "Z3AQBSTGFYJSTF",
          "DNSName": "s3-website-us-east-1.amazonaws.com",
          "EvaluateTargetHealth": false
        }
      }
    }
  ]
}

Erwischt:Muss wörtlich verwendet werden s3-website-us-east-1.amazonaws.comfür DNSName.

In AWS-Dokumenten wird an allen möglichen Stellen über example.comoder example.com.s3-website-us-east-1.amazonaws.comusw. gesprochen. In diesem Fall handelt es sich nicht um ein Beispiel, das durch eigene Werte (z. B. mydomain01.com.s3-website-us-east-1.amazonaws.com) ersetzt werden kann, sondernder wörtliche Wert aus demTisch, dhs3-website-us-east-1.amazonaws.com.

Erwischt:Dem Hostnamen darf kein Protokoll vorangestellt werden.

Ähnlich wie bei dem oben genannten Problem akzeptieren sowohl die AWS-Konsole als auch die AWS-CLI gerne ein Protokoll ( http://oder https://), das dem im Feld eingegebenen Wert vorangestellt wird.HostnameUI-Feld / übergeben als DNSName. Zumindest sieht das so aussehrFehler in der Konsole, zBhttp\072\057\057mydomain01.s3-website-us-east-1.amazonaws.com.

Beide Fallstricke werden in der AWS-Konsole etwas abgemildert, da dort beim Erstellen oder Bearbeiten eines Datensatzes Werte aus einer Dropdown-Box ausgewählt werden können. Bei Verwendung der AWS CLI müssen Sie doppelt prüfen, was Sie senden.

Derselbe Haken und die gleiche Milderung gelten für dieDatensatznameUI-Feld/ NameJSON-Wert.

Erstellen Sie einen Datensatz für die Apex-Domäne, Fortsetzung.

  • verwendenjqfür einen schnellen Test enthält die temporäre Datei gültige JSON
jq . < change-batch.apex.json 1> /dev/null
  • keine Ausgabe --> gültiges JSON
aws route53 change-resource-record-sets --hosted-zone-id Z123456789EXAMPLE0SKX \
    --change-batch "file://$(pwd)/change-batch.apex.json"
  • Antwort
{
    "ChangeInfo": {
        "Id": "/change/C1234567890EXAMPLESKX",
        "Status": "PENDING",
        "SubmittedAt": "2021-08-02T14:20:09.370000+00:00"
    }
}

Testen Sie den Apex-Domänendatensatz

  • prüfenhttp
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

--> sieht gut aus

  • Test httpmit einem Pfad
http http://mydomain01.com/some/path
 ... similar output as above ...
  • prüfenhttps
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/
  • (Antwort zur besseren Lesbarkeit umbrochen)

--> Zeitüberschreitung (nach 60s?) - wie erwartet: Umleitung über einen S3-Bucket funktioniert nicht https(siehe oben)

Erwischt:Verzögerung bei der Ausbreitung von DNS-Änderungen.

AWS und Google sindsehrschnell in Bezug auf die Verbreitung von Änderungen an DNS-Einstellungen (in Sekunden oder Minuten), aber es können andere, „langsamere“ Nameserver beteiligt sein. Umgehen Sie diese wie beschriebenHierum diese Verwirrungsquelle zu beseitigen. Dieser Ansatz funktioniert nur unter macOS, aber das Konzept ist für alle Betriebssysteme gleich.

Erwischt:Browser-Cache.

Wenn ich DNS-Änderungen nicht in der Shell, sondern im Browser teste, kann der Browser Ergebnisse aus seinem Cache abrufen. Ich erledige die meiste Arbeit mit Chrome, verwende aber Firefox (oder Safari) zum Testen, sodass ich vor jedem Test den gesamten Cache leeren kann, um dieses potenzielle Problem zu beseitigen – ohne mich von Google, AWS usw. abmelden zu müssen.

Erstellen Sie einen Datensatz für wwwdie Subdomäne

  • der einzige Unterschied ist der NameJSON-Wert
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
  • Antwort ähnlich wie oben

Testen Sie wwwden Subdomäneneintrag

  • prüfenhttp
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>
  • Ich denke, das beantwortet die zweite FrageMeine Fragen #1oben: Ich brauche einen S3-Bucket pro Apex/Subdomäne zum Weiterleiten.

Einrichten einer CloudFront-Verteilung

  • HINWEIS: Mit der AWS Console ist es ganz einfach,Zertifikat anfordernund validieren Sie es mithilfe von DNS.

Zertifikat erstellen

  • AWS ACM- request-certificateDokumente
  • Das Zertifikat soll für die Apex-Domäne und alle Subdomänen funktionieren.Fügen Sie diesem Zertifikat einen weiteren Namen hinzu/ bestehen --subject-alternative-names; sehendieser AWS-Artikel(das obere blaue Kästchen).
  • Fügen Sie Anführungszeichen hinzu *.mydomain01.com, damit die Shell das*
aws acm request-certificate --domain-name mydomain01.com --validation-method DNS \
    --subject-alternative-names '*.mydomain01.com'
  • Antwort:
{
    "CertificateArn": "arn:aws:acm:us-east-1:123456789012:certificate/12345678-90ab-cdef-1234-1234567890ab"
}
  • 123456789012ist meine AWS-Konto-ID; alles danach certificate/ist nur eine UUID

Zertifikatsdetails abrufen

  • AWS ACM- describe-certificateDokumente
  • Antwort in temporärer lokaler Datei speichern; extrahieren ResourceRecord.Nameund ResourceRecord.Valueverwendenjq
  • erforderlich für den AWS Route 53-Datensatz, der beweist, dass ich besitzemydomain01.com
  • Alternativ verwenden Sie --queryden Parameter mitaws 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.

Erstellen Sie einen Route 53-Eintrag zur Zertifikatsvalidierung

  • wird automatisch von AWS ACM überprüft und das Zertifikat wird validiert, sobald dieser Datensatz gefunden wird
  • wie bisher, verwenden Sie eine temporäre lokale Datei change-batch.cert.json, siehe zBErstellen Sie einen Datensatz für die Apex-Domäne; Inhalt:
{
  "Changes": [
    {
      "Action": "CREATE",
      "ResourceRecordSet": {
        "Name": "_1234567890abcdef1234567890abcdef.mydomain01.com.",
        "Type": "CNAME",
        "TTL": 300,
        "ResourceRecords": [
          {
            "Value": "_1234567890abcdef1234567890abcdef.weirdchars.acm-validations.aws."
          }
        ]
      }
    }
  ]
}
  • Shell-Befehl:
aws route53 change-resource-record-sets --hosted-zone-id Z123456789EXAMPLE0SKX \
    --change-batch "file://$(pwd)/change-batch.cert.json
  • Antwort ähnlich wie beim Erstellen von Datensätzen oben
  • HINWEIS: Es kann einige Minuten dauern, bis ACM das Zertifikat validiert.

Erstellen Sie die CloudFront-Verteilung

  • AWS CloudFront create-distribution-Dokumente
  • muss wiederum CallerReferenceeinfach eine eindeutige Zeichenfolge sein; verwenden Sie eg date '+%Y%m%d-%H%M%S'in der Shell zum Erstellen und Kopieren in eine Datei; sieheErstellen Sie die gehostete Zone
  • wie bisher, für komplexe Werte temporäre lokale Datei verwenden create-distribution.json, Inhalt unten
  • MinimumProtocolVersion: Wert erhalten vondieser AWS-Artikel
  • OriginProtocolPolicy: verwenden, http-onlyweil der Ursprung (der S3-Bucket) nurhttp
  • ViewerProtocolPolicy: redirect-to-httpsDer Sinn und Zweck dieser Verteilung besteht in der Umleitung von httpnachhttps
  • HINWEIS: Ich weiß nicht (und die AWS-Dokumente sagen es nicht), welche Felder zwingend erforderlich sind. Der AWS CLI-Befehl zeigt eine klare und detaillierte Meldung an, wenn etwas an den gesendeten Daten fehlt oder falsch ist.
{
    "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
}
  • Shell-Befehl:
  • HINWEIS: Fügen Sie hinzu, --no-cli-pagerum die Paging-Funktion zu deaktivieren und die Antwort zur Überprüfung in einer temporären lokalen Datei zu speichern
aws --no-cli-pager cloudfront create-distribution \
    --distribution-config "file://$(pwd)/create-distribution.json"
 > create-distribution.response.json
  • Antwort: eine große JSON-Struktur, hauptsächlich die Konfiguration mit einigen Metadaten zur Verteilung

Erwischt:Die Bereitstellung der CloudFront-Verteilung dauert einen Moment.

ImAusschüttungenÜberblick gibt es eineZuletzt bearbeitetFeld mit der AufschriftBereitstellenfür eine Weile nach jeder Änderung; je nach Bildschirm und Breite des Browserfensters kann dieses Feld ausgeblendet sein, sodass die Benutzeroberfläche aussehen könnte, als sei die Distribution aktiv, obwohl dies in Wirklichkeit nicht der Fall ist.

Testverteilung

  • DomainNamevon Antwort erhalten
jq -r '.Distribution.DomainName' create-distribution.response.json
abcdefghij1234.cloudfront.net
  • prüfenhttp
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>

Die Verteilung wird also wie vorgesehen von http://abcdefghij1234.cloudfront.netnach umgeleitet https://abcdefghij1234.cloudfront.net, denn dafür wurde sie erstellt.

  • prüfenhttps
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-formatiert zur besseren Lesbarkeit)

Das sieht nicht gut aus. Nicht sicher, ob das zu erwarten ist?!?

Aktualisieren Sie die AWS Route 53-Datensätze

  • Wechsel von der Verwendung des S3-Buckets zur Verwendung der CloudFront-Verteilung
  • wie zuvor, erstellen Sie eine temporäre lokale Datei change-batch.apex.updatejsondurch seding der früheren Dateichange-batch.apex.json
  • Verwenden Sie UPSERTstattdessen CREATE: Der Datensatz existiert bereits und muss aktualisiert werden.
  • HostedZoneId: Ersetzen Sie den alten Wert Z3AQBSTGFYJSTF(für S3) durch Z2FDTNDATAQYW2einen magischen Wert auschange-resource-record-setsDokumente
  • DNSName: Zitat auschange-resource-record-setsDokumente

Geben Sie den Domänennamen an, den CloudFront beim Erstellen Ihrer Verteilung zugewiesen hat.

Ihre CloudFront-Verteilung muss einen alternativen Domänennamen enthalten, der mit dem Namen des Ressourcendatensatzes übereinstimmt. Wenn der Name des Ressourcendatensatzes beispielsweise acme.example.com lautet, muss Ihre CloudFront-Verteilung acme.example.com als einen der alternativen Domänennamen enthalten.

--> ersetzen s3-website-us-east-1.amazonaws.com(für S3) durch 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
  • Dateiinhalt:
{
  "Changes": [
    {
      "Action": "UPSERT",
      "ResourceRecordSet": {
        "Name": "mydomain01.com.",
        "Type": "A",
        "AliasTarget": {
          "HostedZoneId": "Z2FDTNDATAQYW2",
          "DNSName": "abcdefghij1234.cloudfront.net",
          "EvaluateTargetHealth": false
        }
      }
    }
  ]
}
  • Shell-Befehl
aws route53 change-resource-record-sets \
    --hosted-zone-id Z123456789EXAMPLE0SKX \
    --change-batch "file://$(pwd)/change-batch.apex.update.json"
  • Antwort ähnlich wie beim Erstellen von Datensätzen oben

Testen Sie den Apex-Domänendatensatz

  • prüfenhttp
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>
  • die Antwort kommt jetzt von CloudFront und nicht mehr von S3, also scheint der aktualisierte DNS-Eintrag zu funktionieren :-)
  • Test httpmit einem Pfad
http http://mydomain01.com/some/path
 ... similar output as above ...

--> sieht gut aus

  • prüfenhttps
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>
  • (wie zuvor, zur besseren Lesbarkeit im XML-Format)

HINWEIS: Diese Antwort kommt von AmazonS3, nicht von CloudFrontwie die vorherige. Der S3-Bucket hat keinerlei Zugriffsbeschränkungen - wie kann es also eineZugriff abgelehnt?!?

Überprüfen Sie die Bucket-Berechtigungen noch einmal

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

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

Das entspricht dem leerenBucket-RichtlinieFeld in der AWS S3-Konsole – aber ist es wirklich in Ordnung, dass es überhaupt keine Bucket-Richtlinie gibt?!?

Nun, dieser Blick zurück aufTestverteilungOben sehe ich, dass die Antwort auf den abcdefghij1234.cloudfront.netdirekten Zugriff auch von S3 und nicht von CloudFront kommt. Das Problem scheint also ziemlich klar zu sein:

Meine Fragen #2

  1. Warum verweigert der S3-Bucket den Zugriff?
  2. Ist es normal, dass ein S3-Bucket überhaupt keine Zugriffsrichtlinie hat? Haben „öffentliche“ Buckets normalerweise keine Richtlinie, die jedem ausdrücklich Zugriff gewährt?
  3. Ähnlich zuein S3-Bucket pro Apex/Subdomäne, brauche ich auch eine CloudFront-Verteilung pro Apex/Subdomäne?
  4. Wenn ja, dann *.mydomain01.commacht es wohl keinen Sinn, dem Zertifikat (und der Distribution) eine alternative Domain hinzuzufügen, oder?!? Ich bräuchte auch ein Zertifikat pro Distribution, das einer Domain zugeordnet ist, richtig?

Antwort1

Im Großen und Ganzen sind Sie auf dem richtigen Weg. Nur ein Kommentar: Route53 kann weggelassen werden, wenn Ihre Domain bereits einen anderen DNS-Dienstanbieter verwendet.

F: Gilt die Anforderung „Bucket-Name == Domänenname“, auch wenn ich CloudFront verwende?

Nein, wenn Sie CloudFront verwenden. Der CNAME wird in CloudFront separat konfiguriert.

F: Muss ich für die Apex-Domäne und jede Subdomäne jeweils einen Bucket erstellen?

Nein, Sie benötigen nicht einen Bucket pro Domäne/Subdomäne.

Warum verweigert der S3-Bucket den Zugriff?

Sie sollten Ihre s3-website-us-east-1.amazonaws.comDomäne als CF-Ursprung verwenden.

Ist es normal, dass ein S3-Bucket überhaupt keine Zugriffsrichtlinie hat? Haben „öffentliche“ Buckets normalerweise keine Richtlinie, die jedem ausdrücklich Zugriff gewährt?

Wenn Sie den Bucket nur zum Umleiten des Datenverkehrs verwenden, reicht eine fehlende Zugriffsrichtlinie in der Regel aus.

Benötige ich, ähnlich wie bei einem S3-Bucket pro Apex/Subdomäne, auch eine CloudFront-Verteilung pro Apex/Subdomäne?

Ja, Sie benötigen eine CloudFront-Verteilung pro Domäne/Subdomäne, da eine Verteilung höchstens ein ACM-Zertifikat anhängen kann.

Wenn ja, dann *.mydomain01.commacht es wohl keinen Sinn, dem Zertifikat (und der Distribution) eine alternative Domain hinzuzufügen, oder?!? Ich bräuchte auch ein Zertifikat pro Distribution, das einer Domain zugeordnet ist, richtig?

Das Hinzufügen der Platzhalterdomäne ist sinnvoll, da die CF-Verteilung auch den Subdomänenverkehr verarbeiten muss.

Wenn Sie weitere Fragen haben, kontaktieren Sie bitteAWS-Chatund @ mich im Chat.

verwandte Informationen