LoginSignup
2
1

More than 3 years have passed since last update.

CosmosDB アップデート振り返り&ARMテンプレートの機能を少し試す

Posted at

はじめに

de:code 2019行ってきました。1日目の混雑具合にはちょっとげんなり。

Azure Kinect DK欲しい。日本発売まだですか?!
Cosmos DBのアップデートにようやく追いつけた気がします

最近のCosmosDB アップデート(ざっくり、気になるところだけ)

2018/12/4

2019/5/15

その他CosmosDBの更新情報

Azure Function CosmosDB Binding関連

GitHub Azure/azure-webjobs-sdk-extensions Adding support for Partitioned Lease collections and monitoring #520(2019/1ごろ)

いままでLeaseコレクションにUnlimited(partitioned)コレクションが指定できなかった
#自動で作成する場合 Fixedコレクションの400RUが指定されてた
#手動で作成する場合、トリガの開始時にエラーが起きてた
パーティションキー="/id"なUnlimited(partitioned)コレクションを指定できるように。

つまり、
いままで、CosmosDBTriggerなFunctionを使おうとした場合、
読み取り元のコレクション(最小400RU/s)+リースコレクション(最小400RU/s)で
800RU/s(5000円強/月)だったのが、Databaseに400RU/s割り当てだけで始められるようになった!

nuget Microsoft.Azure.WebJobs.Extensions.CosmosDB 3.0.3

GitHub Azure/azure-webjobs-sdk-extensions Enabling Multi Master for leases in Cosmos DB Trigger #566(そろそろ?)

⇒3.0.4
マルチマスターのChangeFeedってどういう動きなんでしたっけ(…?)

Build(と5/15のアナウンスで)発表された、ARMテンプレートの強化を試す

既存の公開情報

GitHub Azure/azure-rest-api-specs(CosmosDB)
GitHub Azure/azure-resource-manager-schemas(CosmosDB)
Docs Microsoft.DocumentDB resource types

ARMテンプレートを試す

CosmosDBTriggerなFunctionが400RU/sだけで動かせるよう、
CosmosDBアカウント,データベースレベルのスループット割り当て(400RU/s),コレクション2個を作ります。
東日本のリソースグループにデプロイ、西日本はRead専用にします。

CosmosDB-Template.json
{
    "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
    "contentVersion": "1.0.0.0",
    "parameters": {},
    "variables": {
        "cosmos": {
            "accountName": "cosmos-sql-201905-3",
            "locations": [
                "[resourceGroup().location]",
                "japanwest"
            ],
            "database": {
                "name": "database",
                "throughput": 400
            },
            "containers": [
                {
                    "Name": "container",
                    "PartitionKey": "/pk"
                },
                {
                    "Name": "leases",
                    "PartitionKey": "/id"
                }
            ]
        }
    },
    "resources": [
        {
            "type": "Microsoft.DocumentDB/databaseAccounts",
            "apiVersion": "2016-03-31",
            "name": "[variables('cosmos').accountName]",
            "location": "[variables('cosmos').locations[0]]",
            "kind": "GlobalDocumentDB",
            "properties": {
                "consistencyPolicy": {
                    "defaultConsistencyLevel": "Session"
                },
                "copy": [
                    {
                        "name": "locations",
                        "count": "[length(variables('cosmos').locations)]",
                        "input": {
                            "failoverPriority": "[copyIndex('locations')]",
                            "locationName": "[variables('cosmos').locations[copyIndex('locations')]]"
                        }
                    }
                ],
                "databaseAccountOfferType": "Standard",
                "enableAutomaticFailover": false,
                "enableMultipleWriteLocations": false
            }
        },
        {
            "type": "Microsoft.DocumentDB/databaseAccounts/apis/databases",
            "apiVersion": "2016-03-31",
            "name": "[concat(variables('cosmos').accountName,'/sql/',variables('cosmos').database.name)]",
            "dependsOn": [
                "[resourceId('Microsoft.DocumentDB/databaseAccounts/', variables('cosmos').accountName)]"
            ],
            "properties": {
                "resource": {
                    "id": "[variables('cosmos').database.name]"
                },
                "options": {
                    "throughput": "[variables('cosmos').database.throughput]"
                }
            }
        },
        {
            "type": "Microsoft.DocumentDb/databaseAccounts/apis/databases/containers",
            "apiVersion": "2016-03-31",
            "name": "[concat(variables('cosmos').accountName,'/sql/',variables('cosmos').database.name,'/',variables('cosmos').containers[copyIndex()].name)]",
            "dependsOn": [
                "[resourceId('Microsoft.DocumentDB/databaseAccounts/apis/databases', variables('cosmos').accountName, 'sql', variables('cosmos').database.name)]"
            ],
            "properties": {
                "resource": {
                    "id": "[variables('cosmos').containers[copyIndex()].name]",
                    "partitionKey": {
                        "paths": [
                            "[variables('cosmos').containers[copyIndex()].partitionKey]"
                        ],
                        "kind": "Hash"
                    },
                    "indexingPolicy": {
                        "indexingMode": "consistent",
                        "includedPaths": [
                            {
                                "path": "/*",
                                "indexes": [
                                    {
                                        "kind": "Range",
                                        "dataType": "Number",
                                        "precision": -1
                                    },
                                    {
                                        "kind": "Range",
                                        "dataType": "String",
                                        "precision": -1
                                    },
                                    {
                                        "kind": "Spatial",
                                        "dataType": "Point"
                                    }
                                ]
                            }
                        ],
                        "excludedPaths": [
                            {
                                "path": "/\"_etag\"/?"
                            }
                        ]
                    }
                }
            },
            "copy": {
                "name": "containers-loop",
                "count": "[length(variables('cosmos').containers)]"
            }
        }
    ]
}

image.png

image.png

いままで、ARMテンプレートデプロイ⇒コレクション作成⇒FunctioAppPublishだったのが、
ARMテンプレートデプロイ⇒FunctionAppPublishとシンプルになりました。

Tips

  • Microsoft.DocumentDB/databaseAccountsのproperties.locations.locationName

ARM REST APIなどではJapan EastとかDisplayNameですが、japaneast等のLocationNameで指定してもうごくっぽい。
ドキュメント外な動作だと思うので、だめになったらダサいけど↓みたいなvariables追加して置き換えるとよいと思う。

variables
    "locationNames": {
      "eastasia": "East Asia",
      "southeastasia": "Southeast Asia",
      "centralus": "Central US",
      "eastus": "East US",
      "eastus2": "East US 2",
      "westus": "West US",
      "northcentralus": "North Central US",
      "southcentralus": "South Central US",
...
    }

おわりに

あとはStorage QueueがARMテンプレートからできれば、だいたい自分のよく使うリソースほぼテンプレート化できそうなんですが。

参考

Creating Cosmos DB Resources using ARM Templates
ARM template support for Cosmos DB databases and collections – Henry Been

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1