Desenvolver localmente usando o emulador do Azure Cosmos DB
Artigo
Um caso de uso comum para o emulador é servir como um banco de dados de desenvolvimento enquanto você está criando seus aplicativos. Usar o emulador para desenvolvimento pode ajudá-lo a aprender características de criação e modelagem de dados para um banco de dados como o Azure Cosmos DB sem incorrer em custos de serviço. Além disso, usar o emulador como parte de um fluxo de trabalho de automação pode garantir que você possa executar o mesmo conjunto de testes de integração. Você pode garantir que os mesmos testes sejam executados localmente em seu computador de desenvolvimento e remotamente em um trabalho de integração contínua.
Efetuar pull da imagem de contêiner mcr.microsoft.com/cosmosdb/linux/azure-cosmos-emulator do Linux do registro de contêiner para o host local do Docker.
Efetuar pull da imagem de contêiner mcr.microsoft.com/cosmosdb/windows/azure-cosmos-emulator do Windows do registro de contêiner para o host local do Docker.
Efetuar pull da imagem de contêiner mcr.microsoft.com/cosmosdb/linux/azure-cosmos-emulator do Linux usando a marca mongodb do registro de contêiner para o host local do Docker.
A variante de contêiner do Docker (Linux ou Windows) do emulador não dá suporte à API para Apache Cassandra, À API para Apache Gremlin ou à API para Tabela.
Para começar, baixe e instale a versão mais recente do Emulador do Azure Cosmos DB no computador local.
Dica
O artigo notas sobre a versão do emulador lista todas as versões disponíveis e as atualizações de recursos feitas em cada versão.
A variante de contêiner do Docker do emulador não dá suporte à API para Apache Cassandra.
Inicie o executável do emulador (Microsoft.Azure.Cosmos.Emulator.exe) no caminho %ProgramFiles%\Azure Cosmos DB Emulator. Use estes parâmetros para configurar o emulador:
Descrição
EnableCassandraEndpoint
Habilita a API para o ponto de extremidade do Apache Cassandra.
CassandraPort
Número da porta a ser usado para o ponto de extremidade.
A variante de contêiner do Docker do emulador não dá suporte à API para Apache Gremlin.
Inicie o executável do emulador (Microsoft.Azure.Cosmos.Emulator.exe) no caminho %ProgramFiles%\Azure Cosmos DB Emulator. Use estes parâmetros para configurar o emulador:
Descrição
EnableGremlinEndpoint
Habilita a API para o ponto de extremidade do Apache Gremlin.
GremlinPort
Número da porta a ser usado para o ponto de extremidade.
A variante de contêiner do Docker do emulador não dá suporte à API para Tabela.
Inicie o executável do emulador (Microsoft.Azure.Cosmos.Emulator.exe) no caminho %ProgramFiles%\Azure Cosmos DB Emulator. Use estes parâmetros para configurar o emulador:
Descrição
EnableTableEndpoint
Habilita a API para ponto de extremidade da Tabela.
TablePort
Número da porta a ser usado para o ponto de extremidade.
Navegue até https://localhost:8081/_explorer/index.html para acessar o data explorer.
A imagem de contêiner do Docker (Windows) não dá suporte à API para MongoDB.
Inicie o executável do emulador (Microsoft.Azure.Cosmos.Emulator.exe) no caminho %ProgramFiles%\Azure Cosmos DB Emulator. Use estes parâmetros para configurar o emulador:
Descrição
EnableMongoDbEndpoint
Habilita o ponto de extremidade da API para MongoDB na versão especificada do MongoDB.
MongoPort
Número da porta a ser usado para o ponto de extremidade.
Para obter mais informações sobre argumentos de linha de comando e versões do MongoDB compatíveis com o emulador, consulte parâmetros de linha de comando.
O emulador abre automaticamente o data explorer usando a URL https://localhost:8081/_explorer/index.html.
Importar o certificado TLS/SSL do emulador
Importe o certificado TLS/SSL do emulador para usar o emulador com seu SDK de desenvolvedor preferencial sem desabilitar o TLS/SSL no cliente.
A variante de contêiner do Docker (Linux ou Windows) do emulador não dá suporte à API para Apache Cassandra, À API para Apache Gremlin ou à API para Tabela.
A instalação local do Windows do emulador importa automaticamente os certificados TLS/SSL. Nenhuma ação adicional é necessária.
O certificado do emulador está disponível no caminho _explorer/emulator.pem no contêiner em execução. Use curl para baixar o certificado do contêiner em execução no computador local.
Talvez seja necessário alterar o host (ou endereço IP) e o número da porta se tiver modificado esses valores anteriormente.
Instale o certificado de acordo com o processo normalmente usado para seu sistema operacional. Por exemplo, no Linux, você copiaria o certificado para o caminho /usr/local/share/ca-certificates/.
Para sistemas Linux, gere novamente o pacote de certificados usando o comando apropriado para sua distribuição Linux.
Para sistemas Linux baseados em Debian (por exemplo, Ubuntu), use:
sudo update-ca-certificates
Para sistemas Linux baseados em Red Hat (por exemplo, CentOS, Fedora), use:
sudo update-ca-trust
Para obter instruções mais detalhadas, consulte a documentação específica do seu sistema operacional.
O certificado do emulador está disponível na pasta C:\CosmosDB.Emulator\bind-mount do contêiner em execução. A pasta também contém um script para instalar automaticamente o certificado.
Use docker cp para copiar a pasta inteira para sua máquina local.
A instalação local do Windows do emulador importa automaticamente os certificados TLS/SSL. Nenhuma ação adicional é necessária.
Conectar-se ao emulador do SDK
Cada SDK inclui uma classe de cliente normalmente usada para conectar o SDK à sua conta do Azure Cosmos DB. Usando as credenciais do emulador, você pode conectar o SDK à instância do emulador.
var item = new
{
id = "68719518371",
name = "Kiama classic surfboard"
};
await container.UpsertItemAsync(item);
Execute o aplicativo .NET.
dotnet run
Aviso
Se você receber um erro SSL, talvez seja necessário desabilitar o TLS/SSL para seu aplicativo. Isso geralmente ocorre se você estiver desenvolvendo em seu computador local, usando o emulador do Azure Cosmos DB em um contêiner e não tiver importado o certificado SSL do contêiner. Para resolve isso, configure as opções do cliente para desabilitar a validação de TLS/SSL antes de criar o cliente:
Se você receber um erro de SSL, talvez seja necessário desabilitar o TLS/SSL para seu aplicativo. Isso geralmente ocorre se você estiver desenvolvendo em seu computador local, usando o emulador do Azure Cosmos DB em um contêiner e não tiver importado o certificado SSL do contêiner. Para resolve isso, configure o aplicativo para desabilitar a validação de TLS/SSL antes de criar o cliente:
import urllib3
urllib3.disable_warnings()
Se você ainda estiver enfrentando erros de SSL, é possível que o Python esteja recuperando os certificados de um armazenamento de certificados diferente. Para determinar o caminho em que o Python está procurando os certificados, siga estas etapas:
Importante
Se você estiver usando um ambiente virtual (venv) do Python, verifique se ele está ativado antes de executar os comandos!
Abra um terminal
Para iniciar o interpretador do Python, digite python ou python3, dependendo da versão do Python.
No interpretador do Python, execute os seguintes comandos:
from requests.utils import DEFAULT_CA_BUNDLE_PATH
print(DEFAULT_CA_BUNDLE_PATH)
Dentro de um ambiente virtual, o caminho pode ser (pelo menos no Ubuntu):
Fora de um ambiente virtual, o caminho pode ser (pelo menos no Ubuntu):
/etc/ssl/certs/ca-certificates.crt
Depois de identificar DEFAULT_CA_BUNDLE_PATH, abra um novo terminal e execute os seguintes comandos para anexar o certificado do emulador ao pacote de certificados:
Importante
Se a variável DEFAULT_CA_BUNDLE_PATH apontar para um diretório do sistema, você poderá encontrar um erro de "Permissão negada". Nesse caso, você precisará executar os comandos com privilégios elevados (como root). Além disso, você precisará atualizar e regenerar o pacote de certificados depois de executar os comandos fornecidos.
# 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 você receber um erro SSL, talvez seja necessário desabilitar o TLS/SSL para seu aplicativo. Isso geralmente ocorre se você estiver desenvolvendo em seu computador local, usando o emulador do Azure Cosmos DB em um contêiner e não tiver importado o certificado SSL do contêiner. Para resolve isso, configure o aplicativo para desabilitar a validação de TLS/SSL antes de criar o cliente:
Exclua qualquer conteúdo existente dentro do arquivo.
Adicionar um bloco using para o namespace MongoDB.Driver.
using MongoDB.Driver;
Crie uma nova instância do MongoClient usando as credenciais do emulador.
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"})
Use update_one para criar um novo item no contêiner.
Se você receber um erro SSL, talvez seja necessário desabilitar o TLS/SSL para seu aplicativo. Isso geralmente ocorre se você estiver desenvolvendo em seu computador local, usando o emulador do Azure Cosmos DB em um contêiner e não tiver importado o certificado SSL do contêiner. Para resolve isso, configure o aplicativo para desabilitar a validação de TLS/SSL antes de criar o cliente:
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());
Crie um novo item na tabela usando ExecuteAsync. Use Bind para atribuir propriedades ao item.
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);
Importe o pacote cassandra-driver do Índice de Pacotes do Python.
pip install cassandra-driver
Abra o arquivo app.py.
Importe PROTOCOL_TLS_CLIENT, SSLContext e CERT_NONE do módulo ssl. Em seguida, importe Cluster do módulo cassandra.cluster. Por fim, importe PlainTextAuthProvider do módulo cassandra.auth.
from ssl import PROTOCOL_TLS_CLIENT, SSLContext, CERT_NONE
from cassandra.cluster import Cluster
from cassandra.auth import PlainTextAuthProvider
Crie uma nova variável de contexto TLS/SSL usando SSLContext. Configure o contexto para não verificar o certificado autoassinado do emulador.
Crie um novo keyspace e uma tabela 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)"
)
Use session.execute para criar um novo item na tabela.
Instale o pacote cassandra-driver do Gerenciador de Pacotes do Node.
npm install --save cassandra-driver
Crie o arquivo app.js.
Importe o tipo Client e o namespace auth do módulo cassandra-driver.
import { Client, auth } from 'cassandra-driver'
Use PlainTextAuthProvider para criar um novo objeto para as credenciais do emulador. Use Client para se conectar ao emulador usando as credenciais.
const credentials = new auth.PlainTextAuthProvider(
'localhost',
'C2y6yDjf5/R+ob0N8A7Cgv30VRDJIWEHLM+4QDU5DE2nQ9nDuVTqobD4b8mGGyPMbIZnqyMsEcaGQy67XIw/Jw=='
)
const client = new Client({
contactPoints: [
'localhost:10350'
],
authProvider: credentials,
localDataCenter: 'South Central US'
})
Use execute para executar um comando do lado do servidor para criar um keyspace e uma tabela.
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)'
)
Use execute novamente para criar um novo item com parâmetros.
Se você receber um erro SSL, talvez seja necessário desabilitar o TLS/SSL para seu aplicativo. Isso geralmente ocorre se você estiver desenvolvendo em seu computador local, usando o emulador do Azure Cosmos DB em um contêiner e não tiver importado o certificado SSL do contêiner. Para resolve isso, configure o cliente para desabilitar a validação de TLS/SSL:
Antes de começar, a API para Apache Gremlin exige que você crie seus recursos no emulador. Crie um banco de dados chamado db1 e um contêiner chamado coll1. As configurações de taxa de transferência são irrelevantes para este guia e podem ser definidas da forma mais baixa que desejar.
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()
);
Instale o pacote gremlin do Gerenciador de Pacotes do Node.
npm install --save gremlin
Crie o arquivo app.js.
Importe o módulo gremlin.
import gremlin from 'gremlin'
Use PlainTextSaslAuthenticator para criar um novo objeto para as credenciais do emulador. Use Client para se conectar ao emulador usando as credenciais.
Crie uma nova instância do TableServiceClient usando as credenciais do emulador.
var serviceClient = new TableServiceClient(
connectionString: "DefaultEndpointsProtocol=http;AccountName=localhost;AccountKey=C2y6yDjf5/R+ob0N8A7Cgv30VRDJIWEHLM+4QDU5DE2nQ9nDuVTqobD4b8mGGyPMbIZnqyMsEcaGQy67XIw/Jw==;TableEndpoint=http://localhost:8902/;"
);
Se você receber um erro SSL, talvez seja necessário desabilitar o TLS/SSL para seu aplicativo. Isso geralmente ocorre se você estiver desenvolvendo em seu computador local, usando o emulador do Azure Cosmos DB em um contêiner e não tiver importado o certificado SSL do contêiner. Para resolve isso, configure o cliente para desabilitar a validação de TLS/SSL:
Usar o emulador em um fluxo de trabalho de CI GitHub Actions
Para executar uma carga de trabalho de integração contínua que valide automaticamente a sua aplicação, utilize o emulador Azure Cosmos DB com um conjunto de testes da sua estrutura preferida. O emulador do Azure Cosmos DB é pré-instalado na variante windows-latest dos executores hospedados do GitHub Action.
Execute um conjunto de testes usando o driver de teste interno para .NET e uma estrutura de teste, como MSTest, NUnit ou XUnit.
Valide se o conjunto de testes de unidade para seu aplicativo funciona conforme o esperado.
dotnet test
Crie um novo fluxo de trabalho no repositório GitHub em um arquivo chamado .github/workflows/ci.yml.
Adicione um trabalho ao fluxo de trabalho para iniciar o emulador do Azure Cosmos DB usando o PowerShell e executar o conjunto de testes de unidade.
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
Observação
Inicie o emulador na linha de comando usando vários argumentos ou comandos do PowerShell. Para obter mais informações, consulte argumentos de linha de comando do emulador.
Teste o aplicativo Python e as operações de banco de dados usando pytest.
Valide se o conjunto de testes de unidade para seu aplicativo funciona conforme o esperado.
pip install -U pytest
pytest
Crie um novo fluxo de trabalho no repositório GitHub em um arquivo chamado .github/workflows/ci.yml.
Adicione um trabalho ao fluxo de trabalho para iniciar o emulador do Azure Cosmos DB usando o PowerShell e executar o conjunto de testes de unidade.
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
Observação
Inicie o emulador na linha de comando usando vários argumentos ou comandos do PowerShell. Para obter mais informações, consulte argumentos de linha de comando do emulador.
Use mocha para testar seu aplicativo Node.js e suas modificações de banco de dados.
Valide se o conjunto de testes de unidade para seu aplicativo funciona conforme o esperado.
npm install --global mocha
mocha
Crie um novo fluxo de trabalho no repositório GitHub em um arquivo chamado .github/workflows/ci.yml.
Adicione um trabalho ao fluxo de trabalho para iniciar o emulador do Azure Cosmos DB usando o PowerShell e executar o conjunto de testes de unidade.
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
Observação
Inicie o emulador na linha de comando usando vários argumentos ou comandos do PowerShell. Para obter mais informações, consulte argumentos de linha de comando do emulador.