Övning – Ladda upp resurser som ska användas av en Batch med .NET-lagringsbiblioteket
Viktig
Du behöver en egen Azure-prenumeration för att köra den här övningen och du kan debiteras. Om du inte redan har en Azure-prenumeration skapar du ett kostnadsfritt konto innan du börjar.
Med Azure Storage-biblioteket kan du programmatiskt styra fillagring på ett Azure Storage-konto.
I den här övningen ska vi utöka appen för att ladda upp videor till bloblagring.
Lägg till anslutningsinformation för lagringskontot
I Cloud Shell lägger du till NuGet-paketet för Azure Blob Storage:
dotnet add package Microsoft.Azure.Storage.Blob
Redigera filen
Program.cs
i redigeraren:code Program.cs
Lägg till följande användningsinstruktioner överst i Program.cs för att inkludera de bibliotek som våra lagringsarbete behöver:
using Microsoft.Azure.Storage.Blob; using Microsoft.Azure.Storage; using System.IO;
Microsoft.Azure.Storage.Blob
ochMicrosoft.Azure.Storage
ge appen åtkomst till Azure Storage-kontot.System.IO
ger appen åtkomst till filsystemet för filhantering.Lägg till variabler för Azure Storage-autentiseringsuppgifterna i klassen
Program
i Program.cs:// Storage account credentials private const string envVarStorage = "STORAGE_NAME"; private const string envVarStorageKey = "STORAGE_KEY"; private static string storageAccountName; private static string storageAccountKey;
Skapa en in- och utdatacontainer
Ersätt
Main()
i Program.cs med följande uppdatering, som lägger till kod för att hantera lagringskontot:static async Task Main(string[] args) { // Read the environment variables to allow the app to connect to the Azure Batch and Azure Storage accounts batchAccountUrl = Environment.GetEnvironmentVariable(envVarBatchURI); batchAccountName = Environment.GetEnvironmentVariable(envVarBatchName); batchAccountKey = Environment.GetEnvironmentVariable(envVarKey); storageAccountName = Environment.GetEnvironmentVariable(envVarStorage); storageAccountKey = Environment.GetEnvironmentVariable(envVarStorageKey); // Show the user the accounts they are attaching to Console.WriteLine("BATCH URL: {0}, Name: {1}, Key: {2}", batchAccountUrl, batchAccountName, batchAccountKey); Console.WriteLine("Storage Name: {0}, Key: {1}", storageAccountName, storageAccountKey); // Construct the Storage account connection string string storageConnectionString = String.Format("DefaultEndpointsProtocol=https;AccountName={0};AccountKey={1}", storageAccountName, storageAccountKey); // Retrieve the storage account CloudStorageAccount storageAccount = CloudStorageAccount.Parse(storageConnectionString); // Create the blob client, for use in obtaining references to blob storage containers CloudBlobClient blobClient = storageAccount.CreateCloudBlobClient(); // Use the blob client to create the containers in blob storage const string inputContainerName = "input"; const string outputContainerName = "output"; await CreateContainerIfNotExistAsync(blobClient, inputContainerName); await CreateContainerIfNotExistAsync(blobClient, outputContainerName); // RESOURCE FILE SETUP // Add *.mp4 files into the \<solutiondir>\InputFiles folder. string inputPath = Path.Combine(Environment.CurrentDirectory, "InputFiles"); List<string> inputFilePaths = new List<string>( Directory.GetFileSystemEntries(inputPath, "*.mp4", SearchOption.TopDirectoryOnly)); // Upload data files. // Upload the data files using UploadResourceFilesToContainer(). This data will be // processed by each of the tasks that are executed on the compute nodes within the pool. List<ResourceFile> inputFiles = await UploadFilesToContainerAsync(blobClient, inputContainerName, inputFilePaths); // Obtain a shared access signature that provides write access to the output container to which // the tasks will upload their output. string outputContainerSasUrl = GetContainerSasUrl(blobClient, outputContainerName, SharedAccessBlobPermissions.Write); // The batch client requires a BatchSharedKeyCredentials object to open a connection var sharedKeyCredentials = new BatchSharedKeyCredentials(batchAccountUrl, batchAccountName, batchAccountKey); var batchClient = BatchClient.Open(sharedKeyCredentials); // Create the Batch pool, which contains the compute nodes that execute tasks. await CreateBatchPoolAsync(batchClient, PoolId); }
I föregående kod skapas ett
CloudStorageAccount
objekt för att göra det möjligt för appen att skapa en blobklient. Klienten används för att skapa lagringscontainrar, ladda upp filerna och ge åtkomst till jobbet för att skriva till utdatacontainern.
Skapa lagringscontainrar för in- och utdata för filer
Lägg till följande metod,
CreateContainerIfNotExistAsync()
, för att skapa en container med det angivna namnet:private static async Task CreateContainerIfNotExistAsync(CloudBlobClient blobClient, string containerName) { CloudBlobContainer container = blobClient.GetContainerReference(containerName); await container.CreateIfNotExistsAsync(); Console.WriteLine("Creating container [{0}].", containerName); }
Föregående kod använder
CloudBlobClient
som skapats i metodenMain
för att skapa containrar.
Bearbeta listan över alla filer som ska laddas upp
Lägg till följande metod,
UploadFilesToContainerAsync()
, för att ladda upp en lista över indatafiler till containern:private static async Task<List<ResourceFile>> UploadFilesToContainerAsync(CloudBlobClient blobClient, string inputContainerName, List<string> filePaths) { List<ResourceFile> resourceFiles = new List<ResourceFile>(); foreach (string filePath in filePaths) { resourceFiles.Add(await UploadResourceFileToContainerAsync(blobClient, inputContainerName, filePath)); } return resourceFiles; }
Föregående kod använder den skapade listan med filsökvägar för att anropa en metod för att ladda upp dem och lagra den skapade ResourceFile-referensen för användning av Batch-jobbet.
Ladda upp filerna
Lägg till en metod för att ladda upp de lokala filerna till Azure Storage:
private static async Task<ResourceFile> UploadResourceFileToContainerAsync(CloudBlobClient blobClient, string containerName, string filePath) { Console.WriteLine("Uploading file {0} to container [{1}]...", filePath, containerName); string blobName = Path.GetFileName(filePath); var fileStream = System.IO.File.OpenRead(filePath); CloudBlobContainer container = blobClient.GetContainerReference(containerName); CloudBlockBlob blobData = container.GetBlockBlobReference(blobName); await blobData.UploadFromFileAsync(filePath); // Set the expiry time and permissions for the blob shared access signature. In this case, no start time is specified, // so the shared access signature becomes valid immediately SharedAccessBlobPolicy sasConstraints = new SharedAccessBlobPolicy { SharedAccessExpiryTime = DateTime.UtcNow.AddHours(2), Permissions = SharedAccessBlobPermissions.Read }; // Construct the SAS URL for the blob string sasBlobToken = blobData.GetSharedAccessSignature(sasConstraints); string blobSasUri = String.Format("{0}{1}", blobData.Uri, sasBlobToken); return ResourceFile.FromUrl(blobSasUri, blobName); }
Föregående kod använder
CloudBlobClient
för att asynkront ladda upp filerna. Den skapar en resursfil som läggs till i en lista som aktiviteten som läggs till i nästa övning kommer att använda.
Aktivera åtkomst till utdatamappen
Skapa en SAS-referens (Signatur för delad åtkomst) till utdatacontainern för uppgifter att skriva sina filer till:
private static string GetContainerSasUrl(CloudBlobClient blobClient, string containerName, SharedAccessBlobPermissions permissions) { // Set the expiry time and permissions for the container access signature. In this case, no start time is specified, // so the shared access signature becomes valid immediately. Expiration is in 2 hours. SharedAccessBlobPolicy sasConstraints = new SharedAccessBlobPolicy { SharedAccessExpiryTime = DateTime.UtcNow.AddHours(2), Permissions = permissions }; // Generate the shared access signature on the container, setting the constraints directly on the signature CloudBlobContainer container = blobClient.GetContainerReference(containerName); string sasContainerToken = container.GetSharedAccessSignature(sasConstraints); // Return the URL string for the container, including the SAS token return String.Format("{0}{1}", container.Uri, sasContainerToken); }
Föregående kod skapar en SAS-URL med begränsad åtkomst (två timmar) för uppgiften så att den kan skriva de konverterade animerade GIF-filerna till Blob Storage.
Högerklicka i kodredigeraren och välj Sparaoch högerklicka sedan och välj Avsluta.
Testa filuppladdningarna
Skapa en InputFiles-mapp i din appkatalog i Cloud Shell:
mkdir InputFiles
Kör följande
curl
kommandon i Cloud Shell för att kopiera en uppsättning exempelvideor för husdjur från modulens GitHub-lagringsplats till den lokala mappen InputFiles.curl -L https://github.com/MicrosoftDocs/mslearn-apps-and-batch/raw/master/cutifypets/InputFiles/1.mp4 > ./InputFiles/1.mp4 curl -L https://github.com/MicrosoftDocs/mslearn-apps-and-batch/raw/master/cutifypets/InputFiles/2.mp4 > ./InputFiles/2.mp4 curl -L https://github.com/MicrosoftDocs/mslearn-apps-and-batch/raw/master/cutifypets/InputFiles/3.mp4 > ./InputFiles/3.mp4 curl -L https://github.com/MicrosoftDocs/mslearn-apps-and-batch/raw/master/cutifypets/InputFiles/4.mp4 > ./InputFiles/4.mp4 curl -L https://github.com/MicrosoftDocs/mslearn-apps-and-batch/raw/master/cutifypets/InputFiles/5.mp4 > ./InputFiles/5.mp4 curl -L https://github.com/MicrosoftDocs/mslearn-apps-and-batch/raw/master/cutifypets/InputFiles/6.mp4 > ./InputFiles/6.mp4
Spara autentiseringsuppgifterna för Azure Storage i miljövariabler. Det andra kommandot använder miljövariabeln RESOURCE_GROUP som vi definierade i Konfigurera anslutningsinformation för programmet i den tidigare övningen Övning – Få åtkomst till ditt Batch-konto med hjälp av .NET-klientbiblioteket. Värdet är det resursgruppsnamn som du valde när du skapade ditt Batch-konto.
export STORAGE_NAME=$(az storage account list --query "[?contains(name,'cuti')].name" --output tsv) export STORAGE_KEY=$(az storage account keys list --account-name $STORAGE_NAME --query [0].value --output tsv --resource-group $RESOURCE_GROUP)
Skapa och kör appen:
dotnet run
Programmet ska köra och skriva följande meddelanden till terminalen:
BATCH URL: [your batch url], Name: [your batch account name], Key: [your batch key] Storage Name: [your storage account name], Key: [your storage key] Creating container [input]. Creating container [output]. Uploading file ~\cutifypets\InputFiles\3.mp4 to container [input]... Uploading file ~\cutifypets\InputFiles\2.mp4 to container [input]... Uploading file ~\cutifypets\InputFiles\4.mp4 to container [input]... Uploading file ~\cutifypets\InputFiles\1.mp4 to container [input]... Uploading file ~\cutifypets\InputFiles\5.mp4 to container [input]... Uploading file ~\cutifypets\InputFiles\6.mp4 to container [input]... Creating pool [WinFFmpegPool]...
Kontrollera de filer som laddats upp i Azure-portalen
Gå tillbaka till Azure-portalen. I menyn till vänster väljer du Lagringskontonoch väljer sedan det lagringskonto som du skapade i den första övningen.
I menyn till vänster väljer du Behållare under Datalagringoch väljer sedan mappen inmatning.
Mappen innehåller de uppladdade videorna.