Programowanie lokalnie przy użyciu emulatora usługi Azure Cosmos DB
Artykuł
Typowym przypadkiem użycia emulatora jest użycie jako bazy danych deweloperskich podczas kompilowania aplikacji. Korzystanie z emulatora na potrzeby programowania może ułatwić poznanie cech tworzenia i modelowania danych dla bazy danych, takiej jak Azure Cosmos DB, bez ponoszenia kosztów usług. Ponadto użycie emulatora w ramach przepływu pracy automatyzacji może zapewnić, że można uruchomić ten sam zestaw testów integracji. Możesz mieć pewność, że te same testy są uruchamiane lokalnie na komputerze deweloperskim i zdalnie w ramach zadania ciągłej integracji.
Ściąganie mcr.microsoft.com/cosmosdb/linux/azure-cosmos-emulator obrazu kontenera systemu Linux z rejestru kontenerów do lokalnego hosta platformy Docker.
Ściąganie obrazu kontenera systemu mcr.microsoft.com/cosmosdb/windows/azure-cosmos-emulator Windows z rejestru kontenerów do lokalnego hosta platformy Docker.
Ściąganie mcr.microsoft.com/cosmosdb/linux/azure-cosmos-emulator obrazu kontenera systemu Linux przy użyciu tagu mongodb z rejestru kontenerów do lokalnego hosta platformy Docker.
Wariant kontenera platformy Docker (Linux lub Windows) emulatora nie obsługuje interfejsu API dla systemu Apache Cassandra, interfejsu API dla języka Apache Gremlin lub interfejsu API dla tabeli.
Aby rozpocząć, pobierz i zainstaluj najnowszą wersję emulatora usługi Azure Cosmos DB na komputerze lokalnym.
Napiwek
W artykule o wersji emulatora wymieniono wszystkie dostępne wersje i aktualizacje funkcji wprowadzone w każdej wersji.
Wariant kontenera platformy Docker emulatora nie obsługuje interfejsu API dla systemu Apache Cassandra.
Uruchom plik wykonywalny emulatora (Microsoft.Azure.Cosmos.Emulator.exe) w ścieżce %ProgramFiles%\Azure Cosmos DB Emulator . Użyj tych parametrów, aby skonfigurować emulator:
opis
EnableCassandraEndpoint
Włącza interfejs API dla punktu końcowego apache Cassandra.
Wariant kontenera platformy Docker emulatora nie obsługuje interfejsu API dla języka Apache Gremlin.
Uruchom plik wykonywalny emulatora (Microsoft.Azure.Cosmos.Emulator.exe) w ścieżce %ProgramFiles%\Azure Cosmos DB Emulator . Użyj tych parametrów, aby skonfigurować emulator:
opis
EnableGremlinEndpoint
Włącza interfejs API dla punktu końcowego apache Gremlin.
Wariant kontenera platformy Docker emulatora nie obsługuje interfejsu API dla tabeli.
Uruchom plik wykonywalny emulatora (Microsoft.Azure.Cosmos.Emulator.exe) w ścieżce %ProgramFiles%\Azure Cosmos DB Emulator . Użyj tych parametrów, aby skonfigurować emulator:
Przejdź do witryny , https://localhost:8081/_explorer/index.html aby uzyskać dostęp do eksploratora danych.
Obraz kontenera platformy Docker (Windows) nie obsługuje interfejsu API dla bazy danych MongoDB.
Uruchom plik wykonywalny emulatora (Microsoft.Azure.Cosmos.Emulator.exe) w ścieżce %ProgramFiles%\Azure Cosmos DB Emulator . Użyj tych parametrów, aby skonfigurować emulator:
opis
EnableMongoDbEndpoint
Włącza interfejs API dla punktu końcowego bazy danych MongoDB w określonej wersji bazy danych MongoDB.
Aby uzyskać więcej informacji na temat argumentów wiersza polecenia i wersji bazy danych MongoDB obsługiwanych przez emulator, zobacz parametry wiersza polecenia.
Emulator automatycznie otwiera eksploratora danych przy użyciu adresu URL https://localhost:8081/_explorer/index.html.
Importowanie certyfikatu TLS/SSL emulatora
Zaimportuj certyfikat TLS/SSL emulatora do korzystania z preferowanego zestawu SDK dla deweloperów bez wyłączania protokołu TLS/SSL na kliencie.
Wariant kontenera platformy Docker (Linux lub Windows) emulatora nie obsługuje interfejsu API dla systemu Apache Cassandra, interfejsu API dla języka Apache Gremlin lub interfejsu API dla tabeli.
Lokalna instalacja emulatora systemu Windows automatycznie importuje certyfikaty TLS/SSL. Nie trzeba podejmować żadnych dalszych działań.
Certyfikat emulatora jest dostępny w ścieżce _explorer/emulator.pem uruchomionego kontenera. Użyj polecenia curl , aby pobrać certyfikat z uruchomionego kontenera na komputer lokalny.
Może być konieczne zmianę hosta (lub adresu IP) i numeru portu, jeśli wcześniej zmodyfikowano te wartości.
Zainstaluj certyfikat zgodnie z procesem zwykle używanym dla systemu operacyjnego. Na przykład w systemie Linux należy skopiować certyfikat do ścieżki /usr/local/share/ca-certificates/ .
W przypadku systemów Linux ponownie wygeneruj pakiet certyfikatów przy użyciu odpowiedniego polecenia dla dystrybucji systemu Linux.
W przypadku systemów Linux opartych na debianie (na przykład Ubuntu) użyj:
sudo update-ca-certificates
W przypadku systemów Linux opartych na systemie Red Hat (na przykład CentOS, Fedora) użyj:
sudo update-ca-trust
Aby uzyskać bardziej szczegółowe instrukcje, zapoznaj się z dokumentacją specyficzną dla systemu operacyjnego.
Certyfikat emulatora jest dostępny w folderze C:\CosmosDB.Emulator\bind-mount w uruchomionym kontenerze. Folder zawiera również skrypt umożliwiający automatyczne zainstalowanie certyfikatu.
Użyj polecenia docker cp , aby skopiować cały folder na komputer lokalny.
Lokalna instalacja emulatora systemu Windows automatycznie importuje certyfikaty TLS/SSL. Nie trzeba podejmować żadnych dalszych działań.
Nawiązywanie połączenia z emulatorem z zestawu SDK
Każdy zestaw SDK zawiera klasę klienta zwykle używaną do łączenia zestawu SDK z kontem usługi Azure Cosmos DB. Korzystając z poświadczeń emulatora, można zamiast tego połączyć zestaw SDK z wystąpieniem emulatora.
Utwórz nowy element w kontenerze przy użyciu polecenia UpsertItemAsync.
var item = new
{
id = "68719518371",
name = "Kiama classic surfboard"
};
await container.UpsertItemAsync(item);
Uruchom aplikację .NET.
dotnet run
Ostrzeżenie
Jeśli wystąpi błąd SSL, może być konieczne wyłączenie protokołu TLS/SSL dla aplikacji. Dzieje się tak często, jeśli programujesz na komputerze lokalnym przy użyciu emulatora usługi Azure Cosmos DB w kontenerze i nie zaimportował certyfikatu SSL kontenera. Aby rozwiązać ten problem, skonfiguruj opcje klienta, aby wyłączyć walidację protokołu TLS/SSL przed utworzeniem klienta:
Jeśli wystąpi błąd SSL, może być konieczne wyłączenie protokołu TLS/SSL dla aplikacji. Dzieje się tak często, jeśli programujesz na komputerze lokalnym przy użyciu emulatora usługi Azure Cosmos DB w kontenerze i nie zaimportował certyfikatu SSL kontenera. Aby rozwiązać ten problem, skonfiguruj aplikację tak, aby wyłączyła walidację protokołu TLS/SSL przed utworzeniem klienta:
import urllib3
urllib3.disable_warnings()
Jeśli nadal występują błędy protokołu SSL, możliwe, że język Python pobiera certyfikaty z innego magazynu certyfikatów. Aby określić ścieżkę, w której język Python szuka certyfikatów, wykonaj następujące kroki:
Ważne
Jeśli używasz środowiska wirtualnego języka Python (venv), upewnij się, że zostało ono aktywowane przed uruchomieniem poleceń.
Otwieranie terminalu
Uruchom interpreter języka Python, wpisując python lub python3, w zależności od wersji języka Python.
W interpreterze języka Python uruchom następujące polecenia:
from requests.utils import DEFAULT_CA_BUNDLE_PATH
print(DEFAULT_CA_BUNDLE_PATH)
W środowisku wirtualnym ścieżka może być (przynajmniej w systemie Ubuntu):
Poza środowiskiem wirtualnym ścieżka może być (przynajmniej w systemie Ubuntu):
/etc/ssl/certs/ca-certificates.crt
Po zidentyfikowaniu DEFAULT_CA_BUNDLE_PATH otwórz nowy terminal i uruchom następujące polecenia, aby dołączyć certyfikat emulatora do pakietu certyfikatów:
Ważne
Jeśli DEFAULT_CA_BUNDLE_PATH zmienna wskazuje katalog systemowy, może wystąpić błąd "Odmowa uprawnień". W takim przypadku należy uruchomić polecenia z podwyższonym poziomem uprawnień (jako katalog główny). Ponadto należy zaktualizować i ponownie wygenerować pakiet certyfikatów po wykonaniu podanych poleceń.
# 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
Jeśli wystąpi błąd SSL, może być konieczne wyłączenie protokołu TLS/SSL dla aplikacji. Dzieje się tak często, jeśli programujesz na komputerze lokalnym przy użyciu emulatora usługi Azure Cosmos DB w kontenerze i nie zaimportował certyfikatu SSL kontenera. Aby rozwiązać ten problem, skonfiguruj aplikację tak, aby wyłączyła walidację protokołu TLS/SSL przed utworzeniem klienta:
Utwórz nowe wystąpienie MongoClient przy użyciu poświadczeń emulatora.
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"})
Użyj update_one polecenia , aby utworzyć nowy element w kontenerze.
Użyj sterownika Node.js bazy danych MongoDB, aby nawiązać połączenie z emulatorem z aplikacji Node.js/JavaScript.
Rozpocznij w pustym folderze.
Zainicjuj nowy moduł.
npm init es6 --yes
mongodb Zainstaluj pakiet z Menedżer pakietów Node.
npm install --save mongodb
Utwórz plik app.js.
Zaimportuj MongoClient typ z modułu mongodb .
import { MongoClient } from 'mongodb'
Użyj MongoClient polecenia , aby utworzyć nowe wystąpienie klienta przy użyciu poświadczeń emulatora. Użyj connect polecenia , aby nawiązać połączenie z emulatorem.
const client = new MongoClient(
'mongodb://localhost:C2y6yDjf5%2FR%2Bob0N8A7Cgv30VRDJIWEHLM%2B4QDU5DE2nQ9nDuVTqobD4b8mGGyPMbIZnqyMsEcaGQy67XIw%2FJw%3D%3D@localhost:10255/admin?ssl=true&retrywrites=false'
)
await client.connect()
Użyj polecenia db i collection , aby utworzyć bazę danych i kontener.
Jeśli wystąpi błąd SSL, może być konieczne wyłączenie protokołu TLS/SSL dla aplikacji. Dzieje się tak często, jeśli programujesz na komputerze lokalnym przy użyciu emulatora usługi Azure Cosmos DB w kontenerze i nie zaimportował certyfikatu SSL kontenera. Aby rozwiązać ten problem, skonfiguruj aplikację tak, aby wyłączyła walidację protokołu TLS/SSL przed utworzeniem klienta:
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());
Utwórz nowy element w tabeli przy użyciu polecenia ExecuteAsync. Służy Bind do przypisywania właściwości do elementu.
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);
Uruchom aplikację .NET.
dotnet run
Użyj sterownika apache Cassandra Python, aby nawiązać połączenie z emulatorem z poziomu aplikacji języka Python.
Rozpocznij w pustym folderze.
Zaimportuj cassandra-driver pakiet z indeksu pakietów języka Python.
pip install cassandra-driver
Utwórz plik app.py.
Zaimportuj PROTOCOL_TLS_CLIENTpliki , SSLContexti CERT_NONE z modułu ssl . Następnie zaimportuj Cluster z modułu cassandra.cluster . Na koniec zaimportuj PlainTextAuthProvider z modułu cassandra.auth .
from ssl import PROTOCOL_TLS_CLIENT, SSLContext, CERT_NONE
from cassandra.cluster import Cluster
from cassandra.auth import PlainTextAuthProvider
Utwórz nową zmienną kontekstową TLS/SSL przy użyciu polecenia SSLContext. Skonfiguruj kontekst, aby nie zweryfikować certyfikatu z podpisem własnym emulatora.
Utwórz nową przestrzeń kluczy i tabelę przy użyciu polecenia 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)"
)
Użyj session.execute polecenia , aby utworzyć nowy element w tabeli.
Zaimportuj Client typ i auth przestrzeń nazw z modułu cassandra-driver .
import { Client, auth } from 'cassandra-driver'
Użyj PlainTextAuthProvider polecenia , aby utworzyć nowy obiekt dla poświadczeń emulatora. Użyj Client polecenia , aby nawiązać połączenie z emulatorem przy użyciu poświadczeń.
const credentials = new auth.PlainTextAuthProvider(
'localhost',
'C2y6yDjf5/R+ob0N8A7Cgv30VRDJIWEHLM+4QDU5DE2nQ9nDuVTqobD4b8mGGyPMbIZnqyMsEcaGQy67XIw/Jw=='
)
const client = new Client({
contactPoints: [
'localhost:10350'
],
authProvider: credentials,
localDataCenter: 'South Central US'
})
Użyj execute polecenia , aby uruchomić polecenie po stronie serwera, aby utworzyć przestrzeń kluczy i tabelę.
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)'
)
Użyj execute ponownie, aby utworzyć nowy element z parametrami.
Jeśli wystąpi błąd SSL, może być konieczne wyłączenie protokołu TLS/SSL dla aplikacji. Dzieje się tak często, jeśli programujesz na komputerze lokalnym przy użyciu emulatora usługi Azure Cosmos DB w kontenerze i nie zaimportował certyfikatu SSL kontenera. Aby rozwiązać ten problem, skonfiguruj klienta tak, aby wyłączył walidację protokołu TLS/SSL:
Przed rozpoczęciem interfejs API dla języka Apache Gremlin wymaga utworzenia zasobów w emulatorze. Utwórz bazę danych o nazwie db1 i kontener o nazwie coll1. Ustawienia przepływności są nieistotne dla tego przewodnika i można je ustawić tak mało, jak chcesz.
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()
);
Użyj sterownika Node.js Apache Gremlin, aby użyć emulatora z aplikacji Node.js/JavaScript.
Rozpocznij w pustym folderze.
Zainicjuj nowy moduł.
npm init es6 --yes
gremlin Zainstaluj pakiet z Menedżer pakietów Node.
npm install --save gremlin
Utwórz plik app.js.
Zaimportuj gremlin moduł.
import gremlin from 'gremlin'
Użyj PlainTextSaslAuthenticator polecenia , aby utworzyć nowy obiekt dla poświadczeń emulatora. Użyj Client polecenia , aby nawiązać połączenie z emulatorem przy użyciu poświadczeń.
Utwórz nowe wystąpienie TableServiceClient przy użyciu poświadczeń emulatora.
var serviceClient = new TableServiceClient(
connectionString: "DefaultEndpointsProtocol=http;AccountName=localhost;AccountKey=C2y6yDjf5/R+ob0N8A7Cgv30VRDJIWEHLM+4QDU5DE2nQ9nDuVTqobD4b8mGGyPMbIZnqyMsEcaGQy67XIw/Jw==;TableEndpoint=http://localhost:8902/;"
);
Jeśli wystąpi błąd SSL, może być konieczne wyłączenie protokołu TLS/SSL dla aplikacji. Dzieje się tak często, jeśli programujesz na komputerze lokalnym przy użyciu emulatora usługi Azure Cosmos DB w kontenerze i nie zaimportował certyfikatu SSL kontenera. Aby rozwiązać ten problem, skonfiguruj klienta tak, aby wyłączył walidację protokołu TLS/SSL:
Korzystanie z emulatora w przepływie pracy ciągłej integracji funkcji GitHub Actions
Aby uruchomić obciążenie ciągłej integracji, które automatycznie weryfikuje aplikację, użyj emulatora usługi Azure Cosmos DB z wybranym zestawem testów. Emulator usługi Azure Cosmos DB jest wstępnie zainstalowany w wariantach windows-latest hostowanych modułów uruchamianych w usłudze GitHub Action.
Uruchom zestaw testów przy użyciu wbudowanego sterownika testowego dla platformy .NET i platformy testowej, takiej jak MSTest, NUnit lub XUnit.
Sprawdź, czy zestaw testów jednostkowych dla aplikacji działa zgodnie z oczekiwaniami.
dotnet test
Utwórz nowy przepływ pracy w repozytorium GitHub w pliku o nazwie .github/workflows/ci.yml.
Dodaj zadanie do przepływu pracy, aby uruchomić emulator usługi Azure Cosmos DB przy użyciu programu PowerShell i uruchomić zestaw testów jednostkowych.
name: Continuous Integration
on:
push:
branches:
- main
jobs:
unit_tests:
name: Run .NET unit tests
runs-on: windows-latest
steps:
- name: Checkout (GitHub)
uses: actions/checkout@v3
- name: Start Azure Cosmos DB emulator
run: |
Write-Host "Launching Cosmos DB Emulator"
Import-Module "$env:ProgramFiles\Azure Cosmos DB Emulator\PSModules\Microsoft.Azure.CosmosDB.Emulator"
Start-CosmosDbEmulator
- name: Run .NET tests
run: dotnet test
Uwaga
Uruchom emulator z wiersza polecenia przy użyciu różnych argumentów lub poleceń programu PowerShell. Aby uzyskać więcej informacji, zobacz argumenty wiersza polecenia emulatora.
Przetestuj operacje aplikacji języka Python i bazy danych przy użyciu polecenia pytest.
Sprawdź, czy zestaw testów jednostkowych dla aplikacji działa zgodnie z oczekiwaniami.
pip install -U pytest
pytest
Utwórz nowy przepływ pracy w repozytorium GitHub w pliku o nazwie .github/workflows/ci.yml.
Dodaj zadanie do przepływu pracy, aby uruchomić emulator usługi Azure Cosmos DB przy użyciu programu PowerShell i uruchomić zestaw testów jednostkowych.
name: Continuous Integration
on:
push:
branches:
- main
jobs:
unit_tests:
name: Run Python unit tests
runs-on: windows-latest
steps:
- name: Checkout (GitHub)
uses: actions/checkout@v3
- name: Start Azure Cosmos DB emulator
run: |
Write-Host "Launching Cosmos DB Emulator"
Import-Module "$env:ProgramFiles\Azure Cosmos DB Emulator\PSModules\Microsoft.Azure.CosmosDB.Emulator"
Start-CosmosDbEmulator
- name: Install test runner
run: pip install pytest
- name: Run Python tests
run: pytest
Uwaga
Uruchom emulator z wiersza polecenia przy użyciu różnych argumentów lub poleceń programu PowerShell. Aby uzyskać więcej informacji, zobacz argumenty wiersza polecenia emulatora.
Użyj polecenia mocha , aby przetestować aplikację Node.js i jej modyfikacje bazy danych.
Sprawdź, czy zestaw testów jednostkowych dla aplikacji działa zgodnie z oczekiwaniami.
npm install --global mocha
mocha
Utwórz nowy przepływ pracy w repozytorium GitHub w pliku o nazwie .github/workflows/ci.yml.
Dodaj zadanie do przepływu pracy, aby uruchomić emulator usługi Azure Cosmos DB przy użyciu programu PowerShell i uruchomić zestaw testów jednostkowych.
name: Continuous Integration
on:
push:
branches:
- main
jobs:
unit_tests:
name: Run Node.js unit tests
runs-on: windows-latest
steps:
- name: Checkout (GitHub)
uses: actions/checkout@v3
- name: Start Azure Cosmos DB emulator
run: |
Write-Host "Launching Cosmos DB Emulator"
Import-Module "$env:ProgramFiles\Azure Cosmos DB Emulator\PSModules\Microsoft.Azure.CosmosDB.Emulator"
Start-CosmosDbEmulator
- name: Install test runner
run: npm install --global mocha
- name: Run Node.js tests
run: mocha
Uwaga
Uruchom emulator z wiersza polecenia przy użyciu różnych argumentów lub poleceń programu PowerShell. Aby uzyskać więcej informacji, zobacz argumenty wiersza polecenia emulatora.