Azure Functions, Azure Storage Blob 및 Cosmos DB를 사용하여 공용 URL에서 이미지 복사

19646 단어 azuredotnet
공개적으로 액세스할 수 있는 이미지를 직접 호스팅하려는 몇 가지 이유가 있습니다. 예를 들어 사이트에서 쿼리 목적으로 메타데이터를 압축하거나 적용할 수 있습니다. Blast Off with Blazor 프로젝트의 경우 정확히 그 필요가 있었습니다.

제 경우에는 이미지를 저렴하게 호스팅하고 NoSQL 데이터베이스를 통해 이미지의 메타데이터로 작업하고 싶습니다. 이미 사이트를 Azure Static Web App으로 배포하고 있으므로 Azure Storage Blob 및 Azure Cosmos DB는 확실한 선택이었습니다.

이를 달성하기 위해 두 작업을 모두 수행하는 빠른 Azure 함수를 작성했습니다. 이것이 어떻게 작동하는지 살펴보겠습니다.

(완전한 치료를 위해 look at the repository을 복용하십시오.)

시작하기 전에: Azure 리소스 만들기



시작하기 전에 다음을 설정해야 합니다.
  • An Azure storage account (저는 StorageV2, LRS 및 핫 액세스 계층을 설정했습니다)
  • 이미지를 저장하기 위한 Ablob container(익명의 읽기 액세스는 공개적으로 사용 가능한 사진에 대해서는 문제가 되지 않으므로 공개 액세스로 설정했습니다)
  • A Cosmos DB resource (비용 절감을 위해 현재 프리뷰로 제공되는 서버리스 옵션을 사용하는 것을 제외하고는 대부분 기본값을 수락했습니다.)
  • A Cosmos DB collection, database, and container

  • 이러한 리소스를 모두 생성한 후 구성 값을 내 local.settings.json 파일에 추가했습니다. 이러한 값은 다양한 리소스를 찾아볼 때 포털에서 사용할 수 있습니다. (리소스를 배포할 때 구성에 추가해야 합니다.)

    {
      "Values": {
        "ApiKey": "my-nasa-api-key",
        "CosmosEndpoint": "url-to-my-cosmos-endpoint",
        "CosmosKey": "my-cosmos-primary-key",
        "CosmosDatabase": "name-of-my-cosmos-db",
        "CosmosContainer": "name-of-my-cosmos-container",
        "StorageAccount": "storage-account-name",
        "StorageKey": "storage-key",
        "BlobContainerUrl": "url-to-my-container"
      }
    }
    


    애저 함수



    내 Azure 함수에서는 다음 세 가지 작업을 수행합니다.
  • NASA Image of the Day API를 호출하여 URL, 제목, 설명 등 이미지 세부 정보가 포함된 응답을 받습니다
  • .
  • 응답 페이로드의 URL에서 이미지를 Azure Storage로 복사합니다
  • .
  • 그런 다음 새 리소스의 URL 및 개체의 다른 속성으로 Cosmos DB를 업데이트합니다
  • .

    Astronomy Picture of the Day site 을 보면 오늘의 이미지와 메타데이터를 호스팅합니다. Storage Blob에 이미지를 넣고 Cosmos DB에 세부 정보를 넣고 싶습니다.



    함수 자체는 다음과 같습니다.

    //using System;
    //using System.Threading.Tasks;
    //using Microsoft.AspNetCore.Mvc;
    //using Microsoft.Azure.WebJobs;
    //using Microsoft.Azure.WebJobs.Extensions.Http;
    //using Microsoft.AspNetCore.Http;
    //using Microsoft.Extensions.Logging;
    //using Newtonsoft.Json;
    //using System.Net.Http;
    //using Azure.Storage;
    //using Azure.Storage.Blobs;
    //using System.Linq;
    //using Microsoft.Azure.Cosmos;
    
    public class ImageUploader
    {
        private readonly HttpClient httpClient;
        private CosmosClient cosmosClient;
    
        public ImageUploader()
        {
            httpClient = new HttpClient();
            cosmosClient = new CosmosClient(Environment.GetEnvironmentVariable("CosmosEndpoint"),
                                            Environment.GetEnvironmentVariable("CosmosKey"));
        }
    
        [FunctionName("Uploader")]
        public async Task<IActionResult> Run(
        [HttpTrigger(AuthorizationLevel.Anonymous, "get", "post", Route = "upload")] HttpRequest req, ILogger log)
        {
            var apiKey = Environment.GetEnvironmentVariable("ApiKey");
            var response = await httpClient.GetAsync($"https://api.nasa.gov/planetary/apod?api_key={apiKey}");
            var result = await response.Content.ReadAsStringAsync();
    
            var imageDetails = JsonConvert.DeserializeObject<Image>(result);
    
            await UploadImageToAzureStorage(imageDetails.Url);
            await AddImageToContainer(imageDetails);
            return new OkObjectResult("Processing complete.");
        }
    }
    


    API에서 응답을 받은 후 Image 모델로 역직렬화한 다음 Azure에서 작업을 수행합니다(자세한 내용은 계속 읽으십시오).

    모델은 다음과 같습니다.

    using Newtonsoft.Json;
    using System;
    
    namespace MassImageUploader
    {
        public class Image
        {
            [JsonProperty("id")]
            public Guid Id { get; set; }
    
            [JsonProperty("title")]
            public string Title { get; set; }
    
            [JsonProperty("copyright")]
            public string Copyright { get; set; }
    
            [JsonProperty("date")]
            public DateTime Date { get; set; }
    
            [JsonProperty("explanation")]
            public string Explanation { get; set; }
    
            [JsonProperty("url")]
            public string Url { get; set; }
        }
    }
    


    Azure Storage Blob 컨테이너에 이미지 업로드



    UploadImageToAzureStorage 방법에서는 공개적으로 액세스할 수 있는 이미지의 URI를 전달합니다. 여기에서 URI의 마지막 부분(예: myfile.jpg)을 추출하여 fileName를 얻습니다. fileName를 사용하여 blobUri에 새 리소스의 경로를 빌드합니다. 이 경로에는 Azure Storage 컨테이너 URL과 fileName가 포함됩니다.

    그런 다음 자격 증명을 new StorageSharedKeyCredential 에 전달하고 new BlobClient 를 인스턴스화합니다. 그런 다음 StartCopyFromUriAsync 에서 복사가 발생하여 URI를 전달합니다.

    private async Task<bool> UploadImageToAzureStorage(string imageUri)
    {
        var fileName = GetFileNameFromUrl(imageUri);
        var blobUri = new Uri($"{Environment.GetEnvironmentVariable("BlobContainerUrl")}/{fileName}");
        var storageCredentials = new StorageSharedKeyCredential(
            Environment.GetEnvironmentVariable("StorageAccount"),
            Environment.GetEnvironmentVariable("StorageKey"));
        var blobClient = new BlobClient(blobUri, storageCredentials);
        await blobClient.StartCopyFromUriAsync(new Uri(imageUri));
        return await Task.FromResult(true);
    }
    
    private string GetFileNameFromUrl(string urlString)
    {
        var url = new Uri(urlString);
        return url.Segments.Last();
    }
    


    내 Azure Storage 컨테이너를 탐색하면 내 새 이미지가 표시됩니다.



    Cosmos DB에 메타데이터 푸시



    내 이미지가 성공적으로 저장되면 메타데이터를 Azure Cosmos DB 컨테이너에 푸시할 수 있습니다. 내 AddImageToContainer 메서드에서는 채워진Image 모델을 전달합니다. 그런 다음 Azure Cosmos DB 컨테이너를 가져오고 경로를 가져온 다음 CreateItemAsync를 전달하면서 image를 호출합니다. 쉬운.

    private async Task<bool> AddImageToContainer(Image image)
    {
        var container = cosmosClient.GetContainer(
            Environment.GetEnvironmentVariable("CosmosDatabase"),
            Environment.GetEnvironmentVariable("CosmosContainer"));
    
        var fileName = GetFileNameFromUrl(image.Url);
    
        image.Id = Guid.NewGuid();
        image.Url = $"{Environment.GetEnvironmentVariable("BlobContainerUrl")}/{fileName}";
    
        await container.CreateItemAsync(image);
        return await Task.FromResult(true);
    }
    


    Azure Portal의 내 Cosmos DB 리소스에 대한 데이터 탐색기에서 새 레코드를 볼 수 있습니다.



    마무리



    이 게시물에서는 공개적으로 액세스할 수 있는 이미지를 Azure Storage에 저장한 다음 해당 URL 및 기타 메타데이터를 Azure Cosmos DB에 게시하는 방법을 배웠습니다.

    언제나처럼 피드백이나 경험을 댓글에 자유롭게 게시하세요.

    좋은 웹페이지 즐겨찾기