📘

【Dapr/CosmosDB】- state Managementを実装する

2024/11/18に公開

執筆日

2024/11/18

やること

Daprには、State Managementという概念があり、アプリケーションが状態(state)を保存、取得、更新、削除するための統一されたAPIを提供している。
それを実装してみようかなと。

流れ

  1. Dapr CLIのインストール/CosmosDBを構築
  2. アプリケーションを作成

Dapr CLIのインストール

Dapr CLI のインストール:
公式ドキュメントを参考にインストールしてください。
CosmoDB
公式ドキュメントを参考にCosmosDB/データベースを構築してください。

アプリケーション

dapr/
├── app.py
├── requirements.txt
├── components
└─── state.yaml
app.py

from flask import Flask, request, jsonify
import requests

app = Flask(__name__)

DAPR_HTTP_PORT = 3500
STATE_STORE_NAME = "statestore"
DAPR_STATE_URL = f"http://localhost:{DAPR_HTTP_PORT}/v1.0/state/{STATE_STORE_NAME}"


@app.route("/save", methods=["POST"])
def save_state():
    try:
        # リクエストからJSONデータを取得
        data = request.get_json()

        # ステートストアに保存するデータを構築
        state = [{"key": data["key"], "value": data["value"]}]

        # DaprのステートストアAPIにPOSTリクエストを送信
        response = requests.post(DAPR_STATE_URL, json=state)

        # ステータスコードがエラーであれば例外を発生させる
        response.raise_for_status()

        # 成功した場合のレスポンス
        return jsonify(
            {"status": "success", "key": data["key"], "value": data["value"]}
        )

    except Exception as err:
        # その他の例外のログとレスポンス
        print(f"Other error occurred: {err}")
        return jsonify({"status": "error", "message": str(err)}), 500


if __name__ == "__main__":
    app.run(host="0.0.0.0", port=5000)

requirements.txt

Flask
requests

components/state.yaml

apiVersion: dapr.io/v1alpha1  
kind: Component  
metadata:  
  name: statestore  
  namespace: default  
spec:  
  type: state.azure.cosmosdb  
  version: v1  
  metadata:  
  - name: url  
    value: <CosmosDBのURL>  
  - name: masterkey  
    value: <プライマリーキー> 
  - name: database  
    value: <データベース名>  
  - name: collection  
    value: <コンテナー名>
  - name: partitionkey  
    value: <パーテンションキー>

動作確認

  1. 以下のコマンドを実行し、ライブラリーをインストールする
pip install -r requirements.txt
  1. 以下のコマンドを実行し、Daprを立ち上げる
dapr init 
dapr run --app-id stateapp --app-port 5000 --dapr-http-port 3500 --components-path ./components python app.py
  1. 別のターミナルで以下を実行する
curl -X POST http://localhost:5000/save -H "Content-Type: application/json" -d "{\"key\": \"myKey\", \"value\": \"myValue\"}"


4. CosmosDBを確認し、stateがoutputされていることを確認する

ヘッドウォータース

Discussion