クイック スタート: Bicep を使って azd Python Web テンプレートによってデプロイされたサービスのスケーリング
Python Web azd
テンプレートを使用すると、新しい Web アプリケーションをすばやく作成し、Azure にデプロイすることができます。 azd
テンプレートは、低コストの Azure サービス オプションを使用するよう設計されています。 シナリオのテンプレートで定義された各サービスのサービス レベル (つまり SKU) を調整する必要が生じることは間違いなくあります。
このクイック スタートでは、該当する bicep テンプレート ファイルを更新して、既存のサービスをスケール アップし、新しいサービスをデプロイに追加します。 その後、azd provision
コマンドを実行し、Azure デプロイに加えた変更を表示します。
前提条件
Azure サブスクリプション - 無料アカウントを作成します
ローカル コンピューターに以下がインストールされている必要があります。
- Azure Developer CLI
- Docker Desktop
- Visual Studio Code
- 開発コンテナー拡張機能
- Visual Studio Code Bicep この拡張機能は Bicep 構文の作成に役立ちます。
テンプレートのデプロイ
開始するには、稼働中の azd
デプロイが必要です。 準備ができたら、azd
テンプレートにより生成された Bicep ファイルを変更することができます。
クイック スタート記事の手順 1 ~ 7 に従います。 手順 2 では、
azure-django-postgres-flexible-appservice
テンプレートを使用します。 便宜上、コマンド ラインから発行するコマンドのシーケンス全体を以下に示します。mkdir azdtest cd azdtest azd init --template azure-django-postgres-flexible-appservice azd auth login azd up
azd up
が完了したら、Azure portal を開いて、新しいリソース グループにデプロイされた Azure App Service に移動し、App Service の料金プランを書き留めます (App Service プランの概要ページの [要点] セクションにある [料金プラン] 値を参照)。クイック スタート記事の手順 1 では、azdtest フォルダーを作成するよう指示されました。 Visual Studio Code でそのフォルダーを開きます。
エクスプローラー ウィンドウで、infra フォルダーに移動します。 infra フォルダーでサブフォルダーとファイルを確認します。
main.bicep ファイルは、
azd up
またはazd provision
の実行時にデプロイされたすべてのサービスの作成を調整します。 他のファイル (db.bicep や web.bicep など) が呼び出され、その後 \core サブフォルダーに含まれているファイルが呼び出されます。\core サブフォルダーは、多くの Azure サービス用の bicep テンプレートが含まれる、深く入れ子になったフォルダー構造です。 \core サブフォルダー内の一部のファイルは、最上位レベルの 3 つの bicep ファイル (main.bicep、db.bicep、web.bicep) によって参照されます。このプロジェクトでまったく使用されないものもあります。
Bicep プロパティを変更することによるサービスのスケーリング
デプロイ内の既存のリソースをスケーリングするにはその SKU を変更します。 これを示すため、App Service プランを "Basic サービス プラン" (トラフィック要件が低く、高度な自動スケーリングやトラフィック管理機能を必要としないアプリ用に設計) から、"Standard サービス プラン" (運用環境のワークロードを実行するために設計) に変更します。
Note
どの SKU の変更でも事後に加えられるわけではありません。 スケーリング オプションについてより深く理解するため、ある程度の調査が必要になることがあります。
web.bicep ファイルを開き、
appService
モジュール定義を見つけます。 特に、プロパティ設定を探します。sku: { name: 'B1' }
次のように、値を
B1
からS1
に変更します。sku: { name: 'S1' }
重要
この変更の結果、1 時間あたりの料金がわずかに上昇します。 各種サービス プランとそれに関連するコストについて詳しくは、App Service の料金ページをご覧ください。
アプリケーションを既に Azure にデプロイしている場合、次のコマンドを使用して、アプリケーション コード自体を再デプロイせずにインフラストラクチャに変更をデプロイします。
azd provision
場所とサブスクリプションの入力を求められることはありません。 これらの値は、.azure<environment-name>.env ファイルに保存されます。ここで、
<environment-name>
は、azd init
時に指定した環境名です。azd provision
が完了したら、Web アプリケーションがまだ起動することを確認します。 さらに、リソース グループの App Service プランを調べ、料金プランが Standard サービス プラン (S1) に設定されていることを確認します。
Bicep を使った新しいサービス定義の追加
プロジェクトの Bicep に大規模な変更を加えることにより、新しいリソースをデプロイに追加できます。 これをデモンストレーションするため、今後追加を計画している架空の新機能に備えて、既存のデプロイに Azure Cache for Redis のインスタンスを追加します。
重要
この変更の結果、Azure portal または azd down
を使ってリソースを削除するまで、Azure Cache for Redis のインスタンスに対して料金が発生します。 各種サービス プランとそれに関連するコストについて詳しくは、Azure Cache for Redis の料金ページをご覧ください。
infra フォルダーに redis.bicep という名前の新しいファイルを作成します。 次のコードをコピーして新しいファイルに貼り付けます。
param name string param location string = resourceGroup().location param tags object = {} param keyVaultName string param connStrKeyName string param passwordKeyName string param primaryKeyKeyName string @allowed([ 'Enabled' 'Disabled' ]) param publicNetworkAccess string = 'Enabled' @allowed([ 'C' 'P' ]) param skuFamily string = 'C' @allowed([ 0 1 2 3 4 5 6 ]) param skuCapacity int = 1 @allowed([ 'Basic' 'Standard' 'Premium' ]) param skuName string = 'Standard' param saveKeysToVault bool = true resource redis 'Microsoft.Cache/redis@2020-12-01' = { name: name location: location properties: { sku: { capacity: skuCapacity family: skuFamily name: skuName } publicNetworkAccess: publicNetworkAccess enableNonSslPort: true } tags: tags } resource keyVault 'Microsoft.KeyVault/vaults@2022-07-01' existing = { name: keyVaultName } resource redisKey 'Microsoft.KeyVault/vaults/secrets@2022-07-01' = if (saveKeysToVault) { name: primaryKeyKeyName parent: keyVault properties: { value: redis.listKeys().primaryKey } } resource redisConnStr 'Microsoft.KeyVault/vaults/secrets@2018-02-14' = if (saveKeysToVault) { name: connStrKeyName parent: keyVault properties: { value: '${name}.redis.cache.windows.net,abortConnect=false,ssl=true,password=${redis.listKeys().primaryKey}' } } resource redisPassword 'Microsoft.KeyVault/vaults/secrets@2018-02-14' = if (saveKeysToVault) { name: passwordKeyName parent: keyVault properties: { value: redis.listKeys().primaryKey } } output REDIS_ID string = redis.id output REDIS_HOST string = redis.properties.hostName
main.bicep ファイルを変更して、"redis" リソースのインスタンスを作成します。
main.bicep ファイルで、Web フロントエンド セクションに関連付けられている末尾の中かっこの下と secrets セクションの上に以下のコードを追加します。
// Caching server module redis 'redis.bicep' = { name: 'redis' scope: resourceGroup params: { name: replace('${take(prefix, 19)}-rds', '--', '-') location: location tags: tags keyVaultName: keyVault.outputs.name connStrKeyName: 'RedisConnectionString' passwordKeyName: 'RedisPassword' primaryKeyKeyName: 'RedisPrimaryKey' publicNetworkAccess: 'Enabled' skuFamily: 'C' skuCapacity: 1 skuName: 'Standard' saveKeysToVault: true } }
ファイルの一番下に出力値を追加します。
output REDIS_ID string = redis.outputs.REDIS_ID output REDIS_HOST string = redis.outputs.REDIS_HOST
main.bicep ファイル全体が以下のコードと同じであることを確認します。
targetScope = 'subscription' @minLength(1) @maxLength(64) @description('Name which is used to generate a short unique hash for each resource') param name string @minLength(1) @description('Primary location for all resources') param location string @secure() @description('DBServer administrator password') param dbserverPassword string @secure() @description('Secret Key') param secretKey string @description('Id of the user or app to assign application roles') param principalId string = '' var resourceToken = toLower(uniqueString(subscription().id, name, location)) var prefix = '${name}-${resourceToken}' var tags = { 'azd-env-name': name } resource resourceGroup 'Microsoft.Resources/resourceGroups@2021-04-01' = { name: '${name}-rg' location: location tags: tags } // Store secrets in a keyvault module keyVault './core/security/keyvault.bicep' = { name: 'keyvault' scope: resourceGroup params: { name: '${take(replace(prefix, '-', ''), 17)}-vault' location: location tags: tags principalId: principalId } } module db 'db.bicep' = { name: 'db' scope: resourceGroup params: { name: 'dbserver' location: location tags: tags prefix: prefix dbserverDatabaseName: 'relecloud' dbserverPassword: dbserverPassword } } // Monitor application with Azure Monitor module monitoring 'core/monitor/monitoring.bicep' = { name: 'monitoring' scope: resourceGroup params: { location: location tags: tags applicationInsightsDashboardName: '${prefix}-appinsights-dashboard' applicationInsightsName: '${prefix}-appinsights' logAnalyticsName: '${take(prefix, 50)}-loganalytics' // Max 63 chars } } // Web frontend module web 'web.bicep' = { name: 'web' scope: resourceGroup params: { name: replace('${take(prefix, 19)}-appsvc', '--', '-') location: location tags: tags applicationInsightsName: monitoring.outputs.applicationInsightsName keyVaultName: keyVault.outputs.name appCommandLine: 'entrypoint.sh' pythonVersion: '3.12' dbserverDomainName: db.outputs.dbserverDomainName dbserverUser: db.outputs.dbserverUser dbserverDatabaseName: db.outputs.dbserverDatabaseName } } // Caching server module redis 'redis.bicep' = { name: 'redis' scope: resourceGroup params: { name: replace('${take(prefix, 19)}-rds', '--', '-') location: location tags: tags keyVaultName: keyVault.outputs.name connStrKeyName: 'RedisConnectionString' passwordKeyName: 'RedisPassword' primaryKeyKeyName: 'RedisPrimaryKey' publicNetworkAccess: 'Enabled' skuFamily: 'C' skuCapacity: 1 skuName: 'Standard' saveKeysToVault: true } } var secrets = [ { name: 'DBSERVERPASSWORD' value: dbserverPassword } { name: 'SECRETKEY' value: secretKey } ] @batchSize(1) module keyVaultSecrets './core/security/keyvault-secret.bicep' = [for secret in secrets: { name: 'keyvault-secret-${secret.name}' scope: resourceGroup params: { keyVaultName: keyVault.outputs.name name: secret.name secretValue: secret.value } }] output AZURE_LOCATION string = location output AZURE_KEY_VAULT_ENDPOINT string = keyVault.outputs.endpoint output AZURE_KEY_VAULT_NAME string = keyVault.outputs.name output APPLICATIONINSIGHTS_NAME string = monitoring.outputs.applicationInsightsName output BACKEND_URI string = web.outputs.uri output REDIS_ID string = redis.outputs.REDIS_ID output REDIS_HOST string = redis.outputs.REDIS_HOST
すべての変更が保存されていることを確認し、以下のコマンドを使用して Azure 上のプロビジョニング済みリソースを更新します。
azd provision
Note
多くの理由のため、既存のデプロイに Azure Cache for Redis のインスタンスを追加する処理には時間がかかることがあります。 テストでは、実行時間が 20 分を超えました。 エラーが表示されない限り、プロセスは完了するまで続行されます。
azd provision
が完了したら、Azure portal を開いて、デプロイ用のリソース グループに移動し、サービスの一覧に Azure Cache for Redis のインスタンスがあることを確認します。
これでクイック スタートは終了ですが、よりスケーラブルで運用環境に対応したアプリケーションの構築に役立つ Azure サービスが多数あります。 まず、たとえば Azure API Management、Azure Front Door、Azure CDN、Azure Virtual Network について学習することをお勧めします。
リソースをクリーンアップする
azd down コマンドを実行することにより、テンプレートによって作成されたリソースをクリーンアップします。
azd down
azd down
コマンドを実行すると、Azure リソースと GitHub Actions ワークフローが削除されます。 メッセージが表示されたら、リソース グループに関連付けられたすべてのリソースを削除することに同意します。
azdtest フォルダーを削除したり、プロジェクトのファイルを変更することにより独自のアプリケーションの基礎として使用したりすることもできます。
関連コンテンツ
- Python Web
azd
テンプレートの詳細を確認する azd
コマンドについての詳細をご覧ください。- プロジェクト内の各フォルダーとファイルの動作と、編集または削除できる内容について確認してください。
- Bicep テンプレートを更新し、Azure サービスを追加または削除します。 Bicep についての情報が必要な場合 こちらの「ラーニング パス: Bicep の基礎」をお試しください
azd
を使用して、マージ時にメイン ブランチに再デプロイする GitHub Actions CI/CD パイプラインを設定する- Azure Developer CLI を使ってアプリを監視できるよう監視を設定する