💭

【Azure Kubernetes Service/Dapr/Blobstorage】Bindingsを実装する②(AKSへデプロイ)

2024/11/12に公開

執筆日

2024/11/12

やること

以下の続き。AKSにデプロイしてみる。
https://zenn.dev/headwaters/articles/543e4c738224b2

手順

  1. 必要なリソース/コマンドをデプロイする
  2. AKSにDaprのアプリをデプロイする
  3. 動作確認

必要なリソース/コマンドをデプロイする

  1. 以下を参考にACRをデプロイする

https://learn.microsoft.com/ja-jp/azure/container-registry/container-registry-get-started-portal?tabs=azure-cli

  1. 以下を参考にAKSをデプロイする

https://zenn.dev/headwaters/articles/291de495b51049

※1で作成したACRとのアタッチを忘れずに
https://zenn.dev/headwaters/articles/dfc49e5ed0a47e

  1. Azure CLI と kubectl をインストールする

AKSにDaprのアプリをデプロイする

  1. 以下のファイル構成でアプリケーションを作成する
    dapr/
    ├── app.py
    ├── requirements.txt
    ├── Dockerfile
    └── deployment.yaml
    └── components
    └─── my-blob-storage.yaml

app.py

from flask import Flask, jsonify
import requests
import json
from datetime import datetime

app = Flask(__name__)

@app.route("/save-time", methods=["POST"])
def save_time():
    try:
        current_time = datetime.utcnow().isoformat() + "Z"
        data = {"time": current_time}
        url = "http://localhost:3500/v1.0/bindings/my-blob-storage"
        payload = {
            "data": data,
            "metadata": {
                "blobName": f'time_{datetime.utcnow().strftime("%Y%m%d%H%M%S")}.json'
            },
            "operation": "create",
        }
        headers = {"Content-Type": "application/json"}
        response = requests.post(url, data=json.dumps(payload), headers=headers)
        if response.status_code == 200:
            return jsonify({"message": "Time saved successfully"}), 200
        else:
            app.logger.error(f"Failed to save time: {response.text}")
            return jsonify({"message": "Failed to save time"}), 500
    except Exception as e:
        app.logger.error(f"Exception occurred: {str(e)}")
        return jsonify({"message": "Internal server error"}), 500

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

requirements.txt

Flask
requests

Dockerfile

FROM python:3.9-slim

WORKDIR /app

COPY . .

RUN pip install -r requirements.txt

CMD [ "python","app.py" ]

deployment.yaml

apiVersion: apps/v1  
kind: Deployment  
metadata:  
  name: flaskapp  
spec:  
  replicas: 1  
  selector:  
    matchLabels:  
      app: flaskapp  
  template:  
    metadata:  
      labels:  
        app: flaskapp  
      annotations:  
        dapr.io/enabled: "true"  
        dapr.io/app-id: "flaskapp"  
        dapr.io/app-port: "5000"  
    spec:  
      containers:  
      - name: flaskapp  
        image: <ACRのリソース名>.azurecr.io/flaskapp:latest  
        ports:  
        - containerPort: 5000  
---  
apiVersion: v1  
kind: Service  
metadata:  
  name: flaskapp  
spec:  
  ports:  
  - port: 80  
    targetPort: 5000  
  selector:  
    app: flaskapp  
  type: LoadBalancer

components/my-blob-storage.yaml

apiVersion: dapr.io/v1alpha1
kind: Component
metadata:
  name: my-blob-storage
  namespace: default
spec:
  type: bindings.azure.blobstorage
  version: v1
  metadata:
  - name: storageAccount
    value: <Storage Account名>
  - name: storageAccessKey
    value: <Storage Account Key>
  - name: container
    value: <コンテナ名>
  1. ACRにPushする
az login -t "<テナント名>"
az acr login --name "<ACRのリソース名>"
docker build -t <ACRのリソース名>.azurecr.io/flaskapp:latest .
docker push <ACRのリソース名>.azurecr.io/flaskapp:latest  
  1. AKSにdaprをデプロイする
az aks get-credentials --resource-group <リソースグループ名> --name <AKSのリソース名>
dapr init -k
kubectl apply -f components/my-blob-storage.yaml  
kubectl apply -f deployment.yaml  

動作確認

  1. 以下のコマンドを実行し、外部IPを取得する
kubectl get services
  1. 以下のコマンドを実行して動作確認する
curl -X POST http://<外部IP>:80/save-time
  1. Blobを確認し、ログファイルが作成されたことを確認する

まとめ

DaprのBindingを使ったアプリをAKSにデプロイしました。
次は、InputのBindingsを実装しようかなとー。

ヘッドウォータース

Discussion