В Python, как писать в cosmosdb из лазурной функции без сервера, используя информацию в function.json? - PullRequest
0 голосов
/ 24 июня 2019

У меня есть функция Azure, которая подается httprequest и должна сохранять заданный вход в коллекцию космоса, используя CoreSQL. Код получает данные из запроса, но данные никогда не записываются в БД.

Из моего чтения я знаю, что внешнее соединение от функции должно быть определено в файле function.json. Мой вопрос, нужно ли мне использовать значения из function.json, чтобы установить соединение с БД?

Если я это сделаю, получу ли я их из объекта azure.functions.Out? Если да, то как мне подключиться к базе данных, используя строку «connection» для function.json, которая выглядит как «PRIMARY CONNECTION STRING» базы данных. Должен ли я просто разделить строку подключения, чтобы получить мой URL и ключ?

В качестве альтернативы, могу ли я использовать функцию «Настройки приложения» функции для передачи значений, и если да, находятся ли они в среде моей функции (os.getenv ('xyz')))?

Спасибо за любое руководство, особенно если оно написано на Python.

Ответы [ 2 ]

1 голос
/ 24 июня 2019

Рассмотрим следующий пример : Функция получает данные документа из триггера Azure Cosmos DB и сохраняет данные в Azure Cosmos DB с помощью выходной привязки Cosmos DB

functions.json

{
  "scriptFile": "__init__.py",
  "bindings": [
    {
      "type": "cosmosDBTrigger",
      "name": "docs",
      "direction": "in",
      "leaseCollectionName": "leases",
      "connectionStringSetting": "MyCosmosDBConnectionString",
      "databaseName": "testdb",
      "collectionName": "testcol01",
      "createLeaseCollectionIfNotExists": true
    },
    {
      "direction": "out",
      "type": "cosmosDB",
      "name": "outdoc",
      "databaseName": "testdb",
      "collectionName": "testcol02",
      "leaseCollectionName": "leases",
      "createLeaseCollectionIfNotExists": true,
      "connectionStringSetting": "MyCosmosDBConnectionString",
      "createIfNotExists": true
    }
  ]
}

Создание учетной записи Cosmos DB и DB & Collection для тестирования

Создание учетной записи Cosmos DB

COSMOSDB_ACCOUNT_NAME="azfuncv2db"
RESOURCE_GROUP="RG-azfuncv2"
az cosmosdb create \
    --name $COSMOSDB_ACCOUNT_NAME \
    --kind GlobalDocumentDB \
    --resource-group $RESOURCE_GROUP

Создание базы данных и коллекции в созданной вами базе данных Cosmos

# Get Key
COSMOSDB_KEY=$(az cosmosdb list-keys --name $COSMOSDB_ACCOUNT_NAME --resource-group $RESOURCE_GROUP --output tsv |awk '{print $1}')

# Create Database
az cosmosdb database create \
    --name $COSMOSDB_ACCOUNT_NAME \
    --db-name $DATABASE_NAME \
    --key $COSMOSDB_KEY \
    --resource-group $RESOURCE_GROUP

# Create a container with a partition key and provision 400 RU/s throughput.
COLLECTION_NAME="testcol01"
az cosmosdb collection create \
    --resource-group $RESOURCE_GROUP \
    --collection-name $COLLECTION_NAME \
    --name $COSMOSDB_ACCOUNT_NAME \
    --db-name $DATABASE_NAME \
    --partition-key-path /name \
    --throughput 400

COLLECTION_NAME="testcol02"
az cosmosdb collection create \
    --resource-group $RESOURCE_GROUP \
    --collection-name $COLLECTION_NAME \
    --name $COSMOSDB_ACCOUNT_NAME \
    --db-name $DATABASE_NAME \
    --partition-key-path /name \
    --throughput 400

# Create a container for leaves
# 'leaves' need to be a single collection partition
# Please see also: https://github.com/Azure/azure-functions-core-tools/issues/930
LEASES_COLLECTION_NAME="leases"
az cosmosdb collection create \
    --resource-group $RESOURCE_GROUP \
    --collection-name $LEASES_COLLECTION_NAME \
    --name $COSMOSDB_ACCOUNT_NAME \
    --db-name $DATABASE_NAME \
    --throughput 400

Опубликовать функцию в облаке

FUNCTION_APP_NAME="MyFunctionApp"
func azure functionapp publish $FUNCTION_APP_NAME --build-native-deps --no-bundler

Добавить функции Настройки приложения

COSMOS_DB_CONNECTION="***************"
az webapp config appsettings set \
  -n $FUNCTION_APP_NAME \
  -g $RESOURCE_GROUP \
  --settings \
    MyCosmosDBConnectionString=$COSMOS_DB_CONNECTION
0 голосов
/ 26 июня 2019

Я нашел ответ.В определении моей лазурной функции это моя функция. Json

{
  "scriptFile": "__init__.py",
  "bindings": [
    {
      "authLevel": "anonymous",
      "type": "httpTrigger",
      "direction": "in",
      "name": "req",
      "methods": [
        "get",
        "post"
      ]
    },
    {
      "name": "cosmos",
      "type": "cosmosDB",
      "direction": "out",
      "ConnectionStringSetting": "CosmosDBConnection",
      "databaseName": "messages",
      "collectionName": "messages_1",
      "createIfNotExists": true
    },
    {
      "type": "http",
      "direction": "out",
      "name": "$return",
      "dataType": "string" 
    }
  ]
}

Он описывает три привязки,

  1. Первый - это http-триггер ввода
  2. Моя связь с космосом дБ, где

    • cosmos - это имя.
    • направление out
    • ConnectionStringSettings указывает наCosmosDBConnection, который определяется как функция Connection-> Настройки приложения.Параметр Application содержит строку первичного подключения CosmosDB AccountEndpoint=https://....
    • database - базу данных, в которую он будет записывать
    • collectionName - имя коллекции в базе данных
  3. Выходной коннектор http, используемый для возврата ответов http.

В моем коде Python я использую out в качестве параметра, передаваемого ви напишите в него.

import azure.functions as func
from  azure.cosmos import cosmos_client


def main(req: func.HttpRequest, cosmos: func.Out[func.Document]) -> func.HttpResponse:
    logging.info('Python HTTP trigger function processed a request.')

    # your magic

    # create a dictionary, foo_bar in this case
    # On the parameter passed in, named cosmos, use the set() operator
    # in insert a Document, built from the dictionary

    cosmos.set(func.Document.from_dict(foo_bar))

Никаких других настроек базы данных не требуется.Он обрабатывается лазурью, обрабатывая файл function.json.Просто убедитесь, что ваш Connection.ringSetting в вашем function.json указывает на атрибут, содержащий вашу строку подключения.

Еще несколько лакомых кусочков

  • наблюдайте за настройками вашей виртуальной сети, поэтому работайте и создайте базу данных.
  • используйте пакет Microsoft 'func' для локального тестирования.
  • Почтальон - отличный инструмент для локального тестирования.
...