Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
Azure Cosmos DB per NoSQL è un database di documenti indipendente dallo schema. A differenza dei database relazionali, Azure Cosmos DB non ha uno schema predefinito che il Data API builder (DAB) può esaminare automaticamente. Questa guida illustra come creare un file di schema GraphQL e configurare DAB per l'uso con i contenitori Azure Cosmos DB.
Prerequisiti
- Azure Cosmos DB per l'account NoSQL con almeno un database e un contenitore
- CLI generatore di API dati. Installare l'interfaccia della riga di comando
Comprendere il requisito dello schema
Poiché Azure Cosmos DB per NoSQL non applica uno schema, DAB non può generare automaticamente i tipi GraphQL dai dati. È invece necessario fornire un file di schema GraphQL che definisce:
- Tipi di oggetto che rappresentano la struttura del documento del contenitore
-
Direttiva
@modelche esegue il mapping dei tipi GraphQL ai nomi di entità nella configurazione DAB -
Direttiva
@authorize(facoltativa) che limita l'accesso a livello di campo a ruoli specifici
È possibile creare manualmente lo schema usando gli esempi seguenti o generarlo da dati cosmos DB esistenti con il dab export comando .
Creare un file di schema GraphQL
Creare un .gql file che descrive il modello di dati. Il file di schema usa il linguaggio SDL (GraphQL Schema Definition Language) standard con direttive personalizzate per DAB.
Esempio di schema di base
Questo esempio definisce un Book tipo con campi comuni trovati in un contenitore di libri:
type Book @model(name: "Book") {
id: ID
title: String
year: Int
pages: Int
Authors: [Author]
}
type Author @model(name: "Author") {
id: ID
firstName: String
lastName: String
}
Generare uno schema dai dati di Cosmos DB
Se i dati sono già presenti nei contenitori, è possibile campionarli per creare uno schema iniziale. Questo comando scrive un file di schema GraphQL dedotto nella directory di output specificata con -o.
dab export \
--graphql \
--generate \
-o ./schema-out
Per impostazione predefinita, il campionamento usa TopNExtractor.
Le modalità di campionamento supportate sono TopNExtractor, EligibleDataSamplere TimePartitionedSampler.
Annotazioni
Il -o/--output parametro è obbligatorio. Se non si specifica un nome file di schema, DAB genera schema.gql nella directory di output.
Per altre modalità e opzioni, consultare la guida della CLI per dab export.
La @model direttiva è obbligatoria. Mappa il tipo GraphQL a un nome di entità nel file di configurazione DAB. Il name parametro deve corrispondere esattamente al nome dell'entità.
Annotazioni
Il Authors: [Author] campo rappresenta una matrice incorporata all'interno del documento Book, non una relazione con un contenitore separato. In Azure Cosmos DB per NoSQL i dati correlati devono essere incorporati nello stesso documento anziché archiviati in contenitori separati.
Schema con autorizzazione
Per limitare l'accesso a campi specifici, usare la @authorize direttiva . Questa direttiva accetta un roles parametro che specifica quali ruoli possono accedere al campo.
type Book @model(name: "Book") {
id: ID
title: String @authorize(roles: ["authenticated", "metadataviewer"])
internalNotes: String @authorize(roles: ["editor"])
Authors: [Author]
}
In questo esempio:
- Il
titlecampo è accessibile solo agli utenti con ilauthenticatedruolo ometadataviewer - Il
internalNotescampo è accessibile solo agli utenti con ileditorruolo - I campi senza
@authorizesono accessibili in base alle autorizzazioni a livello di entità
È anche possibile applicare @authorize a livello di tipo per limitare l'accesso all'intero tipo:
type InternalReport @model(name: "InternalReport") @authorize(roles: ["editor", "auditor"]) {
id: ID
title: String
confidentialData: String
}
Importante
La @authorize direttiva funziona oltre alle autorizzazioni a livello di entità definite nella configurazione di runtime. Sia la direttiva che le @authorize autorizzazioni dell'entità devono consentire l'accesso per la riuscita di una richiesta.
Ad esempio, se un campo ha @authorize(roles: ["editor"]), ma l'entità non dispone di alcuna voce di autorizzazione per il ruolo editor, l'accesso a tale campo viene negato.
Avviso
@authorize(policy: "...") non è supportato in questo flusso di schema. Utilizzare il @authorize(roles: [...]).
Configurare il runtime DAB
Dopo aver creato il file di schema, configurare DAB per usarlo con l'account Azure Cosmos DB.
Inizializzare la configurazione
Usare il comando dab init per creare un file di configurazione per Azure Cosmos DB:
dab init \
--database-type cosmosdb_nosql \
--cosmosdb_nosql-database <your-database-name> \
--graphql-schema schema.gql \
--connection-string "<your-connection-string>"
Sostituire <your-database-name> con il nome del database Azure Cosmos DB e <your-connection-string> con la stringa di connessione.
Facoltativamente, includere --cosmosdb_nosql-container <your-container-name> per impostare un contenitore predefinito nella configurazione dell'origine dati.
Suggerimento
Per gli ambienti di produzione, si utilizzino le variabili di ambiente per le stringhe di connessione anziché la codifica rigida.
dab init \
--database-type cosmosdb_nosql \
--cosmosdb_nosql-database <your-database-name> \
--graphql-schema schema.gql \
--connection-string "@env('COSMOSDB_CONNECTION_STRING')"
Aggiungi entità
Aggiungere entità che corrispondono ai contenitori. Il nome dell'entità deve corrispondere al @model(name: "...") valore nello schema:
dab add Book \
--source Book \
--permissions "anonymous:read"
Il --source parametro accetta <container-name> o <database-name>.<container-name>. Usare il formato in due parti quando si desidera essere espliciti su database e contenitore.
File di configurazione di esempio
Dopo l'inizializzazione, il file di configurazione dovrebbe essere simile all'esempio seguente:
{
"$schema": "https://github.com/Azure/data-api-builder/releases/download/v1.2.11/dab.draft.schema.json",
"data-source": {
"database-type": "cosmosdb_nosql",
"options": {
"database": "Library",
"schema": "schema.gql"
},
"connection-string": "@env('COSMOSDB_CONNECTION_STRING')"
},
"entities": {
"Book": {
"source": "Book",
"permissions": [
{
"role": "anonymous",
"actions": ["read"]
},
{
"role": "metadataviewer",
"actions": ["read"]
}
]
}
}
}
Annotazioni
Il schema percorso nel file di configurazione è relativo al percorso del file di configurazione DAB. Verificare che il file di schema GraphQL si trova nella directory corretta.
Questo $schema URL punta a una versione DAB specifica. Usare l'URL dello schema corrispondente alla versione di DAB.
Accesso al campo basato sui ruoli
Quando si utilizza la direttiva @authorize con i ruoli, considerare il modo in cui vengono assegnati i ruoli:
| Scenario | Assegnazione di ruolo | Accesso ai @authorize campi |
|---|---|---|
| Richiesta anonima | Nessun ruolo assegnato | Negato |
| Richiesta autenticata |
authenticated Il ruolo del sistema viene assegnato automaticamente |
Consentito se corrisponde al ruolo |
| Richiesta di ruolo personalizzata | Includere l'intestazione X-MS-API-ROLE con il nome del ruolo |
Consentito se corrisponde al ruolo |
Questa tabella si applica a campi o tipi che includono @authorizein modo esplicito . Per i campi senza @authorize, le autorizzazioni a livello di entità determinano l'accesso.
Per le richieste autenticate che richiedono un ruolo personalizzato, inviare l'intestazione X-MS-API-ROLE :
GET /graphql HTTP/1.1
Host: localhost:5000
Authorization: Bearer <your-jwt-token>
X-MS-API-ROLE: metadataviewer
Query tra contenitori
Le operazioni GraphQL tra contenitori non sono supportate in Azure Cosmos DB per NoSQL.
Se si tenta di configurare relazioni tra entità in contenitori diversi usando dab add o dab update, la convalida dell'interfaccia della riga di comando non riesce.
Il messaggio di errore della CLI è: Adding/updating Relationships is currently not supported in CosmosDB.
Per informazioni dettagliate sulla configurazione delle relazioni (supportate per altri database), vedere Configurazione delle relazioni.
Risolvere le limitazioni tra contenitori
Per ovviare a questa limitazione, è consigliabile ristrutturare il modello di dati per usare documenti incorporati all'interno di un singolo contenitore. Questo approccio è spesso più efficiente per Azure Cosmos DB e si allinea alle procedure consigliate per la modellazione dei dati NoSQL.
Ad esempio, anziché separare Book e Author contenitori con relazioni:
// Embedded model in a single container
{
"id": "book-1",
"title": "Introduction to DAB",
"authors": [
{
"firstName": "Jane",
"lastName": "Developer"
}
]
}
Per altre informazioni sulle strategie di modellazione dei dati, vedere Modellazione dei dati in Azure Cosmos DB.
Disponibilità dell'API REST
Il generatore di API dati non genera endpoint REST per Azure Cosmos DB per NoSQL perché Azure Cosmos DB offre già un'API REST nativa completa per le operazioni sui documenti.
Quando si usa DAB con Azure Cosmos DB per NoSQL, DAB espone solo gli endpoint GraphQL e non genera OpenAPI. Per accedere ai dati tramite REST, usare direttamente l'API REST di Azure Cosmos DB .
Problemi di configurazione comuni
File di schema non trovato
- Errore:
GraphQL schema file not found - Soluzione: assicurarsi che il
schemapercorso nella configurazione sia relativo al percorso del file di configurazione.
Incongruenza nel nome dell'entità
- Errore:
Entity '<name>' not found in schema - Soluzione: verificare che il nome dell'entità nella configurazione corrisponda esattamente alla
@model(name: "...")direttiva. I nomi sono sensibili alla distinzione tra maiuscole e minuscole.
Accesso al campo non autorizzato
- Errore: Errore di autorizzazione GraphQL (ad esempio, quando il ruolo non è consentito)
- Soluzione: verificare che sia
@authorizei ruoli che i permessi dell'entità consentano l'accesso al ruolo richiedente.