概要

このガイドでは、Azure Container Appsとマネージドサービスを使用して、事前に構築されたDockerイメージでCaseBenderをAzureにデプロイする方法を説明します。

前提条件

  1. Azureアカウント
  2. Azure CLIがインストールされていること
  3. Dockerがインストールされていること

ステップ1: 初期設定

Azure CLIのインストールと設定

# Homebrewを使用
brew install azure-cli

# Azureにログイン

az login

# ACR用のDockerの設定

az acr login --name casebenderacr

プロジェクトの初期化

# 変数の設定
RESOURCE_GROUP="casebender-rg"
LOCATION="eastus"

# リソースグループの作成
az group create --name $RESOURCE_GROUP --location $LOCATION

# 必要なサービスの有効化
az provider register --namespace Microsoft.ContainerRegistry
az provider register --namespace Microsoft.App
az provider register --namespace Microsoft.Storage

ステップ2: Azureインフラストラクチャの設定

ストレージアカウントの作成

# ストレージアカウントの作成
az storage account create \
  --name casebenderstorage \
  --resource-group $RESOURCE_GROUP \
  --location $LOCATION \
  --sku Standard_LRS \
  --encryption-services blob

# Blobコンテナの作成
az storage container create \
  --name casebender \
  --account-name casebenderstorage \
  --auth-mode key \
  --public-access off

# ストレージアカウントキーの取得
STORAGE_KEY=$(az storage account keys list \
  --account-name casebenderstorage \
  --resource-group $RESOURCE_GROUP \
  --query '[0].value' -o tsv)

# ストレージアクセス用のマネージドIDの作成
az identity create \
  --name casebender-storage-identity \
  --resource-group $RESOURCE_GROUP

# マネージドIDの取得
IDENTITY_ID=$(az identity show \
  --name casebender-storage-identity \
  --resource-group $RESOURCE_GROUP \
  --query id -o tsv)

# Storage Blob Data Contributorロールの割り当て
az role assignment create \
  --assignee-object-id $(az identity show --name casebender-storage-identity --resource-group $RESOURCE_GROUP --query principalId -o tsv) \
  --role "Storage Blob Data Contributor" \
  --scope $(az storage account show --name casebenderstorage --resource-group $RESOURCE_GROUP --query id -o tsv)

Azure Database for PostgreSQLのセットアップ

# PostgreSQLサーバーの作成
az postgres flexible-server create \
  --resource-group $RESOURCE_GROUP \
  --name casebender-db \
  --admin-user superadmin \
  --admin-password <your-secure-password> \
  --sku-name Standard_B2s \
  --storage-size 32 \
  --version 14

# データベースの作成
az postgres flexible-server db create \
  --resource-group $RESOURCE_GROUP \
  --server-name casebender-db \
  --database-name casebender

Azure Cache for Redisのセットアップ

# Redisキャッシュの作成
az redis create \
  --resource-group $RESOURCE_GROUP \
  --name casebender-redis \
  --sku Basic \
  --vm-size c0 \
  --location $LOCATION

ステップ3: コンテナレジストリの作成と設定

# Azure Container Registryの作成
az acr create \
  --resource-group $RESOURCE_GROUP \
  --name casebenderacr \
  --sku Standard \
  --admin-enabled true

# レジストリの認証情報の取得
ACR_USERNAME=$(az acr credential show --name casebenderacr --query username -o tsv)
ACR_PASSWORD=$(az acr credential show --name casebenderacr --query "passwords[0].value" -o tsv)

# CaseBenderイメージのプル
docker pull casebender/casebender:latest
docker pull casebender/workflow-processor:latest
docker pull casebender/misp-processor:latest

# ACR用のイメージのタグ付け
docker tag casebender/casebender:latest casebenderacr.azurecr.io/casebender/app:latest
docker tag casebender/workflow-processor:latest casebenderacr.azurecr.io/casebender/workflow-processor:latest
docker tag casebender/misp-processor:latest casebenderacr.azurecr.io/casebender/misp-processor:latest

# イメージをACRにプッシュ
docker push casebenderacr.azurecr.io/casebender/app:latest
docker push casebenderacr.azurecr.io/casebender/workflow-processor:latest
docker push casebenderacr.azurecr.io/casebender/misp-processor:latest

ステップ4: サービスのデプロイ

Container Apps環境の作成

# Container Apps環境の作成
az containerapp env create \
  --name casebender-env \
  --resource-group $RESOURCE_GROUP \
  --location $LOCATION

# メインアプリケーションの作成
az containerapp create \
  --name casebender-app \
  --resource-group $RESOURCE_GROUP \
  --environment casebender-env \
  --image casebenderacr.azurecr.io/casebender/app:latest \
  --target-port 3000 \
  --ingress external \
  --registry-server casebenderacr.azurecr.io \
  --registry-username $ACR_USERNAME \
  --registry-password $ACR_PASSWORD \
  --user-assigned-identity $IDENTITY_ID \
  --env-vars \
    AUTH_SECRET=<your-auth-secret> \
    AUTH_SALT=<your-auth-salt> \
    POSTGRES_PRISMA_URL="postgresql://superadmin:<password>@casebender-db.postgres.database.azure.com:5432/casebender" \
    REDIS_URL="redis://casebender-redis.redis.cache.windows.net:6380?ssl=true&password=<redis-key>" \
    AZURE_STORAGE_ACCOUNT="casebenderstorage" \
    AZURE_STORAGE_CONTAINER="casebender" \
    AZURE_STORAGE_CONNECTION_STRING="DefaultEndpointsProtocol=https;AccountName=casebenderstorage;AccountKey=${STORAGE_KEY};EndpointSuffix=core.windows.net"

# ワークフロープロセッサーの作成
az containerapp create \
  --name workflow-processor \
  --resource-group $RESOURCE_GROUP \
  --environment casebender-env \
  --image casebenderacr.azurecr.io/casebender/workflow-processor:latest \
  --registry-server casebenderacr.azurecr.io \
  --registry-username $ACR_USERNAME \
  --registry-password $ACR_PASSWORD \
  --min-replicas 1 \
  --max-replicas 1 \
  --env-vars \
    POSTGRES_PRISMA_URL="postgresql://superadmin:<password>@casebender-db.postgres.database.azure.com:5432/casebender" \
    REDIS_URL="redis://casebender-redis.redis.cache.windows.net:6380?ssl=true&password=<redis-key>"

# MISPプロセッサーの作成
az containerapp create \
  --name misp-processor \
  --resource-group $RESOURCE_GROUP \
  --environment casebender-env \
  --image casebenderacr.azurecr.io/casebender/misp-processor:latest \
  --registry-server casebenderacr.azurecr.io \
  --registry-username $ACR_USERNAME \
  --registry-password $ACR_PASSWORD \
  --min-replicas 1 \
  --max-replicas 1 \
  --env-vars \
    POSTGRES_PRISMA_URL="postgresql://superadmin:<password>@casebender-db.postgres.database.azure.com:5432/casebender" \
    REDIS_URL="redis://casebender-redis.redis.cache.windows.net:6380?ssl=true&password=<redis-key>"

ステップ5: Azure Front Doorの設定

# Front Doorプロファイルの作成
az afd profile create \
  --profile-name casebender-afd \
  --resource-group $RESOURCE_GROUP \
  --sku Standard_AzureFrontDoor

# エンドポイントの作成
az afd endpoint create \
  --endpoint-name casebender \
  --profile-name casebender-afd \
  --resource-group $RESOURCE_GROUP

# オリジングループの作成
az afd origin-group create \
  --origin-group-name casebender-origin-group \
  --profile-name casebender-afd \
  --resource-group $RESOURCE_GROUP \
  --probe-path "/" \
  --probe-protocol Http \
  --probe-request-type GET

# オリジンの追加
az afd origin create \
  --origin-group-name casebender-origin-group \
  --origin-name casebender-origin \
  --profile-name casebender-afd \
  --resource-group $RESOURCE_GROUP \
  --host-name <your-container-app-url> \
  --origin-host-header <your-container-app-url> \
  --priority 1 \
  --weight 1000 \
  --enabled-state Enabled

ステップ6: カスタムドメインの設定(オプション)

# Front Doorにカスタムドメインを追加
az afd custom-domain create \
  --custom-domain-name casebender-domain \
  --host-name your-domain.com \
  --profile-name casebender-afd \
  --resource-group $RESOURCE_GROUP \
  --minimum-tls-version TLS12

# HTTPSの有効化
az afd custom-domain enable-https \
  --custom-domain-name casebender-domain \
  --profile-name casebender-afd \
  --resource-group $RESOURCE_GROUP

モニタリングとメンテナンス

Application Insightsの設定

# Application Insightsの作成
az monitor app-insights component create \
  --app casebender-insights \
  --location $LOCATION \
  --resource-group $RESOURCE_GROUP \
  --application-type web

# インストルメンテーションキーの取得
az monitor app-insights component show \
  --app casebender-insights \
  --resource-group $RESOURCE_GROUP \
  --query instrumentationKey \
  --output tsv

アラートの設定

# アクショングループの作成
az monitor action-group create \
  --name casebender-alerts \
  --resource-group $RESOURCE_GROUP \
  --action email admin email@yourdomain.com

# アラートルールの作成
az monitor metrics alert create \
  --name "high-cpu-usage" \
  --resource-group $RESOURCE_GROUP \
  --scopes <container-app-resource-id> \
  --condition "avg CPU > 80" \
  --window-size 5m \
  --evaluation-frequency 1m \
  --action <action-group-id>

ログの表示

# コンテナアプリのログの表示
az containerapp logs show \
  --name casebender-app \
  --resource-group $RESOURCE_GROUP \
  --follow

スケーリング設定

# スケーリングルールの設定
az containerapp update \
  --name casebender-app \
  --resource-group $RESOURCE_GROUP \
  --min-replicas 1 \
  --max-replicas 10 \
  --scale-rule-name http-rule \
  --scale-rule-type http \
  --scale-rule-http-concurrency 50

バックアップと災害復旧

データベースバックアップの設定

# 自動バックアップの有効化
az postgres flexible-server update \
  --resource-group $RESOURCE_GROUP \
  --name casebender-db \
  --backup-retention 7

地理レプリケーションの設定

# セカンダリリージョンリソースの作成
az postgres flexible-server replica create \
  --name casebender-db-secondary \
  --source-server casebender-db \
  --resource-group $RESOURCE_GROUP \
  --location westus

セキュリティのベストプラクティス

  1. すべてのサービスでAzure Defenderを有効化
  2. Azure Private Linkの実装
  3. マネージドIDの使用
  4. 定期的なセキュリティ評価
  5. 診断ログの有効化

コスト最適化

  1. Container Appsの消費プランを使用
  2. 自動スケーリングルールの実装
  3. 適切なサービスティアの選択
  4. 使用パターンのモニタリング
  5. Azure Reserved Instancesの使用

次のステップ

  • Azure DevOpsでCI/CDを設定
  • 包括的なモニタリングの実装
  • 災害復旧の設定
  • セキュリティコンプライアンスの確認