AWS Gateway API: Bereitstellung mehrerer Regionen aus derselben Domäne

7

Ich habe ein von Lambda unterstütztes API-Gateway, das ich in zwei Regionen bereitgestellt habe. Diese beiden APIs sind völlig identisch. Ich habe zwei verschiedene URLs wie

* .execute-api.us-east-1.amazonaws.com * .execute-api.eu-west-1.amazonaws.com

Meine Idee war es, dieselben benutzerdefinierten Domänen in zwei Regionen zu definieren und die Geolokalisierungsfunktion Route53 zu verwenden, um die API aus der dem Benutzer nächstgelegenen Region bereitzustellen. Wenn ich jedoch nach dem Definieren der benutzerdefinierten URL in einer Region versuche, in der zweiten Region zu definieren, wird die Fehlermeldung angezeigt, dass diese Domäne bereits in einer anderen Cloudfront-Distribution definiert ist.

Ist dies ein Fehler oder welche Strategie kann ich für die Bereitstellung von API Gateway in mehreren Regionen verfolgen?

Vielen Dank.

Çağatay Gürtürk
quelle
Es ist kein Fehler - es entsteht eine Mehrdeutigkeit, wenn derselbe Domänenname auf mehreren CloudFront-Distributionen konfiguriert ist, da der eingehende Host:Header von CloudFront verwendet wird, um zu bestimmen, welche Distributionskonfiguration zur Verarbeitung der Anforderung verwendet werden soll. Das Verhalten ist also beabsichtigt und die Frage wird sein, wie man es umgeht. (Ich werde sehen, was ich mir einfallen lassen kann.) Sie möchten im Wesentlichen Geo- / Latenz-Routing verwenden, um Anforderungen von der nächstgelegenen API-Gateway-Bereitstellung basierend auf dem Standort des Anforderers unter Verwendung eines einzigen über das Internet zugänglichen Hostnamens zu bearbeiten. Ist das richtig?
Michael - sqlbot
Genau das möchte ich, um Benutzer zur nächsten Bereitstellung weiterzuleiten. Trotzdem konnte ich keine Lösung finden. Derzeit habe ich nur zwei verschiedene URLs mit der gleichen Funktionalität. Wie man sie unter einer einzigen URL kombiniert. Weiß nicht.
Çağatay Gürtürk
Ich würde auch gerne eine Antwort. Ich habe versucht, das selbst herauszufinden und bin leer aufgetaucht. Es scheint keine Möglichkeit zu geben, dies mit einem benutzerdefinierten Hostnamen zu erreichen, wodurch das API-Gateway derzeit nur von begrenztem Nutzen ist.
Cory Mawhorter

Antworten:

1

Dies ist derzeit leider nicht möglich . Der Hauptblocker hier ist CloudFront. MikeD @ AWS bietet die Informationen in ihren Foren:

Wenn Sie einen benutzerdefinierten Domänennamen erstellen, wird eine zugeordnete CloudFront-Verteilung für den Domänennamen erstellt, und CloudFront erzwingt die globale Eindeutigkeit des Domänennamens.

Wenn bereits eine CloudFront-Distribution mit dem Domänennamen vorhanden ist, schlägt die CreateCloudFrontDistribution fehl und das API-Gateway gibt einen Fehler zurück, ohne den Domänennamen zu speichern oder die zugehörigen APIs zu definieren.

Daher gibt es derzeit (29. Juni 2016) keine Möglichkeit, API Gateway in mehreren Regionen dazu zu bringen, denselben Domänennamen zu verarbeiten.

AWS hat kein Update zur Bereitstellung der erforderlichen Informationen, da am 4. Juli 2016 bestätigt wurde, dass eine offene Funktionsanforderung vorliegt. AWS Form-Thread für Updates

cixelsyd
quelle
0

Die Art und Weise, wie wir dies etwas gelöst haben, besteht darin, es tatsächlich durch Cloudfront zu konfrontieren. Dann fügen Sie in Cloudfront beide Endpunkte als Ursprung hinzu.

Nicht ich
quelle
3
Wie funktioniert das? CloudFront wählt immer den Ursprung mit dem Verhalten mit der höchsten Priorität aus, nicht den nächsten. Wenn beide denselben Inhalt haben, werden Sie immer Daten vom Ursprung mit dem Verhalten bereitstellen, das die höchste Priorität hat, und nichts vom anderen Ursprung.
Dave Stern
0

Ich habe ein paar Ideen.

CloudFront Wie oben erwähnt, können Sie mit CloudFront keinen Lastausgleich durchführen. Ihre Optionen scheinen also zu sein

  1. Verwenden Sie mit CloudFront einen einzelnen Ursprung. Die Latenz von 85 ms zwischen der Ost- und Westküste der USA ist nicht so schlecht. Verglichen mit der Latenz zwischen meinem Wohnort (Neuseeland) und den USA von bis zu 250 ms ist sie ziemlich gering.
  2. Entfernen Sie CloudFront und verwenden Sie das auf Route 53-Latenz basierende Routing, um das API-Gateway direkt zu erreichen. Damit können Sie so viele Regionen verwenden, wie Sie möchten - fügen Sie eine in Sydney / Asien hinzu, wenn Sie dort unten Kunden haben.
Tim
quelle
2 scheint nicht möglich zu sein
Jonathan
@ Jonathan könnten Sie bitte auf "nicht möglich" erweitern? Und irgendwelche alternativen Ideen? Ich habe API Gateway noch nie verwendet, daher ist es gut möglich, dass ich nicht ganz verstehe, wie es funktioniert.
Tim
Ich bin selbst darauf gestoßen, habe so ziemlich das erstellt, was Sie mit einer API-Gateway-Instanz in jeder Region beschrieben haben, und habe sogar die latenzbasierten Datensätze für jede Instanz in jeder Region erstellt, aber ich habe festgestellt, dass jeder CNAME, den Sie erstellen, ein Apigateway ist URL funktioniert nicht (nicht sicher warum), die einzige Möglichkeit, darauf zu verweisen, scheint eine Cloudfront-Distribution zu sein (für die der einzig gültige Datensatz ein A-Datensatz-Alias ​​in Route53 ist)
Jonathan
Ich habe es mir jedoch überlegt und denke, dass das Erstellen von Cloudfront-Verteilungen für jede Apigateway-Instanz die einfachste Lösung sein könnte, da latenzbasiertes Routing die Latenz zwischen dem 1) Benutzerstandort und 2) dem Upstream-Server (Apigateway) im Datensatz überprüft. Daher denke ich, wenn eine Apigateway-Cloudfront-Verteilung in us-east-1 im Vergleich zu einer Verteilung in Singapur eine geringere Latenz nach London (Benutzer) aufweist, wird latenzbasiertes Routing die us-east-1-Verteilung bevorzugen, und die Anfrage des Benutzers wird getroffen Die nächstgelegene Cloudfront knallt und führt zum Ursprungs-Apigateway in US-Ost-1
Jonathan,
Es hört sich für mich so an, als hätten Sie eine bessere Antwort als meine. Vielleicht könnten Sie eine neue Antwort erstellen, die anderen, die auf dasselbe Problem stoßen, eine bessere Anleitung bietet?
Tim