Sviluppare in locale con l'emulatore di Azure Cosmos DB
Articolo
Un caso d'uso comune per l'emulatore è fungere da database di sviluppo durante la compilazione delle applicazioni. L'uso dell'emulatore per lo sviluppo consente di apprendere le caratteristiche della creazione e della modellazione dei dati per un database come Azure Cosmos DB senza incorrere in costi di servizio. Inoltre, l'uso dell'emulatore come parte di un flusso di lavoro di automazione può garantire che sia possibile eseguire la stessa suite di test di integrazione. È possibile assicurarsi che gli stessi test vengano eseguiti sia in locale nel computer di sviluppo, sia in remoto in un processo di integrazione continua.
Eseguire il pull dell'immagine del contenitore Linux mcr.microsoft.com/cosmosdb/linux/azure-cosmos-emulator dal registro contenitori all'host Docker locale.
Eseguire il pull dell'immagine del contenitore Windows mcr.microsoft.com/cosmosdb/windows/azure-cosmos-emulator dal registro contenitori all'host Docker locale.
Verificare che l'immagine dell'emulatore sia disponibile nell'host Docker locale.
docker images
Per iniziare, scaricare e installare l'ultima versione dell'emulatore di Azure Cosmos DB nel computer locale.
Suggerimento
L'articolo di note sulla versione dell'emulatore contiene un elenco delle versioni disponibili e degli aggiornamenti delle funzionalità apportati in ogni versione.
Eseguire il pull dell'immagine del contenitore Linux mcr.microsoft.com/cosmosdb/linux/azure-cosmos-emulator usando il tag mongodb dal registro contenitori all'host Docker locale.
Verificare che l'immagine dell'emulatore sia disponibile nell'host Docker locale.
docker images
L'immagine del contenitore Docker (Windows) non supporta l'API per MongoDB.
Per iniziare, scaricare e installare l'ultima versione dell'emulatore di Azure Cosmos DB nel computer locale.
Suggerimento
L'articolo di note sulla versione dell'emulatore contiene un elenco delle versioni disponibili e degli aggiornamenti delle funzionalità apportati in ogni versione.
La variante del contenitore Docker (Linux o Windows) dell'emulatore non supporta l'API per Apache Cassandra, l'API per Apache Gremlin o l'API per Table.
Per iniziare, scaricare e installare l'ultima versione dell'emulatore di Azure Cosmos DB nel computer locale.
Suggerimento
L'articolo di note sulla versione dell'emulatore contiene un elenco delle versioni disponibili e degli aggiornamenti delle funzionalità apportati in ogni versione.
La variante del contenitore Docker dell'emulatore non supporta l'API per Apache Cassandra.
Avviare l'eseguibile dell'emulatore (Microsoft.Azure.Cosmos.Emulator.exe) nel percorso %ProgramFiles%\Azure Cosmos DB Emulator. Usare questi parametri per configurare l'emulatore:
La variante del contenitore Docker dell'emulatore non supporta l'API per Apache Gremlin.
Avviare l'eseguibile dell'emulatore (Microsoft.Azure.Cosmos.Emulator.exe) nel percorso %ProgramFiles%\Azure Cosmos DB Emulator. Usare questi parametri per configurare l'emulatore:
La variante del contenitore Docker dell'emulatore non supporta l'API per Table.
Avviare l'eseguibile dell'emulatore (Microsoft.Azure.Cosmos.Emulator.exe) nel percorso %ProgramFiles%\Azure Cosmos DB Emulator. Usare questi parametri per configurare l'emulatore:
Passare a https://localhost:8081/_explorer/index.html per accedere a Esplora dati.
Avviare l'emulatore selezionando l'applicazione nel menu Start di Windows.
In alternativa, è possibile avviare l'eseguibile dell'emulatore (Microsoft.Azure.Cosmos.Emulator.exe) nel percorso %ProgramFiles%\Azure Cosmos DB Emulator.
È anche possibile avviare l'emulatore dalla riga di comando. Usare questi parametri per configurare l'emulatore:
Descrizione
Port
Numero di porta da usare per l'endpoint dell'API per NoSQL.
Passare a https://localhost:8081/_explorer/index.html per accedere a Esplora dati.
L'immagine del contenitore Docker (Windows) non supporta l'API per MongoDB.
Avviare l'eseguibile dell'emulatore (Microsoft.Azure.Cosmos.Emulator.exe) nel percorso %ProgramFiles%\Azure Cosmos DB Emulator. Usare questi parametri per configurare l'emulatore:
Descrizione
EnableMongoDbEndpoint
Abilita l'endpoint dell'API per MongoDB nella versione specificata di MongoDB.
Per altre informazioni sugli argomenti della riga di comando e sulle versioni di MongoDB supportate dall'emulatore, vedere parametri della riga di comando.
L'emulatore apre automaticamente Esplora dati usando l'URL https://localhost:8081/_explorer/index.html.
Importare il certificato TLS/SSL dell'emulatore
Importare il certificato TLS/SSL dell'emulatore per usare l'emulatore con il proprio SDK per sviluppatori preferito senza disabilitare TLS/SSL nel client.
La variante del contenitore Docker (Linux o Windows) dell'emulatore non supporta l'API per Apache Cassandra, l'API per Apache Gremlin o l'API per Table.
L'installazione locale di Windows dell'emulatore importa automaticamente i certificati TLS/SSL. Non sono necessarie altre azioni.
Il certificato per l'emulatore è disponibile nel percorso _explorer/emulator.pem del contenitore in esecuzione. Usare curl per scaricare il certificato dal contenitore in esecuzione nel computer locale.
Ottenere il certificato dal contenitore in esecuzione.
Può essere necessario modificare l'host (o l'indirizzo IP) e il numero di porta se tali valori sono stati modificati in precedenza.
Installare il certificato in base al processo usato in genere per il sistema operativo. Ad esempio, in Linux si copia il certificato nel percorso /usr/local/share/ca-certificates/.
Per i sistemi Linux, rigenerare il bundle del certificato usando il comando appropriato per la distribuzione Linux in uso.
Per i sistemi Linux basati su Debian (ad esempio Ubuntu), usare:
sudo update-ca-certificates
Per i sistemi Linux basati su Red Hat (ad esempio, CentOS, Fedora), usare:
sudo update-ca-trust
Per istruzioni più dettagliate, consultare la documentazione specifica per il sistema operativo in uso.
Il certificato per l'emulatore è disponibile nella cartella C:\CosmosDB.Emulator\bind-mount del contenitore in esecuzione. La cartella contiene anche uno script per installare automaticamente il certificato.
Usare docker cp per copiare l'intera cartella nel computer locale.
L'installazione locale di Windows dell'emulatore importa automaticamente i certificati TLS/SSL. Non sono necessarie altre azioni.
Connettersi all'emulatore dall'SDK
Ogni SDK include in genere una classe client usata per connettere l'SDK all'account Azure Cosmos DB. Usando le credenziali dell'emulatore, è invece possibile connettere l'SDK all'istanza dell'emulatore.
Creare un nuovo elemento nel contenitore usando UpsertItemAsync.
var item = new
{
id = "68719518371",
name = "Kiama classic surfboard"
};
await container.UpsertItemAsync(item);
Eseguire l'applicazione .NET.
dotnet run
Avviso
Se viene visualizzato un errore SSL, può essere necessario disabilitare TLS/SSL per l'applicazione. Questo problema si verifica in genere se si sviluppa nel computer locale usando l'emulatore di Azure Cosmos DB in un contenitore e non è stato importato il certificato SSL del contenitore. Per risolvere il problema, configurare le opzioni del client per disabilitare la convalida TLS/SSL prima di creare il client:
Se viene visualizzato un errore SSL, potrebbe essere necessario disabilitare TLS/SSL per l'applicazione. Questo problema si verifica in genere se si sviluppa nel computer locale usando l'emulatore di Azure Cosmos DB in un contenitore e non è stato importato il certificato SSL del contenitore. Per risolvere il problema, configurare l'applicazione per disabilitare la convalida TLS/SSL prima di creare il client:
import urllib3
urllib3.disable_warnings()
Se si verificano ancora errori SSL, è possibile che Python stia recuperando i certificati da un archivio certificati diverso. Per determinare il percorso in cui Python cerca i certificati, seguire questa procedura:
Importante
Se si usa un ambiente virtuale (venv) Python, assicurarsi che sia attivato prima di eseguire i comandi.
Aprire un terminale
Avviare l'interprete Python digitando python o python3, a seconda della versione di Python in uso.
Nell'interprete Python eseguire i comandi seguenti:
from requests.utils import DEFAULT_CA_BUNDLE_PATH
print(DEFAULT_CA_BUNDLE_PATH)
All'interno di un ambiente virtuale il percorso potrebbe essere (almeno in Ubuntu):
All'esterno di un ambiente virtuale il percorso potrebbe essere (almeno in Ubuntu):
/etc/ssl/certs/ca-certificates.crt
Dopo aver identificato DEFAULT_CA_BUNDLE_PATH, aprire un nuovo terminale ed eseguire i comandi seguenti per aggiungere il certificato dell'emulatore al bundle del certificato:
Importante
Se la variabile DEFAULT_CA_BUNDLE_PATH punta a una directory di sistema, è possibile che venga visualizzato un errore di "Autorizzazione negata". In questo caso, sarà necessario eseguire i comandi con privilegi elevati (come utente ROOT). Inoltre, sarà necessario aggiornare e rigenerare il bundle del certificato dopo l'esecuzione dei comandi forniti.
# Add a new line to the certificate bundle
echo >> /path/to/ca_bundle
# Append the emulator certificate to the certificate bundle
cat /path/to/emulatorcert.crt >> /path/to/ca_bundle
Se viene visualizzato un errore SSL, può essere necessario disabilitare TLS/SSL per l'applicazione. Questo problema si verifica in genere se si sviluppa nel computer locale usando l'emulatore di Azure Cosmos DB in un contenitore e non è stato importato il certificato SSL del contenitore. Per risolvere il problema, configurare l'applicazione per disabilitare la convalida TLS/SSL prima di creare il client:
Eliminare qualsiasi contenuto esistente all'interno del file.
Aggiungere un blocco Using per lo spazio dei nomi MongoDB.Driver.
using MongoDB.Driver;
Creare una nuova istanza di MongoClient usando le credenziali dell'emulatore.
var client = new MongoClient(
"mongodb://localhost:C2y6yDjf5%2FR%2Bob0N8A7Cgv30VRDJIWEHLM%2B4QDU5DE2nQ9nDuVTqobD4b8mGGyPMbIZnqyMsEcaGQy67XIw%2FJw%3D%3D@localhost:10255/admin?ssl=true&retrywrites=false"
);
db = client["cosmicworks"]
if "cosmicworks" not in client.list_database_names():
db.command(
{
"customAction": "CreateDatabase",
"offerThroughput": 400,
}
)
collection = db["products"]
if "products" not in db.list_collection_names():
db.command({"customAction": "CreateCollection", "collection": "products"})
Usare update_one per creare un nuovo elemento nel contenitore.
Se viene visualizzato un errore SSL, può essere necessario disabilitare TLS/SSL per l'applicazione. Questo problema si verifica in genere se si sviluppa nel computer locale usando l'emulatore di Azure Cosmos DB in un contenitore e non è stato importato il certificato SSL del contenitore. Per risolvere il problema, configurare l'applicazione per disabilitare la convalida TLS/SSL prima di creare il client:
var createKeyspace = await session.PrepareAsync("CREATE KEYSPACE IF NOT EXISTS cosmicworks WITH replication = {'class':'basicclass', 'replication_factor': 1};");
await session.ExecuteAsync(createKeyspace.Bind());
var createTable = await session.PrepareAsync("CREATE TABLE IF NOT EXISTS cosmicworks.products (id text PRIMARY KEY, name text)");
await session.ExecuteAsync(createTable.Bind());
Creare un nuovo elemento nella tabella usando ExecuteAsync. Usare Bind per assegnare proprietà all'elemento.
var item = new
{
id = "68719518371",
name = "Kiama classic surfboard"
};
var createItem = await session.PrepareAsync("INSERT INTO cosmicworks.products (id, name) VALUES (?, ?)");
var createItemStatement = createItem.Bind(item.id, item.name);
await session.ExecuteAsync(createItemStatement);
Importare il pacchetto cassandra-driver da Python Package Index.
pip install cassandra-driver
Creare il file app.py.
Importare PROTOCOL_TLS_CLIENT, SSLContext e CERT_NONE dal modulo ssl. Importare quindi Cluster dal modulo cassandra.cluster. Infine, importare PlainTextAuthProvider dal modulo cassandra.auth.
from ssl import PROTOCOL_TLS_CLIENT, SSLContext, CERT_NONE
from cassandra.cluster import Cluster
from cassandra.auth import PlainTextAuthProvider
Creare una nuova variabile di contesto TLS/SSL usando SSLContext. Configurare il contesto in modo da non verificare il certificato autofirmato dell'emulatore.
Creare un nuovo keyspace e una nuova tabella usando session.execute.
session.execute(
"CREATE KEYSPACE IF NOT EXISTS cosmicworks WITH replication = {'class':'ba"
"sicclass', 'replication_factor': 1};"
)
session.execute(
"CREATE TABLE IF NOT EXISTS cosmicworks.products (id text PRIMARY KEY, nam"
"e text)"
)
Usare session.execute per creare un nuovo elemento nella tabella.
Installare il pacchetto cassandra-driver da Node Package Manager.
npm install --save cassandra-driver
Creare il file app.js.
Importare il tipo Client e lo spazio dei nomi auth dal modulo cassandra-driver.
import { Client, auth } from 'cassandra-driver'
Usare PlainTextAuthProvider per creare un nuovo oggetto per le credenziali dell'emulatore. Usare Client per connettersi all'emulatore usando le credenziali.
const credentials = new auth.PlainTextAuthProvider(
'localhost',
'C2y6yDjf5/R+ob0N8A7Cgv30VRDJIWEHLM+4QDU5DE2nQ9nDuVTqobD4b8mGGyPMbIZnqyMsEcaGQy67XIw/Jw=='
)
const client = new Client({
contactPoints: [
'localhost:10350'
],
authProvider: credentials,
localDataCenter: 'South Central US'
})
Usare execute per eseguire un comando dal lato server per creare un keyspace e una tabella.
await client.execute(
'CREATE KEYSPACE IF NOT EXISTS cosmicworks WITH replication = {\'class\':\'basicclass\', \'replication_factor\': 1};'
)
await client.execute(
'CREATE TABLE IF NOT EXISTS cosmicworks.products (id text PRIMARY KEY, name text)'
)
Usare di nuovo execute per creare un nuovo elemento con parametri.
Se viene visualizzato un errore SSL, può essere necessario disabilitare TLS/SSL per l'applicazione. Questo problema si verifica in genere se si sviluppa nel computer locale usando l'emulatore di Azure Cosmos DB in un contenitore e non è stato importato il certificato SSL del contenitore. Per risolvere il problema, configurare il client per disabilitare la convalida TLS/SSL:
Prima di iniziare, l'API per Apache Gremlin richiede di creare le risorse nell'emulatore. Creare un database denominato db1 e un contenitore denominato coll1. Le impostazioni di velocità effettiva sono irrilevanti per questa guida e possono essere impostate come si preferisce.
var server = new GremlinServer(
hostname: "localhost",
port: 8901,
username: "/dbs/db1/colls/coll1",
password: "C2y6yDjf5/R+ob0N8A7Cgv30VRDJIWEHLM+4QDU5DE2nQ9nDuVTqobD4b8mGGyPMbIZnqyMsEcaGQy67XIw/Jw=="
);
using var client = new GremlinClient(
gremlinServer: server,
messageSerializer: new Gremlin.Net.Structure.IO.GraphSON.GraphSON2MessageSerializer()
);
Installare il pacchetto gremlin da Node Package Manager.
npm install --save gremlin
Creare il file app.js.
Importare il modulo gremlin.
import gremlin from 'gremlin'
Usare PlainTextSaslAuthenticator per creare un nuovo oggetto per le credenziali dell'emulatore. Usare Client per connettersi all'emulatore usando le credenziali.
Eliminare qualsiasi contenuto esistente all'interno del file.
Aggiungere un blocco Using per lo spazio dei nomi Azure.Data.Tables.
using Azure.Data.Tables;
Creare una nuova istanza di TableServiceClient usando le credenziali dell'emulatore.
var serviceClient = new TableServiceClient(
connectionString: "DefaultEndpointsProtocol=http;AccountName=localhost;AccountKey=C2y6yDjf5/R+ob0N8A7Cgv30VRDJIWEHLM+4QDU5DE2nQ9nDuVTqobD4b8mGGyPMbIZnqyMsEcaGQy67XIw/Jw==;TableEndpoint=http://localhost:8902/;"
);
Se viene visualizzato un errore SSL, può essere necessario disabilitare TLS/SSL per l'applicazione. Questo problema si verifica in genere se si sviluppa nel computer locale usando l'emulatore di Azure Cosmos DB in un contenitore e non è stato importato il certificato SSL del contenitore. Per risolvere il problema, configurare il client per disabilitare la convalida TLS/SSL:
Usare l'emulatore in un flusso di lavoro CI di GitHub Actions
Per eseguire un carico di lavoro di integrazione continua che convalida automaticamente l'applicazione, usare l'emulatore di Azure Cosmos DB con un gruppo di test del proprio framework preferito. L'emulatore di Azure Cosmos DB è preinstallato nella variante windows-latest degli strumenti di esecuzione ospitati di GitHub Actions.