Azure Batch でプログラムを実行しようとすると、かつてのクラウドサービスを彷彿とさせるインダイレクト感がします。フレームワークとしてはキチンとしていても、アドホックに挙動を確認したいコードをさくっと実行できなかったり。
というわけでVSから気軽(?)に実行できるようにしたのが以下のコード。
Azure Batch では固有の固有の変数が設定されるので、設定されていればBATCH側コードを実行し、そうでなければ、自分自身のDLL群をTask+リソースファイルとして登録してTaskとして実行します。
確認はPortal側からしましたが、ちゃんとやればBATCH側の出力も取ってこれると思います。
というわけで、自分自身の備忘録として。
class Program { static void Main(string[] args) { if (string.IsNullOrEmpty(Environment.GetEnvironmentVariable("AZ_BATCH_JOB_ID"))) { new BatchUtil().CreateTask(); } else { Console.WriteLine("******************************************"); Console.WriteLine("Hello Azure Batch"); Console.WriteLine("******************************************"); } } } public class BatchUtil { private const string TaskIdPrefix = "TestTask"; public void CreateTask() { var s = new BatchSettings(); BatchSharedKeyCredentials cred = new BatchSharedKeyCredentials(s.BatchAccountUrl, s.BatchAccountName, s.BatchAccountKey); using (BatchClient batchClient = BatchClient.Open(cred)) { var job = batchClient.JobOperations.GetJob(s.BatchJobId); CloudStorageAccount storageAccount = new CloudStorageAccount(new StorageCredentials(s.StorageAccountName, s.StorageAccountKey), true); CloudBlobClient blobClient = storageAccount.CreateCloudBlobClient(); blobClient.GetContainerReference(s.BlobContainer).CreateIfNotExists(); List<ResourceFile> inputFiles = new List<ResourceFile>(); foreach (var file in new FileInfo(Assembly.GetExecutingAssembly().Location).Directory.GetFiles()) { if (file.FullName.EndsWith(".xml", StringComparison.OrdinalIgnoreCase)) continue; inputFiles.Add(UploadFileToContainer(blobClient, s.BlobContainer, file.FullName)); } var taskId = "TestTask" + DateTime.Now.Ticks; var task = new CloudTask(taskId, $"cmd /c WebAppsBatchHybride.exe") { ResourceFiles = inputFiles }; batchClient.JobOperations.AddTask(s.BatchJobId, task); var btask = batchClient.JobOperations.GetTask(s.BatchJobId, taskId); TaskStateMonitor taskStateMonitor = batchClient.Utilities.CreateTaskStateMonitor(); taskStateMonitor.WhenAll(new List<CloudTask> {btask}, TaskState.Completed, TimeSpan.FromMinutes(120)).Wait(); } } private static ResourceFile UploadFileToContainer(CloudBlobClient blobClient, string containerName, string filePath) { Debug.WriteLine("Uploading file {0} to container [{1}]...", filePath, containerName); string blobName = Path.GetFileName(filePath); CloudBlobContainer container = blobClient.GetContainerReference(containerName); CloudBlockBlob blobData = container.GetBlockBlobReference(blobName); blobData.UploadFromFile(filePath); SharedAccessBlobPolicy sasConstraints = new SharedAccessBlobPolicy { SharedAccessExpiryTime = DateTime.UtcNow.AddHours(2), Permissions = SharedAccessBlobPermissions.Read }; string sasBlobToken = blobData.GetSharedAccessSignature(sasConstraints); string blobSasUri = $"{blobData.Uri}{sasBlobToken}"; return new ResourceFile(blobSasUri, blobName); } }