📘
【Dapr/CosmosDB】- state Managementを実装する
執筆日
2024/11/18
やること
Daprには、State Managementという概念があり、アプリケーションが状態(state)を保存、取得、更新、削除するための統一されたAPIを提供している。
それを実装してみようかなと。
流れ
- Dapr CLIのインストール/CosmosDBを構築
- アプリケーションを作成
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: <パーテンションキー>
動作確認
- 以下のコマンドを実行し、ライブラリーをインストールする
pip install -r requirements.txt
- 以下のコマンドを実行し、Daprを立ち上げる
dapr init
dapr run --app-id stateapp --app-port 5000 --dapr-http-port 3500 --components-path ./components python app.py
- 別のターミナルで以下を実行する
curl -X POST http://localhost:5000/save -H "Content-Type: application/json" -d "{\"key\": \"myKey\", \"value\": \"myValue\"}"
4. CosmosDBを確認し、stateがoutputされていることを確認する
Discussion