To setup Azure CosmosDb state store create a component of type state.azure.cosmosdb
. See this guide on how to create and apply a state store configuration.
apiVersion: dapr.io/v1alpha1
kind: Component
metadata:
name: <NAME>
namespace: <NAMESPACE>
spec:
type: state.azure.cosmosdb
version: v1
metadata:
- name: url
value: <REPLACE-WITH-URL>
- name: masterKey
value: <REPLACE-WITH-MASTER-KEY>
- name: database
value: <REPLACE-WITH-DATABASE>
- name: collection
value: <REPLACE-WITH-COLLECTION>
If you wish to use CosmosDb as an actor store, append the following to the yaml.
- name: actorStateStore
value: "true"
Field | Required | Details | Example |
---|---|---|---|
url | Y | The CosmosDB url | "https://******.documents.azure.com:443/" . |
masterKey | Y | The key to authenticate to the CosmosDB account | "key" |
database | Y | The name of the database | "db" |
collection | Y | The name of the collection | "collection" |
actorStateStore | N | Consider this state store for actors. Defaults to "false" | "true" , "false" |
Follow the instructions from the Azure documentation on how to create an Azure CosmosDB account. The database and collection must be created in CosmosDB before Dapr can use it.
Note : The partition key for the collection must be named “/partitionKey”. Note: this is case-sensitive.
In order to setup CosmosDB as a state store, you need the following properties:
To use the CosmosDB state store, your data must be sent to Dapr in JSON-serialized. Having it just JSON serializable will not work.
If you are using the Dapr SDKs (e.g. https://github.com/dapr/dotnet-sdk) the SDK will serialize your data to json.
For examples see the curl operations in the Partition keys section.
For non-actor state operations, the Azure Cosmos DB state store will use the key
property provided in the requests to the Dapr API to determine the Cosmos DB partition key. This can be overridden by specifying a metadata field in the request with a key of partitionKey
and a value of the desired partition.
The following operation will use nihilus
as the partition key value sent to CosmosDB:
curl -X POST http://localhost:3500/v1.0/state/<store_name> \
-H "Content-Type: application/json"
-d '[
{
"key": "nihilus",
"value": "darth"
}
]'
For non-actor state operations, if you want to control the CosmosDB partition, you can specify it in metadata. Reusing the example above, here’s how to put it under the mypartition
partition
curl -X POST http://localhost:3500/v1.0/state/<store_name> \
-H "Content-Type: application/json"
-d '[
{
"key": "nihilus",
"value": "darth",
"metadata": {
"partitionKey": "mypartition"
}
}
]'
For actor state operations, the partition key is generated by Dapr using the appId
, the actor type, and the actor id, such that data for the same actor always ends up under the same partition (you do not need to specify it). This is because actor state operations must use transactions, and in CosmosDB the items in a transaction must be on the same partition.