Closed6

【Azure Functions / C#】REST APIでBlobStorage内のファイルを読み込みたい(AzurePortalでの開発)

noknok

はじめに

  • Blobに保存したファイルを読み込むAPIを作成したく、表題の開発を進める
    もともとAzurePortalでの開発経験があったので、あえてAzurePortalのみでの開発とした

参考URL

noknok

関数の作成手順

1、[関数の作成] ボタンを選択(既に他の関数が存在する場合は、 [+]ボタン から作成進める)

2、[HTTP trigger] を選択 > [次へ] を選択

関数の作成手順-1

3、任意の関数名とAuthorization Levelを選択 > [作成] を選択

関数の作成手順-2

4、関数作成完了

以下の [コードとテスト]メニュー内の処理を修正することで、APIの実装を進めていく。
関数の作成手順-3

noknok

Azure.Storage.Blobsパッケージの追加

Blobの操作をするには、上記パッケージを追加する必要がある。
そのためパッケージの追加を進める。

1、空の「function.proj」ファイルを作成してアップロード

依存関係を定義するためのファイルをアップロード。

パッケージ構成ファイルアップロード手順

2、依存関係を定義し、ファイルを保存

定義内容は、公式ドキュメントの構成と、Azure.Storege.Blobsのパッケージ参照方法を参考にした。
パッケージ構成ファイル編集手順

<Project Sdk="Microsoft.NET.Sdk">
    <PropertyGroup>
        <TargetFramework>netstandard2.0</TargetFramework>
    </PropertyGroup>
    <ItemGroup>
        <PackageReference Include="Azure.Storage.Blobs" Version="12.19.1" />
    </ItemGroup>
</Project>

参考URL

https://learn.microsoft.com/ja-jp/azure/azure-functions/functions-reference-csharp?tabs=functionsv2%2Cfixed-delay%2Cazure-cli#folder-structure
https://learn.microsoft.com/ja-jp/azure/azure-functions/functions-how-to-use-azure-function-app-settings?tabs=portal#manually-install-extensions
https://www.serverlessnotes.com/docs/add-libraries-with-nuget

noknok

ストレージアカウントから接続情報の取得

Functions側からBLOB内のファイルを参照するには、ストレージアカウントの接続情報が必要。
以下の情報を取得する。

1、ストレージアカウントの、コンテナーの接続文字列を取得

ファイルが格納されているストレージアカウントを選択 > [アクセスキー] > [接続文字列] から文字列を取得しておく
ストレージアカウントの接続文字列取得

2、コンテナー名の取得

ファイルが格納されているコンテナー名を取得しておく

noknok

run.csxファイルの編集

最終的に、以下の処理でストレージアカウント内のファイル読み込み&内容取得が行えた。

#r "Newtonsoft.Json"
using System.Net;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Primitives;
using Newtonsoft.Json;
using Azure.Storage.Blobs;
using Azure.Storage.Blobs.Models;
using System.Text;

public static async Task<IActionResult> Run(HttpRequest req, ILogger log)
{
    BlobServiceClient blobServiceClient = new BlobServiceClient("BLOB_CONNECT_STRING"); // ストレージ接続文字列を入力
    BlobContainerClient blobContainerClient = blobServiceClient.GetBlobContainerClient("BLOB_CONTAINER_NAME"); // コンテナー名を入力
    BlobClient blobClient = blobContainerClient.GetBlobClient("BLOB_OBJECT_PATH"); // BLOBオブジェクト名 or パスを入力(コンテナー配下でディレクトリを作成している場合))

    // BLOBオブジェクト読み込み
    string jsonString = "";
    try {
        // オブジェクト存在チェック
        Azure.Response<bool> isBlobExists = await blobClient.ExistsAsync();
        if (!isBlobExists.Value) {
            log.LogInformation("ファイルなし時のエラー処理記載");
        }

        // BLOBオブジェクト読み込み
        Azure.Response<BlobDownloadResult> response = await blobClient.DownloadContentAsync();
        jsonString = Encoding.UTF8.GetString(response.Value.Content);
    } catch(Exception ex) {
        log.LogInformation("オブジェクト読み込みエラー時の処理記載");
    }
   return new OkObjectResult(jsonString);
}

Functionsのテスト実行

以下手順でFunctions実行し、正常にBLOB内のファイル内容が取得できることを確認する
[テストと実行] > [入力](クエリなどがあれば適宜設定) > [実行] を選択
Functionsのテスト実行手順

参考URL

https://yotiky.hatenablog.com/entry/azurefunctions_connectiontoblob
https://qiita.com/moto-na/items/2100f00eb183bfb7c51c

このスクラップは26日前にクローズされました