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
- Apex-Domäne verwenden
http
(zBhttp://mydomain01.com
) - Apex-Domäne verwenden
https
(zBhttps://mydomain01.com
) - Subdomains mit
http
(zBhttp://www.mydomain01.com
oderhttp://blog.mydomain01.com
) - Subdomains mit
https
(zBhttps://www.mydomain01.com
oderhttps://blog.mydomain01.com
) - beliebige Pfade (zB
http://mydomain01.com/some_path
oderhttps://www.mydomain01.com/another/path.html
)
und dasselbe für alle meine anderen Domänen ( mydomain02.com
,, mydomain03.com
usw.; jeweils mit den oben genannten Anwendungsfällen).
Meine Forschung
- 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ürhttps
. - 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
http
als auch fürhttps
. (Es wird auch über die Verwendung eines Application Load Balancers gesprochen, aber das geht hier wohl über den Rahmen hinaus …) - Dieser AWS-Artikelfügt einige weitere Details zum Einrichten einer CloudFront-Verteilung und zum Erhalt von Einblick in Protokolldateien hinzu.
- 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):
- Ich muss einen Bucket in AWS S3 erstellen und darin die Umleitung konfigurieren.
- Ich muss eine Verteilung in AWS CloudFront erstellen;
- Um eine benutzerdefinierte Domäne in CloudFront zu verwenden, muss ich ein Zertifikat in AWS ACM erstellen.
- Ich muss eine gehostete Zone in AWS Route 53 erstellen und darin Datensätze konfigurieren.
Meine bisherige Arbeit
Die neueste AWS CLI ist installiert region
und output
in konfiguriert ~/.aws/config
, die Anmeldeinformationen sind in eingerichtet ~/.aws/credentials
(jeweils für jedes AWS-Konto).AWS_*
Umgebungsvariablensind export
ed.
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-
put-bucket-website
Dokumente - es hat keinen Sinn, mein SO-Profil zu redigieren …
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
- 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 HostName
JSON-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
- mit
HTTPie
in der Schale stattcurl
oderwget
weil 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
Location
URL:
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 www
den Subdomäneneintragunten). Korrigiert mich bitte, wenn ich falsch liege:
- Q:Gilt die Anforderung „Bucket-Name == Domänenname“, auch wenn ich CloudFront verwende?
A:Ja. - 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 Route 53
create-hosted-zone
-Dokumente caller-reference
muss einfach eine eindeutige Zeichenfolge sein
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.json
mit dem folgenden Inhalt - Werte abrufen für
HostedZoneId
undDNSName
vonAmazon S3-Website-Endpunkte: Bucket wurde in erstelltUS 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.com
für DNSName
.
In AWS-Dokumenten wird an allen möglichen Stellen über example.com
oder example.com.s3-website-us-east-1.amazonaws.com
usw. 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/ Name
JSON-Wert.
Erstellen Sie einen Datensatz für die Apex-Domäne, Fortsetzung.
- verwenden
jq
fü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üfen
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
--> sieht gut aus
- Test
http
mit einem Pfad
http http://mydomain01.com/some/path
... similar output as above ...
- prüfen
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/
- (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 www
die Subdomäne
- der einzige Unterschied ist der
Name
JSON-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 www
den Subdomäneneintrag
- prüfen
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>
- 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-certificate
Dokumente - 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"
}
123456789012
ist meine AWS-Konto-ID; alles danachcertificate/
ist nur eine UUID
Zertifikatsdetails abrufen
- AWS ACM-
describe-certificate
Dokumente - Antwort in temporärer lokaler Datei speichern; extrahieren
ResourceRecord.Name
undResourceRecord.Value
verwendenjq
- erforderlich für den AWS Route 53-Datensatz, der beweist, dass ich besitze
mydomain01.com
- Alternativ verwenden Sie
--query
den 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
CallerReference
einfach eine eindeutige Zeichenfolge sein; verwenden Sie egdate '+%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-ArtikelOriginProtocolPolicy
: verwenden,http-only
weil der Ursprung (der S3-Bucket) nurhttp
ViewerProtocolPolicy
:redirect-to-https
Der Sinn und Zweck dieser Verteilung besteht in der Umleitung vonhttp
nachhttps
- 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-pager
um 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
DomainName
von Antwort erhalten
jq -r '.Distribution.DomainName' create-distribution.response.json
abcdefghij1234.cloudfront.net
- prüfen
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>
Die Verteilung wird also wie vorgesehen von http://abcdefghij1234.cloudfront.net
nach umgeleitet https://abcdefghij1234.cloudfront.net
, denn dafür wurde sie erstellt.
- prüfen
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-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.updatejson
durchsed
ing der früheren Dateichange-batch.apex.json
- Verwenden Sie
UPSERT
stattdessenCREATE
: Der Datensatz existiert bereits und muss aktualisiert werden. HostedZoneId
: Ersetzen Sie den alten WertZ3AQBSTGFYJSTF
(für S3) durchZ2FDTNDATAQYW2
einen magischen Wert auschange-resource-record-sets
DokumenteDNSName
: Zitat auschange-resource-record-sets
Dokumente
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üfen
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>
- die Antwort kommt jetzt von CloudFront und nicht mehr von S3, also scheint der aktualisierte DNS-Eintrag zu funktionieren :-)
- Test
http
mit einem Pfad
http http://mydomain01.com/some/path
... similar output as above ...
--> sieht gut aus
- prüfen
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>
- (wie zuvor, zur besseren Lesbarkeit im XML-Format)
HINWEIS: Diese Antwort kommt von AmazonS3
, nicht von CloudFront
wie 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.net
direkten Zugriff auch von S3 und nicht von CloudFront kommt. Das Problem scheint also ziemlich klar zu sein:
Meine Fragen #2
- Warum verweigert der S3-Bucket den Zugriff?
- Ist es normal, dass ein S3-Bucket überhaupt keine Zugriffsrichtlinie hat? Haben „öffentliche“ Buckets normalerweise keine Richtlinie, die jedem ausdrücklich Zugriff gewährt?
- Ähnlich zuein S3-Bucket pro Apex/Subdomäne, brauche ich auch eine CloudFront-Verteilung pro Apex/Subdomäne?
- Wenn ja, dann
*.mydomain01.com
macht 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.com
Domä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.com
macht 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.