作業時間を70%短縮!BicepによるAzure Static Web Apps自動構築

【基礎から学ぶ Azure Static Web Apps × Bicep 入門 #2】Infrastructure as Code 実践!Bicep テンプレートでローカル開発環境構築とSWA CLI デプロイ

ご挨拶

ども!新しいことを学ぶのにAIを使うようになって勉強がはかどっている龍ちゃんです。検証したことはジャンジャンブログ化していきます。旅館にこもって執筆だけをしている時間がそのうち来るかもしれません。ネット回線がないと作業できないのが難点なんですよね。

基礎から学ぶAzure Static Web Apps × Bicep 入門

「Azure Static Web Apps を Bicep(Infrastructure as Code)で管理し、GitHub Actions を使った自動デプロイパイプラインを構築する」というテーマで3部構成の「ローカル開発でのBicep + SWA CLIデプロイ実践編」になります。各回のコンテンツの内容としては以下になります。

シリーズのまとめ記事はこちらになります。

  • Azure Static Web Apps + Bicep環境構築編
  • ローカル開発でのBicep + SWA CLIデプロイ実践編 ← 今回はここ
  • Bicep+GitHub Actions連携デプロイ編

この回での目標は以下となります。

  • ローカル開発用のBicepテンプレート作成
  • SWA CLIを使った手動デプロイの実行
  • 開発サイクルでの迅速なデプロイフローの確立

それでは、ローカルからのBicepとSWAへのデプロイを始めましょう。

前回の振り返り

前回は「基礎から学ぶ Azure Static Web Apps × Bicep 入門 #1」として、DevContainerを使った統一開発環境の構築を行いました。

DevContainerによる統一開発環境の構築では、Azure CLI、GitHub CLI、SWA CLIの3つのツールを使える状態にして、チーム全体で同じ開発環境を共有できるようにしました。特に、Azure CLIの認証情報をマウントすることで、コンテナを再起動するたびに認証し直す手間を省けるようになりました。

環境構築完了後は実際にAzure CLIとSWA CLIを使って、Static Web Appsの作成からデプロイ、削除まで一通りコマンドラインで体験しました。デプロイトークンの取得とSWA CLIを使ったデプロイは、Infrastructure as Codeでの管理においても重要な操作となります。

今回の記事は前回作成した環境をもとに進めていきます。もし環境が手元にない方は下の記事を先に購読ください。

詳細については、前回の記事をご参照ください。

ローカルからBicepとSWA CLIを使ったデプロイ

Bicep × SWA CLIで環境を作成するシナリオ

まずは、シナリオの整理から始めようと思います。Bicepではターゲットスコープを指定することができ、実行時に影響を及ぼす範囲を限定することができます。

  • resourceGroup: 既存のリソースグループに対するアクション
  • subscription: サブスクリプション全体での管理
  • managementGroup: 複数サブスクリプションをまとめて管理
  • tenant: テナント全体への最上位レベル操作

resourceGroup → subscription → managementGroup → tenantという具合に上位の権限が必要になります。一般的な開発者権限の場合は、resouceGroupスコープしか扱うことができないかと思います。

以上を踏まえて、今回のシナリオとしては「resouceGroupスコープで実行し、ローカルから既存のリソースグループに対して、Bicepを使用してStatic Web Appsを管理」で解説を進めていきます。

ディレクトリ構成

今回、検証に使用するプロジェクトのディレクトリ構成になります。

.
├── .devcontainer/
│   └── devcontainer.json           
├── infra/                          
│   ├── bicep/                      
│   │   ├── main.local.Bicep        # ローカル開発用Bicep ⭐
│   │   └── parameters.local.json   # ローカル開発用パラメータ ⭐
│   └── scripts/                    
│       └── deploy.local.sh         # ローカル開発用デプロイスクリプト ⭐
├── out/                            
│   └── index.html                  
├── .env.local                      # スクリプト用環境変数
├── .gitignore                      # 機密情報を守る砦
├── swa-cli.config.json             
└── README.md                       # コマンドをメモするのに使ってね!

Bicepに関係するファイルとしては、以下の二つとなります。

  • parameters.lcoal.json:ローカル開発用パラメータファイル
  • main.local.bicep:ローカル開発用Bicepテンプレート

パラメータファイルで値を管理する infra > bicep > parameters.local.json

こちらは、Bicepテンプレートへ値を渡すパラメーターファイルとなります。

{
  "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentParameters.json#",
  "contentVersion": "1.0.0.0",
  "parameters": {
    "projectName": {
      "value": "Bicep-local-test"
    },
    "environment": {
      "value": "dev"
    },
    "location": {
      "value": "East Asia"
    }
  }
}

設定項目を切り出しておくことで、パラメーターファイルを作成するだけで別の環境を作成することができます。また、リソース管理の観点からも変更差分が追跡しやすくなるため、使用する値はパラメーターファイルとして管理することが必須となります。特に機密情報(パスワードやAPI キーなど)をBicepテンプレート本体から分離できるセキュリティ面でのメリットも大きく、GitHubなどへの誤った機密情報のコミットを防止できます。

Bicepテンプレート infra > Bicep > main.local.bicep

Bicepのテンプレートは、以下の3つのパーツで構成されています。

  • パラメータ受け取り部分
  • Static Web Apps定義部分
  • 出力用設定
@description('プロジェクト名(リソース名のプレフィックスとして使用)')
param projectName string = "Bicep-local-deploy-swa"

@description('デプロイ環境 (dev, staging, prod)')
param environment string = 'dev'

@description('デプロイ先のリージョン')
param location string = resourceGroup().location

// ローカル開発用: シンプルなStatic Web Apps作成
// GitHubリポジトリとの連携は行わず、手動デプロイ専用
resource staticWebApp 'Microsoft.Web/staticSites@2024-11-01' = {
  name: '${projectName}-swa-${environment}-local'
  location: location
  sku: {
    name: 'Free'
    tier: 'Free'
  }
  properties: {
    // ローカル開発用: 最小構成
    buildProperties: {
      appLocation: '/out'
      apiLocation: ''
      outputLocation: ''
    }
  }
  tags: {
    Environment: environment
    Purpose: 'LocalDevelopment'
    CreatedBy: 'Local-Bicep'
  }
}

// 出力値: ローカル開発で必要な情報のみ
output staticWebAppName string = staticWebApp.name
output staticWebAppUrl string = 'https://${staticWebApp.properties.defaultHostname}'
output staticWebAppId string = staticWebApp.id
output managementUrl string = 'https://portal.azure.com/#@/resource${staticWebApp.id}'

パラメーター受け取り部分は、先ほど設定したパラメータの受け取りと初期値の設定を行います。

Static Web Apps定義部分は、SWAの構築に必要な情報が記載されています。必須のパラメータとしては、以下になります。(az コマンドより設定項目が増えている)

  • name:SWAの名前(Azure内でユニークな名前の必要あり)
  • location:デプロイリージョン(SWAの場合East US 2, West Europe, Central US, East Asia, West US 2
  • sku:価格プラン name-tierは一致させる

その他の設定項目としては、公式のドキュメントにまとまっています。今回はproperties > buildPropertiestagsを設定しています。

buildPropertiesは名前の通りですが、今回であればswa-cli.config.jsonと一致した値になる想定です。将来的にNode.jsで構築した静的サイトや組み込みバックエンドなどを構築する際に重要になるので、設定しています。

tags はAzure Protalやazコマンドでの検索を容易にしてくれます。設定しなくてもよいですが、検証中は助かる設定項目になります。将来的に複数のSWAを運用する際に、設定することで管理が容易になります。

コマンドを使ってデプロイ~削除

それでは、実際にBicepテンプレートを使用してリソースの作成とSWA CLIを活用したデプロイを行い、最終的にリソースを削除していきます。

再度シナリオの確認です。今回のシナリオは「resouceGroupスコープで実行し、既存のリソースグループに対して、Bicepを使用してStatic Web Appsを管理」です。作成するリソースとしては、以下のような命名とロケーションに設定します。

設定項目
リソースグループbicep-test-group
SWA名bicep-local-deploy-swa
ロケーションeastasia

Bashで表現すると以下のような変数になります。汎用性を高めるために、Bashの変数名でコマンドの解説を進めていきます。SWA名に関してはパラメーターファイルで設定済みですが、削除にも使用することも考えて、定義しておきます。

$RESOURCE_GROUP_NAME="bicep-test-group"

$LOACTION="eastasia"

$SWA_NAME="bicep-local-deploy-swa"

リソースグループの作成

$RESOURCE_GROUP_NAME="bicep-test-group"
$LOACTION="eastasia"

# リソースグループの確認
az group show --name $RESOURCE_GROUP_NAME

# リソースの作成
az group create --name $RESOURCE_GROUP_NAME --location $LOCATION

az group createコマンドでは、--nameオプションで名前を--locationオプションでリージョンを指定する必要があります。

Bicepテンプレートの検証とデプロイ

Bicepテンプレートをデプロイする前に、構文エラーや設定ミスがないかを検証することが重要です。az deployment group validateコマンドを使用することで、実際にリソースを作成する前にテンプレートの妥当性をチェックできます。

# 検証
az deployment group validate \
	  --resource-group $RESOURCE_GROUP_NAME \
	  --template-file infra/bicep/main.local.bicep \
	  --parameters @infra/bicep/parameters.local.json
  
# デプロイ
az deployment group create \
	  --resource-group "$RESOURCE_GROUP" \
	  --name "$DEPLOYMENT_NAME" \
	  --template-file "$BICEP_TEMPLATE" \
	  --parameters "@$BICEP_PARAMS" 

検証が完了したら、az deployment group createコマンドで実際にBicepテンプレートをデプロイします。--nameオプションでデプロイ名を指定でき、後からAzure Portalでデプロイ履歴を確認する際に便利です。

Azure CLIでは、パラメーターファイルを指定する際に@ファイルパスという記法を使用します。この記法により、ファイルの内容がパラメータとして読み込まれます。

# ✅ 正しい - ファイルの内容を読み込む
--parameters "@parameters.local.json"

# ❌ 間違い - ファイル名がそのまま渡される
--parameters "parameters.local.json"

デプロイトークンの取得

SWA CLIでデプロイするためには、Static Web Appsのデプロイトークンが必要です。このトークンは、作成されたStatic Web Appsリソースからaz staticwebapp secrets listコマンドで取得できます。

az staticwebapp secrets list --name $SWA_NAME --resource-group $RESOURCE_GROUP_NAME --query "properties.apiKey" -o tsv

このコマンドでは、--query "properties.apiKey"オプションでJSON出力からAPIキー(デプロイトークン)のみを抽出し、-o tsvオプションでタブ区切り形式として出力することで、余計な引用符を除去しています。取得したトークンは環境変数に保存して、次のSWA CLIデプロイで使用します。

SWA CLIデプロイ

swa-cli.config.jsonを設定していれば、設定項目に従ってデプロイされます。今回であれば、以下のような設定をしています。

{
  "$schema": "https://aka.ms/azure/static-web-apps-cli/schema",
  "configurations": {
    "frontend-swr": {
      "appLocation": "out",
      "outputLocation": "."
    }
  }
}

-env productionオプションで本番環境としてデプロイを指定し、-deployment-tokenで先ほど取得したトークンを使用します。-verboseオプションを追加することで、詳細なログが出力され、デプロイの進行状況を確認できるため、トラブルシューティングの際に役立ちます。

swa deploy --env production --deployment-token "$DEPLOYMENT_TOKEN" --verbose

デプロイ結果の確認

デプロイが完了したら、Static Web Appsの情報を確認してみましょう。az staticwebapp showコマンドを使用することで、デプロイされたアプリの詳細情報を取得できます。

az staticwebapp show --name $SWA_NAME --resource-group $RESOURCE_GROUP_NAME --query "{name:name,url:defaultHostname,status:repositoryUrl}" -o table

リソースの削除

検証が完了したら、不要な課金を避けるためにリソースを削除しましょう。削除方法は2つあります。個別にStatic Web Appsを削除する方法と、リソースグループごと削除する方法です。

# リソースグループごと削除
az group delete --name $RESOURCE_GROUP_NAME --yes --no-wait

# Static Web Appsを指定して削除
az staticwebapp delete --name $SWA_NAME --resource-group $RESOURCE_GROUP_NAME --yes

az staticwebapp deleteコマンドではStatic Web Appsリソースのみを削除しますが、az group deleteコマンドを使用することで、リソースグループとその中のすべてのリソースを一括で削除できます。--yesオプションで確認プロンプトをスキップし、--no-waitオプションで削除処理の完了を待たずにコマンドを終了します。削除処理はバックグラウンドで実行されるため、時間のかかる削除処理でも待機する必要がありません。リソースグループごと削除する方が確実で、削除し忘れを防げるのでおすすめです。

コラム:開発効率改善~処理をbashに集約~

さて、コマンドの検証は完了しました。ですが、このままではBicepテンプレートを使っているというよりazコマンドを一個ずつ入力しているだけになっていますね。

というわけで、AIに手伝ってもらってbashスクリプトにまとめました。

作成するファイル

作成するファイルとしては、.env.localdeploy.local.shになります。

環境変数:.env.local

こちらのファイルでは、azコマンドでは埋め込んでいた値を変数として切り出しています。これによって.env.local を変更するだけで、異なるリソースを作成することができます。

# Azure Static Web Apps デプロイ設定ファイル

# Azure設定
RESOURCE_GROUP_NAME="ryu-swa-bicep-test"
LOCATION="eastasia"

自動化スクリプト:infra > scripts > deploy.local.sh

いきなりbashを読むのは大変なので、一度シーケンス図に起こしておきます。

全体のステップとしては4ステップで構成されています。セクションごとに見ていくと、コマンド自体は「コマンドを使ってデプロイ~削除」で使用したものを使っているので、紐解けるかと思います。

#!/bin/bash

# Azure Static Web Apps ローカル開発用デプロイスクリプト
set -e

# 色付きログ用の関数
log_info() { echo -e "\033[1;34m$1\033[0m"; }
log_success() { echo -e "\033[1;32m$1\033[0m"; }
log_warning() { echo -e "\033[1;33m$1\033[0m"; }
log_error() { echo -e "\033[1;31m$1\033[0m"; }

# .gitディレクトリがあるルートディレクトリを取得
CONFIG_FILE="$(git rev-parse --show-toplevel)/.env.local"

if [ -f "$CONFIG_FILE" ]; then
    echo "📁 設定ファイル読み込み: $CONFIG_FILE"
    source "$CONFIG_FILE"
else
    echo "⚠️  設定ファイルが見つかりません: $CONFIG_FILE"
    echo "   .env.deploy.example をコピーして設定してください"
    exit 1
fi

# 設定値
DEPLOYMENT_NAME="swa-local-deployment-$(date +%Y%m%d-%H%M%S)"


log_info "🧪 Azure Static Web Apps ローカル開発環境デプロイ"
log_info "=============================================="

# 1. 前提条件のチェック
log_info "📋 前提条件確認中..."

# Azure CLI の確認
if ! command -v az &> /dev/null; then
    log_error "❌ Azure CLIがインストールされていません"
    exit 1
fi

# SWA CLI の確認(グローバルインストール版)
if ! command -v swa &> /dev/null; then
    log_error "❌ SWA CLIがグローバルインストールされていません"
    log_info "💡 インストールコマンド: npm install -g @azure/static-web-apps-cli"
    exit 1
fi

log_success "✅ 前提条件確認完了"

# 2. Azure CLI ログイン確認
log_info ""
log_info "🔐 Azure CLI認証状態確認..."
if ! az account show &> /dev/null; then
    log_warning "❌ Azure CLIにログインしてください"
    az login
else
    log_success "✅ Azure CLI認証済み"
    az account show --query "{Name:name, SubscriptionId:id}" -o table
fi

# 3. リソースグループ作成(存在しない場合)
log_info ""
log_info "📦 ローカル開発用リソースグループ確認・作成..."
if ! az group show --name $RESOURCE_GROUP_NAME &> /dev/null; then
    log_info "🔧 リソースグループ作成中: $RESOURCE_GROUP_NAME"
    az group create --name $RESOURCE_GROUP_NAME --location $LOCATION
    log_success "✅ リソースグループ作成完了"
else
    log_success "✅ リソースグループ既存: $RESOURCE_GROUP_NAME"
fi

# 4. Bicepファイルの存在確認
log_info ""
log_info "📁 Bicepテンプレートファイル確認..."
if [ ! -f "infra/bicep/main.local.bicep" ]; then
    log_error "❌ Bicepテンプレートファイルが見つかりません: infra/bicep/main.local.bicep"
    exit 1
fi

if [ ! -f "infra/bicep/parameters.local.json" ]; then
    log_error "❌ Bicepパラメータファイルが見つかりません: infra/bicep/parameters.local.json"
    exit 1
fi

# 5. Bicepテンプレートの検証
log_info ""
log_info "🔍 ローカル開発用Bicepテンプレート検証..."
if az deployment group validate \
    --resource-group $RESOURCE_GROUP_NAME \
    --template-file infra/bicep/main.local.bicep \
    --parameters @infra/bicep/parameters.local.json &> /dev/null; then
    log_success "✅ Bicepテンプレート検証成功"
else
    log_error "❌ Bicepテンプレート検証失敗"
    exit 1
fi

# 6. Bicepデプロイ実行
log_info ""
log_info "🚀 ローカル開発用Static Web Appsデプロイ開始..."
DEPLOYMENT_OUTPUT=$(az deployment group create \
    --resource-group $RESOURCE_GROUP_NAME \
    --name $DEPLOYMENT_NAME \
    --template-file infra/bicep/main.local.bicep \
    --parameters @infra/bicep/parameters.local.json \
    --query "properties.outputs" -o json)

if [ $? -eq 0 ]; then
    log_success "✅ Bicepデプロイ完了"
else
    log_error "❌ Bicepデプロイ失敗"
    exit 1
fi

# 7. デプロイ結果の表示
log_info ""
log_info "📊 ローカル開発環境デプロイ結果:"
log_info "============================="

# JSON出力の検証
if ! echo "$DEPLOYMENT_OUTPUT" | jq . &> /dev/null; then
    log_error "❌ デプロイ結果の解析に失敗しました"
    echo "Raw output: $DEPLOYMENT_OUTPUT"
    exit 1
fi

SWA_NAME=$(echo $DEPLOYMENT_OUTPUT | jq -r '.staticWebAppName.value // "N/A"')
SWA_URL=$(echo $DEPLOYMENT_OUTPUT | jq -r '.staticWebAppUrl.value // "N/A"')
MANAGEMENT_URL=$(echo $DEPLOYMENT_OUTPUT | jq -r '.managementUrl.value // "N/A"')

# az staticwebapp deployment token コマンドでデプロイトークンを取得
DEPLOYMENT_TOKEN=$(az staticwebapp secrets list --name $SWA_NAME --resource-group $RESOURCE_GROUP_NAME --query "properties.apiKey" -o tsv)


echo "🌐 Static Web App名: $SWA_NAME"
echo "🔗 アプリURL: $SWA_URL"
echo "🔑 デプロイトークン: $DEPLOYMENT_TOKEN"
echo "⚙️  管理画面: $MANAGEMENT_URL"

# 8. parameters.json ファイルの更新
log_info ""
log_info "📝 parameters.json ファイル更新中..."
PARAMS_FILE="infra/bicep/parameters.local.json"

# デプロイ情報を記録用のJSONファイルに保存
DEPLOY_INFO_FILE="infra/bicep/deploy.info.local.json"
{
    echo "{"
    echo "  \"deploymentDate\": \"$(date -Iseconds)\","
    echo "  \"staticWebAppName\": \"$SWA_NAME\","
    echo "  \"staticWebAppUrl\": \"$SWA_URL\","
    echo "  \"deploymentToken\": \"$DEPLOYMENT_TOKEN\","
    echo "  \"managementUrl\": \"$MANAGEMENT_URL\","
    echo "  \"resourceGroupName\": \"$RESOURCE_GROUP_NAME\","
    echo "  \"deploymentName\": \"$DEPLOYMENT_NAME\""
    echo "}"
} > "$DEPLOY_INFO_FILE"

log_success "✅ デプロイ情報をdeploy.info.local.jsonに保存しました"

# 9. ローカルデプロイ実行
log_info ""
log_info "📦 アプリケーションをSWAにデプロイ中..."


# グローバルインストール版のSWA CLIを使用
if swa deploy --env production --deployment-token "$DEPLOYMENT_TOKEN" --verbose; then
    log_success "✅ アプリケーションデプロイ完了"
else
    log_error "❌ アプリケーションデプロイ失敗"
    cd ..
    exit 1
fi

# cd ..

# 10. 便利なコマンドの表示
log_info ""
log_info "💻 便利なコマンド:"
log_info "================="
echo "# アプリの再デプロイ"
echo "swa deploy --deployment-token $DEPLOYMENT_TOKEN"
echo ""
echo "# ローカル開発サーバー起動"
echo "swa start"
echo ""
echo "# SWA CLI バージョン確認"
echo "swa --version"
echo ""
echo "# デプロイ情報確認"
echo "cat infra/bicep/deploy-info-local.json | jq"
echo ""
echo "# ログの確認"
echo "az staticwebapp logs show --name $SWA_NAME --resource-group $RESOURCE_GROUP_NAME"

# 11. 完了メッセージ
log_info ""
log_success "🎉 ローカル開発環境デプロイ完了!"
log_info "📝 次のステップ:"
echo "   1. ブラウザで $SWA_URL にアクセス"
echo "   2. アプリが正常に動作することを確認"
echo "   3. 必要に応じて上記のコマンドでローカル開発サーバーを起動"
echo "   4. 開発が完了したら本番用のGitHub Actionsワークフローをテスト"
log_info ""
log_info "💡 本番環境へのデプロイ:"
echo "   ./infra/scripts/deploy.sh を使用してください"
log_info ""
log_warning "⚠️  重要: デプロイトークンは機密情報です。共有しないでください!"

こちらを実行することで、リソースグループの作成からSWAのデプロイまで自動的に行うことができます。また、デプロイした情報はinfra > bicepディレクトリにdeploy.info.local.json としてまとめてあります。デプロイするたびにこちらが、更新されるためこちらを確認することでデプロイ済みの情報をすぐ確認することができます。

!!ここで注意点です。deploy.info.local.jsonは機密情報に当たるためGitHubなどにデプロイして公開しないようにしましょう。デプロイトークンに関しては、1か月に一度は更新が望ましいです。もし流出した場合はサイトの表示が乗っ取られる可能性があります!取り扱いには十分注意しましょう。

機密情報を守る砦:.gitignore

先ほど、機密情報の塊の話をしたのでGitHubに上げることも考慮して機密情報をPushしないように.gitignoreの設定を追加します。


deploy.info.*.json

.env
.env.*

!.env.*.sample
龍ちゃん
龍ちゃん

さて~こちらのスクリプトは8割Claudeさんが作ったものなので、Claudeさんに自画自賛しながら解説してもらおうと思います。 ここから先は全部AI書いてもらおうと思います。

AI執筆:自動化スクリプトで楽々デプロイ infra > scripts > deploy.local.sh

手動でコマンドを一つずつ実行するのも勉強になりますが、毎回同じ作業を繰り返すのは正直面倒ですよね。そこで、先ほどの手動作業をすべて自動化したbashスクリプトを用意しました。

このスクリプトは、前のセクションで手動実行した一連の作業を完全に自動化し、さらに実用的な機能を多数追加したものです。実際に使ってみると「これは便利!」と感じる工夫がたくさん詰まっています。

親切すぎるエラーハンドリング

このスクリプトのエラーハンドリングは、単にエラーを検出するだけでなく、解決方法まで提示してくれる親切設計になっています。

# SWA CLI の確認
if ! command -v swa &> /dev/null; then
    log_error "❌ SWA CLIがグローバルインストールされていません"
    log_info "💡 インストールコマンド: npm install -g @azure/static-web-apps-cli"
    exit 1
fi

# デプロイディレクトリの確認
if [ ! -d "$DEPLOY_DIR" ]; then
    log_error "❌ デプロイディレクトリ '$DEPLOY_DIR' が見つかりません"
    log_info "💡 Next.jsアプリをビルドしてください: npm run build"
    exit 1
fi

初心者でも迷わず問題を解決できるよう、具体的な解決策を含めたメッセージが表示されます。これにより、チーム全体での環境構築がスムーズに進められます。

視覚的に分かりやすいログシステム

色付きログ機能により、長いログの中でも重要な情報が一目で識別できます。

log_info() { echo -e "\\033[1;34m$1\\033[0m"; }     # 青色(情報)
log_success() { echo -e "\\033[1;32m$1\\033[0m"; }  # 緑色(成功)
log_warning() { echo -e "\\033[1;33m$1\\033[0m"; }  # 黄色(警告)
log_error() { echo -e "\\033[1;31m$1\\033[0m"; }    # 赤色(エラー)

ターミナルでの作業が多い開発環境では、こうした視覚的な工夫が作業効率を大幅に向上させます。特に複数人でのペアプログラミングや画面共有時に威力を発揮します。

インテリジェントなデプロイ情報管理

デプロイ完了後、重要な情報をdeploy.info.local.jsonに自動保存する仕組みが組み込まれています。

{
  "deploymentDate": "2025-01-15T10:30:45+09:00",
  "staticWebAppName": "bicep-local-test-swa-dev-local",
  "staticWebAppUrl": "https://xxx.azurestaticapps.net",
  "deploymentToken": "xxxxxxxxxxxxxxxx",
  "managementUrl": "https://portal.azure.com/#@/resource/...",
  "resourceGroupName": "Bicep-test-group",
  "deploymentName": "swa-local-deployment-20250115-1030"
}

この情報は後のデバッグやトラブルシューティングで非常に重要になります。「あのデプロイトークンどこだっけ?」「URLは何だったかな?」といった疑問を即座に解決できる仕組みです。

実践的な便利機能

スクリプト終了時に表示される便利コマンド集も秀逸です。

echo "# アプリの再デプロイ"
echo "swa deploy --deployment-token $DEPLOYMENT_TOKEN"
echo ""
echo "# ローカル開発サーバー起動"
echo "swa start --deployment-token $DEPLOYMENT_TOKEN"
echo ""
echo "# デプロイ情報確認"
echo "cat infra/bicep/deploy-info-local.json | jq"

開発者が次に実行したくなるであろうコマンドを先回りして提示してくれる、まさに「かゆいところに手が届く」機能です。

実行方法とその効果

使用方法は極めてシンプルです:

# 実行権限の付与(初回のみ)
chmod +x infra/scripts/deploy.local.sh

# スクリプト実行
./infra/scripts/deploy.local.sh

このスクリプトを実行すると:

  1. 前提条件の自動チェック:Azure CLI、SWA CLI、必要なファイルの存在確認
  2. Azure認証の確認:ログイン状態のチェックと必要に応じたログイン誘導
  3. リソースグループの管理:存在確認と自動作成
  4. Bicepテンプレートの検証:デプロイ前の構文チェック
  5. インフラのデプロイ:Static Web Appsリソースの作成
  6. アプリケーションのデプロイ:SWA CLIを使用したコンテンツのアップロード
  7. 結果の保存と表示:デプロイ情報の永続化と次のアクションの提示

手動で実行すると10分程度かかる作業が、このスクリプトなら2-3分で完了します。さらに重要なのは、ヒューマンエラーのリスクが皆無になることです。

チーム開発での威力

このスクリプトの真価は、チーム開発で発揮されます。新しいメンバーがプロジェクトに参加した際、複雑な環境構築手順を説明する必要がありません。.env.localファイルを配布し、このスクリプトを実行してもらうだけで、全員が同一の開発環境を構築できます。

また、環境の再現性も完璧です。本番環境で問題が発生した際、同じスクリプトを使って検証環境を素早く構築し、問題の原因究明に集中できます。

まとめ

この自動化スクリプトは、単純な作業の自動化を超えて、開発チーム全体の生産性向上とコード品質の向上に寄与する包括的なソリューションです。エラーハンドリング、ログ管理、設定の分離、情報の永続化など、実際のプロジェクトで必要になる要素がすべて考慮されています。

Infrastructure as Codeの真の価値は、このような自動化とチーム全体での標準化にあります。一度このレベルの自動化を体験すると、手動でのインフラ管理には戻れなくなるでしょう。

まとめ

お疲れ様でした!今回は「基礎から学ぶ Azure Static Web Apps × Bicep 入門」の第2回として、Bicepテンプレートを使ったローカル開発環境の構築とSWA CLIデプロイを行いました。

前回構築したDevContainer環境のおかげで、Azure CLI、GitHub CLI、SWA CLIがすべて使える状態だったので、今回はすぐにBicepの実践に入ることができましたね。特にAzure CLIの認証情報がマウントされていたことで、コンテナ内での作業がとてもスムーズに進められたと思います。

今回学んだparameter.jsonファイルの活用は、環境の使い回しと変更管理の両方を効率化できる重要なテクニックです。設定項目をBicepテンプレートから分離することで、同じテンプレートを使って複数の環境を管理できるようになりました。特に機密情報の分離というセキュリティ面でのメリットは、実際のプロジェクトでも大きな価値を発揮します。

手動でのコマンド実行から自動化スクリプトまで段階的に進めることで、Infrastructure as Codeの基本的な考え方と実践的な運用方法を体験できたのではないでしょうか。特に自動化スクリプトにより、手動作業で10分かかっていたデプロイプロセスを2-3分に短縮できたのは、開発効率の大幅向上を実感していただけたと思います。

次のシリーズへの導入

さて、次回は「GitHub Actions で自動化!Bicep + CI/CD パイプラインで本格運用デプロイ環境構築」となります!

今回はローカル開発でのBicepテンプレート活用とSWA CLIデプロイを学びましたが、次回の大きな違いはデプロイの実行場所です。今回はローカルからSWA CLIでデプロイしましたが、次回はGitHub Actionsがデプロイを実行するように変更します。

次回の内容としては以下を予定しています:

  • GitHub Environment とSecrets の設定: BicepでStatic Web Appsを作成した後に取得できるデプロイトークンやアプリ設定情報をGitHubに登録
  • GitHub CLIを使った自動化: ローカルからGitHub CLIでSecrets登録を行うbashスクリプトの作成
  • GitHub Actions ワークフローの作成: GitHubリポジトリへのプッシュをトリガーとした自動デプロイパイプライン

今回作成したBicepテンプレートとparameter.jsonファイルの分離戦略は、次回でも同じ考え方で活用できます。また、今回手動でコマンドを一つずつ実行してデプロイの流れを体験したことで、GitHub Actionsで同様の処理が自動実行される仕組みも理解しやすくなるはずです。

さらに、今回と同様にGitHub Secrets の登録作業もbashスクリプト化して、ヒューマンエラーを最小限に抑えた自動化を実現していきます。

それでは、次回もお楽しみに!引き続き一緒に Azure Static Web Apps と Bicep をマスターし、本格的なCI/CDパイプラインを構築していきましょう。

ご覧いただきありがとうございます! この投稿はお役に立ちましたか?

役に立った 役に立たなかった

0人がこの投稿は役に立ったと言っています。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です