エラスティック ジョブの作成、構成、および管理 (プレビュー)
適用対象: Azure SQL Database
この記事では、エラスティック ジョブを作成、構成、および管理する方法を学びます。
エラスティック ジョブを使用したことがない場合は、Azure SQL Database でのジョブ自動化の概念を参照してください。
エージェントの作成と構成
S1 以上で、中身が空のデータベースを作成または特定します。 このデータベースが、エラスティック ジョブ エージェントの作成時に "ジョブ データベース" として使用されます。
ポータルまたは PowerShell を使用してエラスティック ジョブ エージェントを作成します。
ジョブの作成、実行、および管理
PowerShell または T-SQL を使用して、"ジョブ データベース" にジョブ実行のための資格情報を作成します。
PowerShell または T-SQL を使用して、ターゲット グループ (ジョブの実行の対象とするデータベース) を定義します。
ジョブを実行するデータベースのそれぞれに、ジョブ エージェントの資格情報を作成 (グループ内の各データベースにユーザー (またはロール) を追加) します。 例については、PowerShell のチュートリアルを参照してください。
PowerShell または T-SQL を使用してジョブを作成します。
PowerShell または T-SQL を使用してジョブ ステップを追加します。
PowerShell または T-SQL を使用してジョブを実行します。
ポータル、PowerShell、またはT-SQL を使用して、ジョブの実行状態を監視します。
ジョブの実行のための資格情報
ジョブはデータベース スコープ資格情報を使用して、実行時にターゲット グループによって指定されたデータベースに接続します。 ターゲット グループにサーバーまたはプールが含まれる場合には、利用できるデータベースを列挙する master
データベースに接続するときに、これらのデータベース スコープ資格情報が使用されます。
ジョブの実行に必要な資格情報を正しく設定する作業は多少複雑ですので、次のポイントを頭に入れておくようにしてください。
- データベース スコープ資格情報は "ジョブ データベース" に作成する必要があります。
- ターゲット データベースにはいずれも、ジョブが正常に完了するうえで十分なアクセス許可を備えたログインを設定しておく必要があります (以下の図の )。
- 資格情報は複数のジョブで再利用できます。このため、資格情報のパスワードは暗号化のうえ、ジョブ オブジェクトに対する読み取りアクセス許可が認められたユーザーに知られることがないように保護されます。
次の図は、ジョブの正しい資格情報を把握し、その設定をサポートすることを意図して用意したものです。 ジョブの実行が必要なデータベースの 1 つひとつ ("ターゲット ユーザー DB" すべて) で、忘れずにユーザーを作成してください。
セキュリティの運用方法
エラスティック ジョブを使用する際のベスト プラクティスをいくつか紹介します。
- API の使用を信頼できるユーザーに制限します。
- 資格情報には、ジョブ ステップの実行に最小限必要な権限だけを設定します。 詳細については、承認と権限に関するページを参照してください。
- ターゲット グループのメンバーとしてサーバーまたはプールを使用する場合には、
master
データベースでデータベースを表示/一覧表示するための権限を設定した資格情報を別個に作成することを強くお勧めします。この資格情報は、ジョブの実行前にサーバーまたはプールのデータベースの一覧を展開する際に使用します。
エージェントのパフォーマンス、容量、および制約
エラスティック ジョブでは、実行時間の長いジョブの完了を待っている間に消費する計算リソースを最小限に抑えます。
データベースから成るターゲット グループの大きさと、ジョブについて希望する実行時間 (同時に実行する worker の数) に応じて、エージェントが "ジョブ データベース" に要求する計算量とパフォーマンスが変わります (ターゲットとジョブの数が増えるほど、要求される計算量が増大します)。
ジョブを原因とするターゲット データベースのパフォーマンス低下を防ぐ
SQL エラスティック プール内のデータベースにジョブを実行しているときにリソースに対する負荷が大きくなりすぎないようにするために、ジョブを構成して同時にジョブの実行対象とするデータベースの数に制限を設けることができます。
sp_add_jobstep
ストアド プロシージャの @max_parallelism
パラメーターを T-SQL で設定することで、ジョブが実行する同時実行データベースの数を設定します。
既知の制限事項
これらは、Elastic Job サービスに対する現在の制限です。 これらの制限事項ができるだけなくなるように、積極的に取り組んでいます。
問題 | 説明 |
---|---|
新しい Azure リージョンにフェールオーバーまたは移動した後、新しいリージョンでElastic Job エージェントを再作成して始動させる必要があります。 | Elastic Job サービスは、ジョブ エージェントとジョブ メタデータをジョブ データベースに格納します。 Azure リソースを新しい Azure リージョンにフェールオーバーまたは移動すると、ジョブ データベース、ジョブ エージェント、ジョブ メタデータも新しい Azure リージョンに移動されます。 ただし、Elastic Job エージェントはコンピューティング専用のリソースであり、新しいリージョンでジョブを再度実行する前に、新しいリージョンで確実に再作成して始動させる必要があります。 始動させると、Elastic Job エージェントは、以前に定義したジョブ スケジュールに基づいて、新しいリージョンでのジョブの実行を再開します。 |
同時実行ジョブの上限 | 現時点のプレビュー版では、同時に実行するジョブの上限が 100 件に制限されています。 |
ジョブ データベースからの過剰な監査ログ | エラスティック ジョブ エージェントは、ジョブ データベースを常にポーリングし、新しいジョブやその他の CRUD 操作の到着を確認します。 ジョブ データベースを格納しているサーバーで監査が有効になっている場合、ジョブ データベースによって大量の監査ログが生成される可能性があります。 これは、述語式を含む Set-AzSqlServerAudit コマンドを使用してこれらの監査ログをフィルター処理することで軽減できます。次に例を示します。 Set-AzSqlServerAudit -ResourceGroupName "ResourceGroup01" -ServerName "Server01" -BlobStorageTargetState Enabled -StorageAccountResourceId "/subscriptions/7fe3301d-31d3-4668-af5e-211a890ba6e3/resourceGroups/resourcegroup01/providers/Microsoft.Storage/storageAccounts/mystorage" -PredicateExpression "database_principal_name <> '##MS_JobAccount##'" このコマンドでは、ジョブ エージェントを選択してジョブ データベース監査ログにのみ出力します。あらゆるターゲット データベース管理ログに出力することはありません。 |
プライベート エンドポイントはサポートされていません | エラスティック ジョブ エージェントは現在、プライベート エンドポイントへの接続を制限するデータベースとエラスティック プールに接続できません。 |
Hyperscale データベースの "ジョブ データベース" としての使用 | Hyperscale データベースを "ジョブ データベース" として使用することはサポートされていません。 ただし、エラスティック ジョブでは、Azure SQL Database の他のデータベースと同じ方法で、Hyperscale データベースを対象にすることができます。 |
サーバーレス DB とエラスティック ジョブでの自動一時停止。 | ジョブ データベースがサーバーレス データベースの場合、エラスティック ジョブの対象となるデータベースでは自動一時停止がサポートされますが、ジョブ接続によって再開されます。 |
ジョブ作成のベスト プラクティス
Elastic Database ジョブを使用する場合は、次のベスト プラクティスを考慮してください。
べき等スクリプト
ジョブの T-SQL スクリプトは べき等にする必要があります。 べき等とは、実行に成功したスクリプトを再度実行した場合に、結果が同じになることを意味します。 一時的なネットワークの問題により、スクリプトが失敗することがあります。 その場合、ジョブは事前に設定した回数に達するまで自動的にスクリプトを再試行します。 べき等スクリプトは、2 回 (以上) 実行して成功した場合、結果が同じになります。
単純な方法として、作成前に、オブジェクトの存在をテストします。 仮定の例を以下に示します。
IF NOT EXISTS (SELECT * FROM sys.objects WHERE [name] = N'some_object')
print 'Object does not exist'
-- Create the object
ELSE
print 'Object exists'
-- If it exists, drop the object before recreating it.
同様に、スクリプトは、それが検出する条件を論理的に試験し、対処することで正常に実行できる必要があります。