在python中,如何使用function.json中的信息从azure无服务器功能写入cosmosdb?

时间:2019-06-24 03:16:50

标签: azure-functions azure-cosmosdb

我有一个由httprequest提供的azure函数,应该使用CoreSQL将给定的输入存储到一个cosmos集合中。代码从请求中获取数据,但是数据永远不会写入数据库。

根据我的阅读,我知道需要在function.json文件中定义从函数向外的连接。我的问题是我需要使用function.json中的值来建立数据库连接吗?

如果这样做,是否可以从azure.functions.Out对象获得它们?如果是这样,我如何在给定function.json的“ connection”字符串的情况下连接到数据库,该字符串似乎是数据库的“ PRIMARY CONNECTION STRING”。我应该只拆分连接字符串以获取我的网址和密钥吗?

或者,我可以使用函数的“应用程序设置”来传递值吗?如果是,它们是否在函数的环境中(os.getenv('xyz'))?

感谢任何指导,尤其是在Python中。

2 个答案:

答案 0 :(得分:1)

Consider the Following example函数从Azure Cosmos DB触发器获取文档数据,并通过使用Cosmos DB输出绑定将数据存储到Azure 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数据库帐户以及数据库和集合以进行测试

创建一个Cosmos数据库帐户

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

在创建的Cosmos DB中创建数据库和集合

# 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

答案 1 :(得分:0)

我找到了答案。在我的azure函数的定义中,这是我的function.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. 我与宇宙db的连接,其中

    • 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))

不需要其他数据库设置。它由azure处理,处理function.json文件。只需确保您function.json的ConnectionStringSetting指向保存您的连接字符串的属性即可。

更多花絮

  • 监视您的虚拟网络设置,以便运行并创建数据库。
  • 使用Microsoft的'func'软件包进行本地测试。
  • 邮递员是进行本地测试的好工具。