View a markdown version of this page

Zusammenführen von APIs in AWS AppSync - AWS AppSync GraphQL

Die vorliegende Übersetzung wurde maschinell erstellt. Im Falle eines Konflikts oder eines Widerspruchs zwischen dieser übersetzten Fassung und der englischen Fassung (einschließlich infolge von Verzögerungen bei der Übersetzung) ist die englische Fassung maßgeblich.

Zusammenführen von APIs in AWS AppSync

Wenn die Verwendung von GraphQL innerhalb eines Unternehmens zunimmt, können Kompromisse zwischen der Benutzerfreundlichkeit der API und der Geschwindigkeit der API-Entwicklung entstehen. Einerseits verwenden AWS AppSync Unternehmen GraphQL, um die Anwendungsentwicklung zu vereinfachen. Dies gibt Entwicklern eine flexible API, mit der sie mit einem einzigen Netzwerkaufruf sicher auf Daten aus einer oder mehreren Datendomänen zugreifen, diese bearbeiten und kombinieren können. Andererseits möchten Teams innerhalb einer Organisation, die für die verschiedenen Datendomänen verantwortlich sind, die zu einem einzigen GraphQL-API-Endpunkt zusammengefasst sind, möglicherweise die Möglichkeit, API-Updates unabhängig voneinander zu erstellen, zu verwalten und bereitzustellen. Dies erhöht ihre Entwicklungsgeschwindigkeit.

Um diese Spannung zu lösen, ermöglicht die Funktion „ AWS AppSync Zusammengeführte APIs“ Teams aus verschiedenen Datendomänen, unabhängig voneinander AWS AppSync APIs (z. B. GraphQL-Schemas, Resolver, Datenquellen und Funktionen) zu erstellen und bereitzustellen, die dann zu einer einzigen, zusammengeführten API kombiniert werden können. Dies gibt Unternehmen die Möglichkeit, eine einfach zu verwendende, domänenübergreifende API zu verwalten, und den verschiedenen Teams, die zu dieser API beitragen, die Möglichkeit, API-Updates schnell und unabhängig voneinander vorzunehmen.

Das folgende Diagramm zeigt den zusammengeführten API-Workflow:

Das Diagramm zeigt den zusammengeführten API-Workflow, wobei mehrere Quell-APIs zu einem einzigen zusammengeführten API-Endpunkt kombiniert werden

Mithilfe zusammengeführter APIs können Unternehmen die Ressourcen mehrerer unabhängiger AWS AppSync Quell-APIs in einen einzigen AWS AppSync zusammengeführten API-Endpunkt importieren. Zu diesem Zweck AWS AppSync können Sie eine Liste von AWS AppSync Quell-APIs erstellen und dann alle mit den Quell-APIs verknüpften Metadaten, einschließlich Schema, Typen, Datenquellen, Resolver und Funktionen, in einer neuen AWS AppSync zusammengeführten API zusammenführen.

Bei Zusammenführungen besteht die Möglichkeit, dass ein Zusammenführungskonflikt aufgrund von Inkonsistenzen im Quell-API-Dateninhalt auftritt, z. B. aufgrund von Typbenennungskonflikten beim Kombinieren mehrerer Schemas. Für einfache Anwendungsfälle, in denen keine Definitionen in den Quell-APIs in Konflikt geraten, müssen die Quell-API-Schemas nicht geändert werden. Die daraus resultierende zusammengeführte API importiert einfach alle Typen, Resolver, Datenquellen und Funktionen aus den ursprünglichen AWS AppSync Quell-APIs. Bei komplexen Anwendungsfällen, in denen Konflikte auftreten, users/teams müssen die Konflikte auf verschiedene Weise gelöst werden. AWS AppSync stellt Benutzern verschiedene Tools und Beispiele zur Verfügung, mit denen Merge-Konflikte reduziert werden können.

Nachfolgende Zusammenführungen, die in konfiguriert sind, übertragen Änderungen, AWS AppSync die an den Quell-APIs vorgenommen wurden, an die zugehörige Merge-API.

Zusammengeführte APIs und Verbund

In der GraphQL-Community gibt es viele Lösungen und Muster, um GraphQL-Schemas zu kombinieren und die Teamzusammenarbeit über ein gemeinsames Diagramm zu ermöglichen. AWS AppSync Zusammengeführte APIs verfolgen bei der Schemakomposition einen Build-Time-Ansatz, bei dem Quell-APIs zu einer separaten, zusammengeführten API kombiniert werden. Ein alternativer Ansatz besteht darin, einen Runtime-Router über mehrere Quell-APIs oder Unterdiagramme zu verteilen. Bei diesem Ansatz empfängt der Router eine Anfrage, verweist auf ein kombiniertes Schema, das er als Metadaten verwaltet, erstellt einen Anforderungsplan und verteilt dann die Anforderungselemente auf die zugrunde liegenden Sub-. graphs/servers In der folgenden Tabelle wird der Build-Time-Ansatz AWS AppSync der Merged-API mit routerbasierten Laufzeitansätzen für die GraphQL-Schemakomposition verglichen:

Feature AppSync Zusammengeführte API Router-based Lösungen
Sub-graphs unabhängig verwaltet Ja Ja
Sub-graphs unabhängig adressierbar Ja Ja
Automatisierte Schemakomposition Ja Ja
Automatisierte Konflikterkennung Ja Ja
Konfliktlösung über Schema-Direktiven Ja Ja
Unterstützte Subgraph-Server AWS AppSync* Variiert
Komplexität des Netzwerks Eine einzige, zusammengeführte API bedeutet, dass keine zusätzlichen Netzwerk-Hops erforderlich sind. Multi-layer Die Architektur erfordert die Planung und Delegierung von Abfragen, das Analysieren von Unterabfragen und die Referenzierung von Resolvern in Untergraphen serialization/deserialization, um Verknüpfungen durchzuführen.
Unterstützung der Beobachtbarkeit Built-in Überwachung, Protokollierung und Rückverfolgung. Ein einziger, zusammengeführter API-Server bedeutet vereinfachtes Debugging. Build-your-own Beobachtbarkeit auf dem Router und allen zugehörigen Subgraph-Servern. Komplexes Debugging auf verteilten Systemen.
Unterstützung bei der Autorisierung Integrierte Unterstützung für mehrere Autorisierungsmodi. Build-your-own Autorisierungsregeln.
Kontoübergreifende Sicherheit Built-in Unterstützung für AWS cloudübergreifende Kontozuordnungen. Build-your-own Sicherheitsmodell.
Unterstützung für Abonnements Ja Nein

* AWS AppSync Zusammengeführte APIs können nur AWS AppSync Quell-APIs zugeordnet werden. Wenn Sie Unterstützung für die Schemakomposition zwischen AWS AppSync und ohne AWS AppSync Unterdiagramme benötigen, können Sie eine oder mehrere AWS AppSync GraphQL and/or Merged-APIs zu einer routerbasierten Lösung verbinden. Im Referenzblog finden Sie beispielsweise Informationen zum Hinzufügen von AWS AppSync APIs als Unterdiagramm unter Verwendung einer routerbasierten Architektur mit Apollo Federation v2: Apollo GraphQL Federation with. AWS AppSync

Zusammengeführte API-Konfliktlösung

AWS AppSync Stellt Benutzern im Falle eines Zusammenführungskonflikts mehrere Tools und Beispiele zur Verfügung, um die Probleme zu beheben.

Richtlinien für zusammengeführte API-Schemas

AWS AppSync hat mehrere GraphQL-Direktiven eingeführt, die verwendet werden können, um Konflikte zwischen Quell-APIs zu reduzieren oder zu lösen:

  • @canonical: Diese Direktive legt den Vorrang von types/fields mit ähnlichen Namen und Daten fest. Wenn zwei oder mehr Quell-APIs denselben GraphQL-Typ oder dasselbe Feld haben, kann eine der APIs ihren Typ oder ihr Feld als kanonisch annotieren, was bei der Zusammenführung priorisiert wird. Konflikte types/fields , die in anderen Quell-APIs nicht mit dieser Anweisung annotiert sind, werden beim Zusammenführen ignoriert. Dazu gehören Autorisierungsrichtlinien: Wenn Sie ein Feld als kanonisch kennzeichnen, wird verhindert, dass die Deklaration desselben Felds durch eine andere Quell-API dem Feld Autorisierungsmodi hinzufügt. Deklarieren Sie die Autorisierungsdirektive, die Sie benötigen, für das Feld selbst. Wenden Sie @canonical auf Feldebene an, wenn Sie die Autorisierung auf bestimmte Felder beschränken möchten. Dadurch können andere Quell-APIs immer noch zusätzliche Felder desselben Typs hinzufügen. Weitere Informationen finden Sie unter Verwaltung der Autorisierung für gemeinsam genutzte Felder.

  • @hidden: Diese Direktive kapselt bestimmte types/fields , um sie aus dem Zusammenführungsprozess zu entfernen. Teams möchten möglicherweise bestimmte Typen oder Operationen in der Quell-API entfernen oder ausblenden, sodass nur interne Kunden auf bestimmte typisierte Daten zugreifen können. Wenn diese Direktive angehängt ist, werden Typen oder Felder nicht mit der Merged-API zusammengeführt.

  • @renamed: Diese Direktive ändert die Namen von types/fields , um Namenskonflikte zu reduzieren. Es gibt Situationen, in denen verschiedene APIs denselben Typ oder Feldnamen haben. Sie müssen jedoch alle im zusammengeführten Schema verfügbar sein. Eine einfache Möglichkeit, sie alle in die Merged-API aufzunehmen, besteht darin, das Feld in etwas Ähnliches, aber anderes umzubenennen.

Sehen Sie sich das folgende Beispiel an, um zu zeigen, welche Hilfsprogramme Schemadirektiven bieten:

Gehen wir in diesem Beispiel davon aus, dass wir zwei Quell-APIs zusammenführen möchten. Wir erhalten zwei Schemas, mit denen Beiträge erstellt und abgerufen werden (z. B. Kommentarbereich oder Beiträge in sozialen Netzwerken). Unter der Annahme, dass sich die Typen und Felder sehr ähnlich sind, besteht bei einer Zusammenführung eine hohe Wahrscheinlichkeit von Konflikten. Die folgenden Ausschnitte zeigen die Typen und Felder der einzelnen Schemas.

Die erste Datei, genannt Source1.graphql, ist ein GraphQL-Schema, das es einem Benutzer ermöglicht, Posts mithilfe der Mutation etwas zu erstellen. putPost Jede Post enthält einen Titel und eine ID. Die ID wird verwendetUser, um auf die Informationen des Posters (E-Mail-Adresse und Adresse) und auf die Message Nutzdaten (Inhalt) zu verweisen. Der User Typ ist mit dem @canonical -Tag versehen.

# This snippet represents a file called Source1.graphql type Mutation { putPost(id: ID!, title: String!): Post } type Post { id: ID! title: String! } type Message { id: ID! content: String } type User @canonical { id: ID! email: String! address: String! } type Query { singlePost(id: ID!): Post getMessage(id: ID!): Message }

Die zweite Datei, genannt Source2.graphql, ist ein GraphQL-Schema, das sehr ähnliche Dinge tut wie. Source1.graphql Beachten Sie jedoch, dass die Felder der einzelnen Typen unterschiedlich sind. Beim Zusammenführen dieser beiden Schemas kommt es aufgrund dieser Unterschiede zu Zusammenführungskonflikten.

Beachten Sie auch, dass how Source2.graphql auch mehrere Anweisungen zur Reduzierung dieser Konflikte enthält. Der Post Typ ist mit einem @hidden -Tag versehen, um sich während des Zusammenführungsvorgangs zu verschleiern. Der Message Typ ist mit dem @renamed -Tag versehen, sodass der Typname im Falle eines Namenskonflikts mit einem anderen Typ ChatMessage in geändert werden kann. Message

# This snippet represents a file called Source2.graphql type Post @hidden { id: ID! title: String! internalSecret: String! } type Message @renamed(to: "ChatMessage") { id: ID! chatId: ID! from: User! to: User! } # Stub user so that we can link the canonical definition from Source1 type User { id: ID! } type Query { getPost(id: ID!): Post getMessage(id: ID!): Message @renamed(to: "getChatMessage") }

Wenn die Zusammenführung erfolgt, erzeugt das Ergebnis die folgende MergedSchema.graphql Datei:

# This snippet represents a file called MergedSchema.graphql type Mutation { putPost(id: ID!, title: String!): Post } # Post from Source2 was hidden so only uses the Source1 definition. type Post { id: ID! title: String! } # Renamed from Message to resolve the conflict type ChatMessage { id: ID! chatId: ID! from: User! to: User! } type Message { id: ID! content: String } # Canonical definition from Source1 type User { id: ID! email: String! address: String! } type Query { singlePost(id: ID!): Post getMessage(id: ID!): Message # Renamed from getMessage getChatMessage(id: ID!): ChatMessage }

Bei der Zusammenführung sind mehrere Dinge passiert:

  • Der User Typ von Source1.graphql hatte Source2.graphql aufgrund der @canonical -Annotation Vorrang User vor dem Typ from.

  • Der Message Typ von Source1.graphql wurde in die Zusammenführung aufgenommen. Das Message Formular Source2.graphql hatte jedoch einen Namenskonflikt. Aufgrund der @renamed -Annotation wurde es ebenfalls in die Zusammenführung aufgenommen, allerdings mit dem alternativen NamenChatMessage.

  • Der Post Typ von Source1.graphql war enthalten, der Post Typ von jedoch Source2.graphql nicht. Normalerweise gäbe es bei diesem Typ einen Konflikt, aber da der Post Typ von eine @hidden -Annotation Source2.graphql hatte, wurden seine Daten verschleiert und nicht in die Zusammenführung aufgenommen. Dies führte zu keinen Konflikten.

  • Der Query Typ wurde aktualisiert, sodass er die Inhalte aus beiden Dateien enthält. Eine GetMessage Abfrage wurde jedoch GetChatMessage aufgrund der Richtlinie in umbenannt. Dadurch wurde der Namenskonflikt zwischen den beiden Abfragen mit demselben Namen gelöst.

Es gibt auch den Fall, dass einem widersprüchlichen Typ keine Direktiven hinzugefügt werden. In diesem Fall beinhaltet der zusammengeführte Typ die Vereinigung aller Felder aus allen Quelldefinitionen dieses Typs. Sehen Sie sich dazu das folgende Beispiel an:

Dieses Schema, genannt Source1.graphql, ermöglicht das Erstellen und AbrufenPosts. Die Konfiguration ähnelt dem vorherigen Beispiel, enthält jedoch weniger Informationen.

# This snippet represents a file called Source1.graphql type Mutation { putPost(id: ID!, title: String!): Post } type Post { id: ID! title: String! } type Query { getPost(id: ID!): Post }

Dieses Schema, genannt Source2.graphql, ermöglicht das Erstellen und Abrufen Reviews (z. B. von Filmbewertungen oder Restaurantkritiken). Reviewssind mit demselben Post ID-Wert verknüpft. Zusammen enthalten sie den Titel, die Beitrags-ID und die Nutzlastnachricht des vollständigen Rezensionsbeitrags.

Beim Zusammenführen wird es einen Konflikt zwischen den beiden Post Typen geben. Da es keine Anmerkungen gibt, um dieses Problem zu lösen, besteht das Standardverhalten darin, einen Vereinigungsvorgang für die widersprüchlichen Typen durchzuführen.

# This snippet represents a file called Source2.graphql type Mutation { putReview(id: ID!, postId: ID!, comment: String!): Review } type Post { id: ID! reviews: [Review] } type Review { id: ID! postId: ID! comment: String! } type Query { getReview(id: ID!): Review }

Wenn die Zusammenführung erfolgt, erzeugt das Ergebnis die folgende Datei: MergedSchema.graphql

# This snippet represents a file called MergedSchema.graphql type Mutation { putReview(id: ID!, postId: ID!, comment: String!): Review putPost(id: ID!, title: String!): Post } type Post { id: ID! title: String! reviews: [Review] } type Review { id: ID! postId: ID! comment: String! } type Query { getPost(id: ID!): Post getReview(id: ID!): Review }

Bei der Zusammenführung sind mehrere Dinge passiert:

  • Der Mutation Typ hatte keine Konflikte und wurde zusammengeführt.

  • Die Post Typfelder wurden durch einen Union-Vorgang kombiniert. Beachten Sie, dass durch die Vereinigung der beiden ein einzelnes idtitle, ein und ein einzelnes Ergebnis entstanden istreviews.

  • Der Review Typ hatte keine Konflikte und wurde zusammengeführt.

  • Der Query Typ hatte keine Konflikte und wurde zusammengeführt.

Verwaltung von Resolvern für gemeinsam genutzte Typen

Stellen Sie sich im obigen Beispiel den Fall vor, dass ein Unit-Resolver konfiguriert Source1.graphql wurdeQuery.getPost, der eine DynamoDB-Datenquelle mit dem Namen verwendet. PostDatasource Dieser Resolver gibt das Ende eines Typs id zurück. title Post Consider Source2.graphql hat nun einen Pipeline-Resolver konfiguriertPost.reviews, auf dem zwei Funktionen ausgeführt werden. Function1hat eine angefügte None Datenquelle, um benutzerdefinierte Autorisierungsprüfungen durchzuführen. Function2hat eine DynamoDB-Datenquelle angehängt, um die reviews Tabelle abzufragen.

query GetPostQuery { getPost(id: "1") { id, title, reviews } }

Wenn die obige Abfrage von einem Client für den Merged-API-Endpunkt ausgeführt wird, führt der AWS AppSync Dienst zuerst den Unit-Resolver für Query.getPost from ausSource1, der DynamoDB aufruft PostDatasource und die Daten von DynamoDB zurückgibt. Dann führt er den Post.reviews Pipeline-Resolver Function1 aus, in dem die benutzerdefinierte Autorisierungslogik ausgeführt wird und die Function2 eingegebenen Bewertungen zurückgegeben werden. id $context.source Der Dienst verarbeitet die Anfrage als einzelne GraphQL-Ausführung, und für diese einfache Anfrage ist nur ein einziges Anforderungstoken erforderlich.

Verwaltung von Resolver-Konflikten bei gemeinsam genutzten Typen

Stellen Sie sich den folgenden Fall vor, Query.getPost in dem wir auch einen Resolver implementieren, um über den Feld-Resolver hinaus mehrere Felder gleichzeitig bereitzustellen. Source2 Source1.graphqlkönnte so aussehen:

# This snippet represents a file called Source1.graphql type Post { id: ID! title: String! date: AWSDateTime! } type Query { getPost(id: ID!): Post }

Source2.graphqlkann so aussehen:

# This snippet represents a file called Source2.graphql type Post { id: ID! content: String! contentHash: String! author: String! } type Query { getPost(id: ID!): Post }

Der Versuch, diese beiden Schemas zusammenzuführen, führt zu einem Zusammenführungsfehler, da AWS AppSync zusammengeführte APIs nicht zulassen, dass mehrere Quell-Resolver an dasselbe Feld angehängt werden. Um diesen Konflikt zu lösen, können Sie ein Feldauflösungsmuster implementieren, bei dem ein separater Typ Source2.graphql hinzugefügt werden müsste, der die Felder, die ihm gehören, von dem Typ unterscheidet. Post Im folgenden Beispiel fügen wir einen Typ mit dem Namen hinzuPostInfo, der die Inhalts- und Autorenfelder enthält, die aufgelöst werden Source2.graphql. Source1.graphqlimplementiert den Resolver, an den er angehängt istQuery.getPost, und Source2.graphql fügt nun einen Resolver hinzu, Post.postInfo um sicherzustellen, dass alle Daten erfolgreich abgerufen werden können:

type Post { id: ID! postInfo: PostInfo } type PostInfo { content: String! contentHash: String! author: String! } type Query { getPost(id: ID!): Post }

Die Lösung eines solchen Konflikts erfordert zwar, dass die Quell-API-Schemas neu geschrieben werden und Kunden möglicherweise ihre Abfragen ändern müssen. Der Vorteil dieses Ansatzes besteht jedoch darin, dass die Eigentümer der zusammengeführten Resolver allen Quellteams klar sind.

Verwaltung der Autorisierung für gemeinsam genutzte Felder

Wenn zwei oder mehr Quell-APIs dasselbe Feld deklarieren, werden bei der Zusammenführung die Autorisierungsrichtlinien aus jeder Deklaration kombiniert. Clients können das zusammengeführte Feld dann über einen dieser Autorisierungsmodi erreichen. Wenn eine Quell-API ein Feld mit deklariert @aws_iam und eine andere Quell-API dasselbe Feld mit deklariert@aws_api_key, akzeptiert das zusammengeführte Feld beides, und ein Client, der nur einen API-Schlüssel besitzt, kann es aufrufen.

Um die Autorisierung eines Felds so beizubehalten, wie sie von Ihrer Quell-API definiert wird, kommentieren Sie das Feld mit @canonical und deklarieren Sie die Autorisierungsdirektive, die Sie benötigen, für das Feld selbst. Im folgenden Beispiel Source1.graphql besitzt er den Resolver für protectedRead und benötigt eine IAM-Autorisierung:

# This snippet represents a file called Source1.graphql type Query { protectedRead: String @aws_iam @canonical }
# This snippet represents a file called Source2.graphql type Query { protectedRead: String @aws_api_key }

Bei der Zusammenführung hat die Definition von Source1.graphql Vorrang:

# This snippet represents a file called MergedSchema.graphql type Query { protectedRead: String @aws_iam }

Ohne die @canonical -Annotation wäre das zusammengeführte Feld wie folgtprotectedRead: String @aws_api_key @aws_iam: Ein Client, der nur den API-Schlüssel der zusammengeführten API besitzt, kann ihn dann aufrufen.

Wenn Ihre Quell-API den Resolver des Felds besitzt, kommentieren Sie das Feld in dieser Quell-API mit Anmerkungen, da der Resolver die Daten zurückgibt.

Es gelten zwei Bedingungen:

Deklarieren Sie die Autorisierungsrichtlinie für das Feld

@canonical behält das deklarierte Feld bei. Ein mit @canonical annotiertes Feld ohne eigene Autorisierungsdirektive verwendet den primären Autorisierungsmodus Ihrer Quell-API, der möglicherweise freizügiger ist, als Sie beabsichtigen.

Kommentieren Sie ein Feld in nur einer Quell-API

Wenn zwei Quell-APIs dasselbe Feld mit Canonical annotieren, schlägt die Zusammenführung mit dem Fehler fehl. Multiple subschemas cannot declare the same field as canonical

Wenden Sie @canonical auf Feldebene und nicht auf Typebene an, um die Autorisierung auf bestimmte Felder einzuschränken. Dadurch können andere Quell-APIs immer noch zusätzliche Felder desselben Typs hinzufügen. Diese Anleitung gilt für Felder mit und Subscription sowie für Felder mit Objekttypen. Query Mutation

Wenn Sie nicht möchten, dass ein Feld in der Merged-API überhaupt erscheint, verwenden Sie stattdessen @hidden. Weitere Informationen finden Sie unter Richtlinien für zusammengeführte API-Schemas.

Schemas konfigurieren

Zwei Parteien sind für die Konfiguration der Schemas zur Erstellung einer zusammengeführten API verantwortlich:

  • Eigentümer zusammengeführter APIs — Eigentümer zusammengeführter APIs müssen die Autorisierungslogik der zusammengeführten API und erweiterte Einstellungen wie Protokollierung, Tracing, Caching und WAF-Unterstützung konfigurieren.

  • Eigentümer der zugehörigen Quell-APIs — Eigentümer der zugehörigen APIs müssen die Schemas, Resolver und Datenquellen konfigurieren, aus denen die zusammengeführte API besteht.

Da das Schema Ihrer zusammengeführten API aus den Schemas Ihrer verknüpften Quell-APIs erstellt wird, ist es schreibgeschützt. Das bedeutet, dass Änderungen am Schema in Ihren Quell-APIs initiiert werden müssen. In der AWS AppSync Konsole können Sie mithilfe der Dropdownliste über dem Schemafenster zwischen Ihrem zusammengeführten Schema und den einzelnen Schemas der Quell-APIs, die in Ihrer zusammengeführten API enthalten sind, wechseln.

Konfiguration der Autorisierungsmodi

Zum Schutz Ihrer zusammengeführten API stehen mehrere Autorisierungsmodi zur Verfügung. Weitere Informationen zu den Autorisierungsmodi finden Sie unter Autorisierung und Authentifizierung. AWS AppSync

Die folgenden Autorisierungsmodi stehen für die Verwendung mit zusammengeführten APIs zur Verfügung:

  • API-Schlüssel: Die einfachste Autorisierungsstrategie. Alle Anfragen müssen einen API-Schlüssel unter dem x-api-key Anforderungsheader enthalten. Abgelaufene API-Schlüssel werden nach dem Ablaufdatum 60 Tage lang aufbewahrt.

  • AWS Identitäts- und Zugriffsmanagement (IAM): Die AWS IAM-Autorisierungsstrategie autorisiert alle Anfragen, die mit Sigv4 signiert sind.

  • Amazon Cognito-Benutzerpools: Autorisieren Sie Ihre Benutzer über Amazon Cognito-Benutzerpools, um eine detailliertere Steuerung zu erreichen.

  • AWS Lambda Authorizers: Eine serverlose Funktion, mit der Sie den Zugriff auf Ihre API mithilfe einer benutzerdefinierten Logik authentifizieren und autorisieren können. AWS AppSync

  • OpenID Connect: Dieser Autorisierungstyp erzwingt OpenID Connect (OIDC) -Token, die von einem Dienst bereitgestellt werden. OIDC-compliant Ihre Anwendung kann Benutzer und Berechtigungen nutzen, die von Ihrem OIDC-Anbieter zur Kontrolle des Zugriffs definiert wurden.

Die Autorisierungsmodi einer zusammengeführten API werden vom Eigentümer der zusammengeführten API konfiguriert. Zum Zeitpunkt eines Zusammenführungsvorgangs muss die zusammengeführte API den primären Autorisierungsmodus enthalten, der auf einer Quell-API entweder als eigenen primären Autorisierungsmodus oder als sekundären Autorisierungsmodus konfiguriert ist. Andernfalls ist es inkompatibel und der Zusammenführungsvorgang schlägt aufgrund eines Konflikts fehl. Wenn Multiauth-Direktiven in den Quell-APIs verwendet werden, kann der Zusammenführungsprozess diese Direktiven automatisch zum einheitlichen Endpunkt zusammenführen. Falls der primäre Autorisierungsmodus der Quell-API nicht mit dem primären Autorisierungsmodus der zusammengeführten API übereinstimmt, werden diese Authentifizierungsdirektiven automatisch hinzugefügt, um sicherzustellen, dass der Autorisierungsmodus für die Typen in der Quell-API konsistent ist.

Wichtig

Wenn zwei oder mehr Quell-APIs dasselbe Feld deklarieren, werden bei der Zusammenführung die Autorisierungsdirektiven aus jeder Deklaration kombiniert, und Clients können das zusammengeführte Feld über jeden dieser Modi erreichen. Das oben beschriebene automatische Hinzufügen wendet den eigenen primären Autorisierungsmodus jeder Quell-API auf die Felder an, die von der Quell-API beigesteuert werden. Es überschreibt nicht die Autorisierungsrichtlinien, die eine Quell-API explizit deklariert. Informationen dazu, wie die Autorisierung eines Felds so beibehalten wird, wie sie von einer einzelnen Quell-API definiert wird, finden Sie unterVerwaltung der Autorisierung für gemeinsam genutzte Felder.

Ausführungsrollen konfigurieren

Wenn Sie eine zusammengeführte API erstellen, müssen Sie eine Servicerolle definieren. Eine AWS Servicerolle ist eine AWS Identity and Access Management (IAM) -Rolle, die von AWS Diensten verwendet wird, um Aufgaben in Ihrem Namen auszuführen.

In diesem Zusammenhang ist es erforderlich, dass Ihre Merged-API Resolver ausführt, die auf Daten aus den in Ihren Quell-APIs konfigurierten Datenquellen zugreifen. Die dafür erforderliche Servicerolle ist diemergedApiExecutionRole, und sie muss über die appsync:SourceGraphQL IAM-Berechtigung expliziten Zugriff haben, um Anfragen für Quell-APIs auszuführen, die in Ihrer zusammengeführten API enthalten sind. Während der Ausführung einer GraphQL-Anfrage übernimmt der AWS AppSync Dienst diese Servicerolle und autorisiert die Rolle zur Ausführung der Aktion. appsync:SourceGraphQL

AWS AppSync unterstützt das Zulassen oder Verweigern dieser Berechtigung für bestimmte Felder der obersten Ebene innerhalb der Anfrage, z. B. wie der IAM-Autorisierungsmodus für IAM-APIs funktioniert. Für Felder, die nicht auf oberster Ebene AWS AppSync sind, müssen Sie die Berechtigung für den Quell-API-ARN selbst definieren. Um den Zugriff auf bestimmte Felder in der Merged-API einzuschränken, die nicht auf oberster Ebene liegen, empfehlen wir, eine benutzerdefinierte Logik in Ihrem Lambda zu implementieren oder die Quell-API-Felder mithilfe der @hidden -Direktive vor der Merged-API auszublenden. Wenn Sie der Rolle erlauben möchten, alle Datenoperationen innerhalb einer Quell-API auszuführen, können Sie die folgende Richtlinie hinzufügen. Beachten Sie, dass der erste Ressourceneintrag den Zugriff auf alle Felder der obersten Ebene ermöglicht und der zweite Eintrag untergeordnete Resolver abdeckt, die auf der Quell-API-Ressource selbst autorisieren:

JSON
{ "Version":"2012-10-17", "Statement": [{ "Effect": "Allow", "Action": [ "appsync:SourceGraphQL"], "Resource": [ "arn:aws:appsync:us-west-2:123456789012:apis/YourSourceGraphQLApiId/*", "arn:aws:appsync:us-west-2:123456789012:apis/YourSourceGraphQLApiId"] }] }

Wenn Sie den Zugriff nur auf ein bestimmtes Feld der obersten Ebene einschränken möchten, können Sie eine Richtlinie wie diese verwenden:

JSON
{ "Version":"2012-10-17", "Statement": [{ "Effect": "Allow", "Action": [ "appsync:SourceGraphQL"], "Resource": [ "arn:aws:appsync:us-west-2:123456789012:apis/YourSourceGraphQLApiId/types/Query/fields/<Field-1>", "arn:aws:appsync:us-west-2:123456789012:apis/YourSourceGraphQLApiId"] }] }

Sie können auch den Assistenten zur Erstellung von AWS AppSync Konsolen-APIs verwenden, um eine Servicerolle zu generieren, mit der Ihre zusammengeführte API auf Ressourcen zugreifen kann, die in Quell-APIs konfiguriert sind und sich im selben Konto wie Ihre zusammengeführte API befinden. Falls sich Ihre Quell-APIs nicht im selben Konto wie Ihre zusammengeführte API befinden, müssen Sie Ihre Ressourcen zunächst mithilfe von AWS Resource Access Manager (AWS RAM) gemeinsam nutzen.

Konfiguration kontoübergreifender zusammengeführter APIs mit AWS RAM

Wenn Sie eine zusammengeführte API erstellen, können Sie optional Quell-APIs von anderen Konten verknüpfen, die über AWS Resource Access Manager (AWS RAM) gemeinsam genutzt wurden. AWS RAM hilft Ihnen dabei, Ihre Ressourcen sicher zwischen AWS Konten, innerhalb Ihrer Organisation oder Organisationseinheiten (OUs) sowie mit IAM-Rollen und -Benutzern gemeinsam zu nutzen.

AWS AppSync lässt sich AWS RAM in integrieren, um die Konfiguration und den Zugriff auf Quell-APIs für mehrere Konten über eine einzige zusammengeführte API zu unterstützen. AWS RAM ermöglicht es Ihnen, eine gemeinsame Nutzung von Ressourcen oder einen Container mit Ressourcen und den Berechtigungssätzen zu erstellen, die für jede Ressource gemeinsam genutzt werden. Sie können AWS AppSync APIs zu einer Ressourcenfreigabe in hinzufügen AWS RAM. AWS AppSync Stellt innerhalb einer Ressourcenfreigabe drei verschiedene Berechtigungssätze bereit, die einer AWS AppSync API im RAM zugeordnet werden können:

  1. AWSRAMPermissionAppSyncSourceApiOperationAccess: Der Standard-Berechtigungssatz, der beim Teilen einer AWS AppSync API hinzugefügt wird, AWS RAM wenn keine andere Berechtigung angegeben ist. Dieser Berechtigungssatz wird für die gemeinsame Nutzung einer AWS AppSync Quell-API mit einem Eigentümer der zusammengeführten API verwendet. Dieser Berechtigungssatz umfasst die Berechtigung für appsync:AssociateMergedGraphqlApi die Quell-API sowie die appsync:SourceGraphQL Berechtigung, die für den Zugriff auf die Quell-API-Ressourcen zur Laufzeit erforderlich ist.

  2. AWSRAMPermissionAppSyncMergedApiOperationAccess: Dieser Berechtigungssatz sollte konfiguriert werden, wenn eine zusammengeführte API mit einem Eigentümer der Quell-API geteilt wird. Dieser Berechtigungssatz gibt der Quell-API die Möglichkeit, die zusammengeführte API zu konfigurieren, einschließlich der Möglichkeit, alle Quell-APIs, die dem Zielprinzipal gehören, der zusammengeführten API zuzuordnen und die Quell-API-Zuordnungen der zusammengeführten API zu lesen und zu aktualisieren.

  3. AWSRAMPermissionAppSyncAllowSourceGraphQLAccess: Dieser Berechtigungssatz ermöglicht die Verwendung der appsync:SourceGraphQL Berechtigung mit einer AWS AppSync API. Er ist für die gemeinsame Nutzung einer Quell-API mit einem Eigentümer der zusammengeführten API vorgesehen. Im Gegensatz zum Standardberechtigungssatz für den Zugriff auf Quell-API-Operationen umfasst dieser Berechtigungssatz nur die Laufzeitberechtigungappsync:SourceGraphQL. Wenn sich ein Benutzer dafür entscheidet, den Zugriff auf den Vorgang der zusammengeführten API mit einem Eigentümer der Quell-API zu teilen, muss er auch diese Berechtigung von der Quell-API an den Eigentümer der zusammengeführten API weitergeben, um über den Merged-API-Endpunkt Laufzeitzugriff zu erhalten.

AWS AppSync unterstützt auch vom Kunden verwaltete Berechtigungen. Wenn eine der bereitgestellten AWS verwalteten Berechtigungen nicht funktioniert, können Sie Ihre eigene, vom Kunden verwaltete Berechtigung erstellen. Customer-managed Berechtigungen sind verwaltete Berechtigungen, die Sie erstellen und verwalten, indem Sie genau angeben, welche Aktionen unter welchen Bedingungen mit gemeinsam genutzten Ressourcen ausgeführt werden können. AWS RAM AWS AppSync ermöglicht es Ihnen, bei der Erstellung Ihrer eigenen Berechtigungen aus den folgenden Aktionen auszuwählen:

  1. appsync:AssociateSourceGraphqlApi

  2. appsync:AssociateMergedGraphqlApi

  3. appsync:GetSourceApiAssociation

  4. appsync:UpdateSourceApiAssociation

  5. appsync:StartSchemaMerge

  6. appsync:ListTypesByAssociation

  7. appsync:SourceGraphQL

Sobald Sie eine Quell-API oder Merged-API ordnungsgemäß freigegeben AWS RAM und, falls erforderlich, die Einladung zur gemeinsamen Nutzung von Ressourcen akzeptiert haben, wird sie in der AWS AppSync Konsole angezeigt, wenn Sie die Quell-API-Verknüpfungen in Ihrer zusammengeführten API erstellen oder aktualisieren. Sie können auch alle AWS AppSync APIs auflisten, die AWS RAM mit Ihrem Konto gemeinsam genutzt wurden, unabhängig von der eingestellten Berechtigung, indem Sie den von Ihnen bereitgestellten ListGraphqlApis Vorgang aufrufen AWS AppSync und den OTHER_ACCOUNTS Eigentümerfilter verwenden.

Anmerkung

Für das Teilen über AWS RAM muss der Anrufer AWS RAM die Erlaubnis haben, die appsync:PutResourcePolicy Aktion für jede API auszuführen, die geteilt wird.

Wichtig

Wenn Sie Quell-APIs von anderen AWS Konten zusammenführen, kann eine Quell-API in einem anderen Konto ein Feld deklarieren, das Ihre Quell-API ebenfalls deklariert. In diesem Fall kombiniert die Zusammenführung die Autorisierungsdirektiven aus beiden Deklarationen, und Kunden können das zusammengeführte Feld über jeden dieser Modi erreichen. Wenn Ihre zusammengeführte API API_KEY gleichzeitig einen strengeren Autorisierungsmodus wie IAM- oder Amazon Cognito-Benutzerpools verwendet, kommentieren Sie autorisierungsgeschützte Felder mit @canonical. Kommentieren Sie diese Felder in der Quell-API, der der Resolver des Felds gehört. Weitere Informationen finden Sie unter Verwaltung der Autorisierung für gemeinsam genutzte Felder.

Zusammenführen

Zusammenführungen verwalten

Zusammengeführte APIs sollen die Teamzusammenarbeit an einem einheitlichen AWS AppSync Endpunkt unterstützen. Teams können unabhängig voneinander ihre eigenen GraphQL-APIs aus isolierten Quellen im Backend entwickeln, während der AWS AppSync Service die Integration der Ressourcen in den einzigen Merged-API-Endpunkt verwaltet, um die Reibung bei der Zusammenarbeit zu verringern und die Entwicklungsvorlaufzeiten zu verkürzen.

Auto-merges

Quell-APIs, die Ihrer AWS AppSync Merged-API zugeordnet sind, können so konfiguriert werden, dass sie automatisch mit der Merged-API zusammengeführt werden (automatische Zusammenführung), nachdem Änderungen an der Quell-API vorgenommen wurden. Dadurch wird sichergestellt, dass die Änderungen an der Quell-API immer im Hintergrund an den Merged-API-Endpunkt weitergegeben werden. Jede Änderung des Quell-API-Schemas wird in der zusammengeführten API aktualisiert, sofern dadurch kein Zusammenführungskonflikt mit einer vorhandenen Definition in der zusammengeführten API entsteht. Wenn das Update in der Quell-API einen Resolver, eine Datenquelle oder eine Funktion aktualisiert, wird auch die importierte Ressource aktualisiert. Wenn ein neuer Konflikt auftritt, der nicht automatisch gelöst (automatisch gelöst) werden kann, wird die Aktualisierung des zusammengeführten API-Schemas aufgrund eines nicht unterstützten Konflikts während des Zusammenführungsvorgangs abgelehnt. Die Fehlermeldung ist in der Konsole für jede Quell-API-Zuordnung mit dem Status verfügbar. MERGE_FAILED Sie können die Fehlermeldung auch überprüfen, indem Sie den GetSourceApiAssociation Vorgang für eine bestimmte Quell-API-Zuordnung mithilfe des AWS SDK oder der AWS CLI wie folgt aufrufen:

aws appsync get-source-api-association --merged-api-identifier <Merged API ARN> --association-id <SourceApiAssociation id>

Dadurch wird ein Ergebnis im folgenden Format erzeugt:

{ "sourceApiAssociation": { "associationId": "<association id>", "associationArn": "<association arn>", "sourceApiId": "<source api id>", "sourceApiArn": "<source api arn>", "mergedApiArn": "<merged api arn>", "mergedApiId": "<merged api id>", "sourceApiAssociationConfig": { "mergeType": "MANUAL_MERGE" }, "sourceApiAssociationStatus": "MERGE_FAILED", "sourceApiAssociationStatusDetail": "Unable to resolve conflict on object with name title: Merging is not supported for fields with different types." } }

Manuelles Zusammenführen

Die Standardeinstellung für eine Quell-API ist eine manuelle Zusammenführung. Um alle Änderungen zusammenzuführen, die seit der letzten Aktualisierung der zusammengeführten API an den Quell-APIs vorgenommen wurden, kann der Eigentümer der Quell-API eine manuelle Zusammenführung über die AWS AppSync Konsole oder über den im AWS SDK und in der AWS CLI verfügbaren StartSchemaMerge Vorgang aufrufen.

Zusätzliche Unterstützung für zusammengeführte APIs

Abonnements konfigurieren

Im Gegensatz zu routerbasierten Ansätzen zur Erstellung von GraphQL-Schemas bieten AWS AppSync Merged-APIs integrierte Unterstützung für GraphQL-Abonnements. Alle Abonnementvorgänge, die in Ihren zugehörigen Quell-APIs definiert sind, werden automatisch zusammengeführt und funktionieren in Ihrer zusammengeführten API ohne Änderungen. Weitere Informationen darüber, wie Abonnements über serverlose WebSockets Verbindungen AWS AppSync unterstützt werden, finden Sie unter Real-time Daten.

Beobachtbarkeit konfigurieren

AWS AppSync Zusammengeführte APIs bieten integrierte Protokollierung, Überwachung und Metriken über Amazon CloudWatch. AWS AppSync bietet auch integrierte Unterstützung für Tracing über AWS X-Ray.

Konfiguration benutzerdefinierter Domänen

AWS AppSync Zusammengeführte APIs bieten integrierte Unterstützung für die Verwendung benutzerdefinierter Domänen mit GraphQL und Real-time Endpunkten Ihrer Merged-API.

Caching konfigurieren

AWS AppSync Zusammengeführte APIs bieten integrierte Unterstützung für das optionale Zwischenspeichern von Antworten auf and/or Resolverebene auf Anforderungsebene sowie für die Antwortkomprimierung. Weitere Informationen finden Sie unter Caching und Komprimierung. https://docs.aws.amazon.com/appsync/latest/devguide/enabling-caching.html

Konfiguration von privaten APIs

AWS AppSync Zusammengeführte APIs bieten integrierte Unterstützung für private APIs, die den Zugriff auf GraphQL und Real-time Endpunkte Ihrer Merged-API auf den Datenverkehr beschränken, der von VPC-Endpunkten stammt, die Sie konfigurieren können.

Konfiguration der Firewallregeln

AWS AppSync Zusammengeführte APIs bieten integrierte Unterstützung für AWS WAF, mit der Sie Ihre APIs schützen können, indem Sie Firewallregeln für Webanwendungen definieren.

Konfiguration von Auditprotokollen

AWS AppSync Zusammengeführte APIs bieten integrierte Unterstützung für AWS CloudTrail, mit der Sie Auditprotokolle konfigurieren und verwalten können.

Einschränkungen bei der Zusammenführung von APIs

Beachten Sie bei der Entwicklung zusammengeführter APIs die folgenden Regeln:

  1. Eine zusammengeführte API kann keine Quell-API für eine andere zusammengeführte API sein.

  2. Eine Quell-API kann nicht mit mehr als einer zusammengeführten API verknüpft werden.

  3. Die Standardgrößenbeschränkung für ein zusammengeführtes API-Schemadokument beträgt 10 MB.

  4. Die Standardanzahl von Quell-APIs, die einer zusammengeführten API zugeordnet werden können, ist 10. Sie können jedoch eine Erhöhung des Limits beantragen, wenn Sie mehr als 10 Quell-APIs in Ihrer zusammengeführten API benötigen.

Überlegungen zur Zusammenführung der APIs

Beachten Sie beim Entwerfen und Implementieren zusammengeführter APIs Folgendes:

Das Zusammenführen mehrerer Quell-APIs zu einem einzigen Endpunkt kann die Größe und Komplexität Ihres GraphQL-Schemas und Ihrer Abfragen erhöhen. Wenn Ihr zusammengeführtes Schema wächst, müssen Abfragen möglicherweise mehrere Resolver durchlaufen, um eine einzelne Anfrage zu erfüllen, was Ihre gesamte Anforderungszeit verlängern kann. Beispielsweise kann es bei einer Abfrage, die auf Felder mehrerer Quell-APIs zugreift, erforderlich sein AWS AppSync , die Resolver von jeder Quell-API nacheinander auszuführen, wobei jeder Resolver die gesamte Antwortzeit erhöht.

Wir empfehlen Ihnen dringend, Ihre zusammengeführten APIs während der Entwicklung und unter realistischen Lastbedingungen gründlich zu testen, um sicherzustellen, dass sie Ihren Geschäftsanforderungen entsprechen. Achten Sie besonders auf:

  • Die Tiefe und Komplexität Ihres zusammengeführten Schemas, insbesondere Abfragen, die auf Felder mehrerer Quell-APIs zugreifen.

  • Die Anzahl der Resolver, die ausgeführt werden müssen, um allgemeine Abfragemuster zu erfüllen.

  • Die Leistungsmerkmale Ihrer Datenquellen und Resolver unter erwarteter Last.

  • Die Auswirkungen der Netzwerklatenz beim Zugriff auf Ressourcen über mehrere Quell-APIs.

Erwägen Sie die Implementierung von Leistungsoptimierungen wie Caching, Stapeln von Datenquellenanforderungen und das Entwerfen Ihrer Quell-API-Schemas, um die Anzahl der Resolver-Ausführungen zu minimieren, die für allgemeine Operationen erforderlich sind.

Zusammengeführte APIs erstellen

Um eine zusammengeführte API in der Konsole zu erstellen

  1. Melden Sie sich bei der an AWS-Managementkonsole und öffnen Sie die AWS AppSync Konsole.

    1. Wählen Sie im Dashboard Create API aus.

  2. Wählen Sie Merged API und dann Next aus.

  3. Geben Sie auf der Seite „API-Details angeben“ die folgenden Informationen ein:

    1. Geben Sie unter API-Details die folgenden Informationen ein:

      1. Geben Sie den API-Namen Ihrer zusammengeführten API an. Dieses Feld ist eine Möglichkeit, Ihre GraphQL-API zu kennzeichnen, um sie bequem von anderen GraphQL-APIs zu unterscheiden.

      2. Geben Sie die Kontaktdetails an. Dieses Feld ist optional und fügt der GraphQL-API einen Namen oder eine Gruppe hinzu. Es ist nicht mit anderen Ressourcen verknüpft oder von diesen generiert und funktioniert ähnlich wie das API-Namensfeld.

    2. Unter Servicerolle müssen Sie Ihrer zusammengeführten API eine IAM-Ausführungsrolle hinzufügen, damit Ihre Ressourcen zur Laufzeit sicher importiert und verwendet werden AWS AppSync können. Sie können sich dafür entscheiden, eine neue Servicerolle zu erstellen und zu verwenden, mit der Sie die Richtlinien und Ressourcen angeben können, die verwendet AWS AppSync werden sollen. Sie können auch eine vorhandene IAM-Rolle importieren, indem Sie eine vorhandene Servicerolle verwenden und dann die Rolle aus der Dropdownliste auswählen.

    3. Unter Private API-Konfiguration können Sie wählen, ob Sie private API-Funktionen aktivieren möchten. Beachten Sie, dass diese Auswahl nach der Erstellung der zusammengeführten API nicht mehr geändert werden kann. Weitere Informationen zu privaten APIs finden Sie unter AWS AppSync Private APIs verwenden.

      Wählen Sie Weiter, wenn Sie fertig sind.

  4. Als Nächstes müssen Sie die GraphQL-APIs hinzufügen, die als Grundlage für Ihre zusammengeführte API verwendet werden. Geben Sie auf der Seite Quell-APIs auswählen die folgenden Informationen ein:

    1. Wählen Sie in der Tabelle APIs aus Ihrem AWS Konto die Option Quell-APIs hinzufügen aus. In der Liste der GraphQL-APIs enthält jeder Eintrag die folgenden Daten:

      1. Name: Das API-Namensfeld der GraphQL-API.

      2. API-ID: Der eindeutige ID-Wert der GraphQL-API.

      3. Primärer Authentifizierungsmodus: Der Standardautorisierungsmodus für die GraphQL-API. Weitere Informationen zu den Autorisierungsmodi finden Sie unter Autorisierung und Authentifizierung. AWS AppSync

      4. Zusätzlicher Authentifizierungsmodus: Die sekundären Autorisierungsmodi, die in der GraphQL-API konfiguriert wurden.

      5. Wählen Sie die APIs aus, die Sie in der zusammengeführten API verwenden möchten, indem Sie das Kontrollkästchen neben dem Feld Name der API aktivieren. Wählen Sie anschließend Quell-APIs hinzufügen aus. Die ausgewählten GraphQL-APIs werden in den APIs aus Ihrer AWS Kontentabelle angezeigt.

    2. Wählen Sie in der Tabelle APIs aus anderen AWS Konten die Option Quell-APIs hinzufügen aus. Die GraphQL-APIs in dieser Liste stammen von anderen Konten, die ihre Ressourcen über AWS Resource Access Manager (AWS RAM) mit Ihren teilen. Das Verfahren zur Auswahl von GraphQL-APIs in dieser Tabelle ist das gleiche wie im vorherigen Abschnitt. Weitere Informationen zur gemeinsamen Nutzung von Ressourcen finden Sie AWS RAM unter Was ist AWS Resource Access Manager? .

      Wählen Sie Weiter, wenn Sie fertig sind.

    3. Fügen Sie Ihren primären Authentifizierungsmodus hinzu. Weitere Informationen finden Sie unter Autorisierung und Authentifizierung. Wählen Sie Weiter aus.

    4. Überprüfen Sie Ihre Eingaben und wählen Sie dann Create API aus.