新 Azure Functions 拡張ライブラリの紹介 (ベータ版)

みなさんごきげんよう。本記事は、2021 年 5 月 28 日（米国時間）ポストされた **https://devblogs.microsoft.com/azure-sdk/introducing-the-new-azure-function-extension-libraries-beta/** の意訳（と、ちょっと手を加えたもの）となります。
内容については下記原文が正となります。

https://devblogs.microsoft.com/azure-sdk/introducing-the-new-azure-function-extension-libraries-beta/

-----------------

最新 (訳注 : 2021/05/31 現在) [**Azure SDK のガイドライン** ](https://github.com/Azure/azure-sdk/blob/master/README.md)に沿って作成された、[**Storage** ](https://www.nuget.org/packages/Microsoft.Azure.WebJobs.Extensions.Storage/5.0.0-beta.5)(5.0.0-beta.4) 、[**Event Hubs** ](https://www.nuget.org/packages/Microsoft.Azure.WebJobs.Extensions.EventHubs/5.0.0-beta.5)(5.0.0-beta.5)、[**Service Bus** ](https://www.nuget.org/packages/Microsoft.Azure.WebJobs.Extensions.ServiceBus/5.0.0-beta.3)(5.0.0-beta.3)、[**Event Grid** ](https://www.nuget.org/packages/Microsoft.Azure.WebJobs.Extensions.EventGrid/3.0.0-beta.2)(3.0.0-beta.2) の Functions 拡張ライブラリのベータ版をリリースしました。

本稿では、これらのライブラリの新機能のいくつかに触れていこうと思います。一般提供 (GA) 開始までにこれらのライブラリをお試しいただけるととてもうれしいです。お試しいただいた結果のフィードバックなどお寄せいただけると、泣いて喜びますので是非よろしくお願いいたします…！！

#新機能
##シークレットレス構成
Storage、Event Hubs、Service Bus の各拡張機能は、Azure Active Directory を介したシークレットレス構成をサポートするようになりました。これにより、関数アプリは、設定の一部として接続文字列を提供することなく、これらのサービスで認証が可能になります。
ここでは、ポータル内の関数アプリのアプリケーション [設定] セクションで、各ライブラリに対してどのような設定を行うかを説明します。関数アプリのアプリケーション設定の詳細については、[以下](https://docs.microsoft.com/ja-jp/azure/azure-functions/functions-how-to-use-azure-function-app-settings?tabs=portal)をご覧ください。

https://docs.microsoft.com/ja-jp/azure/azure-functions/functions-how-to-use-azure-function-app-settings?tabs=portal

ローカル環境で実行する場合も、[local.settings.json](https://docs.microsoft.com/ja-jp/azure/azure-functions/functions-run-local?tabs=windows%2Ccsharp%2Cbash#local-settings-file) ファイルを修正することにより同様の設定が可能です。

https://docs.microsoft.com/ja-jp/azure/azure-functions/functions-run-local?tabs=windows%2Ccsharp%2Cbash#local-settings-file

なお、ローカル環境でシークレットレス設定を使用すると `local.settings.json` ファイルに接続文字列がないという旨の警告が表示されることがありますが、この点については拡張機能の一般提供開始前に修正される予定です。

###一般的な設定
ここで説明するすべての拡張機能では、`AzureWebJobsStorage` の設定で、汎用ストレージ アカウントを使用するように設定する必要があります。

|Name  |Value |
|---|---|---|
|AzureWebJobsStorage__accountName |{アカウント名} |

ローカル開発の場合は、`AzureWebJobsStorage` の値を `UseDevelopmentStorage=true` に設定することで、[Azurite エミュレータ](https://docs.microsoft.com/azure/storage/common/storage-use-azurite) を使用することができます。

https://docs.microsoft.com/ja-jp/azure/storage/common/storage-use-azurite

特に指定のない限り、各構成は [DefaultAzureCredential](https://docs.microsoft.com/ja-jp/dotnet/api/overview/azure/identity-readme#defaultazurecredential) で動作します。これは、関数アプリ（またはローカルで実行している場合はローカル環境）が、DefaultAzureCredential で使用される認証メカニズムの少なくとも 1 つを用いて、対応するストレージ アカウント、Event Hubs 名前空間、または Service Bus 名前空間で認証できる必要があるということを意味します。

https://docs.microsoft.com/ja-jp/dotnet/api/overview/azure/identity-readme#defaultazurecredential

##ストレージ
###Blob

|Name  |Value |
|---|---|---|
|MyConnection__blobServiceUri|https://{アカウント名}.blob.core.windows.net|

以下は、指定した blob が変更されるたびに実行されるシンプルな関数の例です。

```diff_c_sharp
[FunctionName("BlobTriggerFunction")]
public static void Run(
    [BlobTrigger("sample-container/sample-blob", Connection = "MyConnection")]
    Stream blobStream,
    ILogger logger)
{
    using var blobStreamReader = new StreamReader(blobStream);
    logger.LogInformation($"Blob sample-container/sample-blob has been updated with content: {blobStreamReader.ReadToEnd()}");
}
```

###キュー
|Name  |Value |
|---|---|---|
|MyConnection__queueServiceUri|https://{アカウント名}.queue.core.windows.net|

以下は、指定されたキューにメッセージが配信されるたびに実行されるシンプルな関数の例となります。

```diff_c_sharp
[FunctionName("QueueTriggerFunction")]
public static void Run(
    [QueueTrigger("sample-queue", Connection = "MyConnection")] 
    string message,
    ILogger logger)
    {
        logger.LogInformation($"Received message from sample-queue, content={message}");
    }
```

##Event Hubs
|Name  |Value |
|---|---|---|
|MyConnection__fullyQualifiedNamespace|https://{アカウント名}.servicebus.windows.net|

以下は、指定された Event Hubs にイベントが配信されるたびに実行されるシンプルな関数の例となります。

```diff_c_sharp
[FunctionName("EventHubTriggerFunction")]
public static void Run(
    [EventHubTrigger("<event_hub_name>", Connection = "MyConnection")]
    EventData eventData,
    ILogger logger)
{
    logger.LogInformation($"C# function triggered to process a message: {eventData.EventBody}");
    logger.LogInformation($"EnqueuedTime={eventData.EnqueuedTime}");
}
```

##Service Bus 
|Name  |Value |
|---|---|---|
|MyConnection__fullyQualifiedNamespace|https://{アカウント名}.servicebus.windows.net|

以下は、指定されたキューにメッセージが配信されるたびに実行されるシンプルな関数の例になります。

```diff_c_sharp
[FunctionName("ServiceBusTriggerFunction")]
public static void Run(
    [ServiceBusTrigger("<queue_name>", Connection = "MyConnection")]
    ServiceBusReceivedMessage message,
    ILogger logger)
{
    logger.LogInformation($"C# function triggered to process a message: {message.Body}");
    logger.LogInformation($"EnqueuedTime={message.EnqueuedTime}");
}
```

##より詳細な機能を構成する
これまで触れてきた例では、拡張機能に [DefaultAzureCredential](https://docs.microsoft.com/dotnet/api/overview/azure/identity-readme#defaultazurecredential) を用いて、サービスとの認証を試行していましたが、もちろん、より詳細に認証を設定することも可能です。以下、Blob Storage を例に、Storage Queues、Event Hubs、Service Bus でも同様の設定を行う例です。[ManagedIdentityCredential](https://docs.microsoft.com/dotnet/api/azure.identity.managedidentitycredential?view=azure-dotnet) を使用するマネージド ID を使って設定するには、次のようにします。

https://docs.microsoft.com/dotnet/api/overview/azure/identity-readme#defaultazurecredential

https://docs.microsoft.com/dotnet/api/azure.identity.managedidentitycredential?view=azure-dotnet

|Name  |Value |
|---|---|---|
|MyConnection__blobServiceUri|https://{account name}.blob.core.windows.net|
|MyConnection__credential|マネージド ID|
|MyConnection__clientId|{myClientId}|

[ClientSecretCredential](https://docs.microsoft.com/dotnet/api/azure.identity.clientsecretcredential?view=azure-dotnet) タイプを使用するクライアント シークレット資格情報を使用して設定するには、次のようにします。

|Name  |Value |
|---|---|---|
|MyConnection__blobServiceUri|https://{account name}.blob.core.windows.net|
|MyConnection__tenantId|{myTenantId}|
|MyConnection__clientId|{myClientId}|
|MyConnection__clientSecret|{myClientSecret}|

https://docs.microsoft.com/dotnet/api/azure.identity.clientsecretcredential?view=azure-dotnet

最後に、クライアント証明書を使用して設定するには、[ClientSecretCredential](https://docs.microsoft.com/ja-jp/dotnet/api/azure.identity.clientcertificatecredential?view=azure-dotnet) タイプを使用するようにします。

|Name  |Value |
|---|---|---|
|MyConnection__blobServiceUri|https://{account name}.blob.core.windows.net|
|MyConnection__tenantId|{myTenantId}|
|MyConnection__clientId|{myClientId}|
|MyConnection__certificate|{myCertificate}|

https://docs.microsoft.com/ja-jp/dotnet/api/azure.identity.clientcertificatecredential?view=azure-dotnet

##CloudEvent バインディング
C# で関数を記述する際に、[CloudEvents V1 スキーマ](https://github.com/cloudevents/spec/blob/v1.0.1/spec.md)に準拠した新しい[CloudEvent](https://docs.microsoft.com/ja-jp/dotnet/api/azure.messaging.cloudevent?view=azure-dotnet) タイプを、トリガーと出力の両方の関数に使用することが可能になりました。

https://docs.microsoft.com/ja-jp/dotnet/api/azure.messaging.cloudevent?view=azure-dotnet

https://github.com/cloudevents/spec/blob/v1.0.1/spec.md

トリガー : 

```diff_c_sharp
[FunctionName("CloudEventTriggerFunction")]
public static void Run(
    [EventGridTrigger]
    CloudEvent e,
    ILogger logger,)
{
    logger.LogInformation("Event received {type} {subject}", e.Type, e.Subject);
}
```

出力 :

```diff_c_sharp
[FunctionName("CloudEventBindingFunction")]
public static async Task<IActionResult> RunAsync(
    [HttpTrigger(AuthorizationLevel.Anonymous, "get", "post", Route = null)]
    HttpRequest req,
    [EventGrid(TopicEndpointUri = "EventGridEndpoint", TopicKeySetting = "EventGridKey")]
    IAsyncCollector<CloudEvent> eventCollector)
{
    CloudEvent e = new CloudEvent("IncomingRequest", "IncomingRequest", await req.ReadAsStringAsync());
    await eventCollector.AddAsync(e);
    return new OkResult();
}
```

#むすび
Azure Functions は、Azure の中核となるサーバーレス製品の 1 つで、アプリケーションを大幅に簡素化することができます。最新のパッケージ セットは、Azure Functions との統合を迅速かつ容易にすすめ、アプリケーションを迅速に立ち上げられるようにするための我々の取り組みの一環です。

この記事で紹介した拡張機能の詳細については、各サービスの README ファイルをご覧くださいませ。(訳注 : 先の README は英語です）

* [Storage](https://github.com/Azure/azure-sdk-for-net/blob/master/sdk/storage/Microsoft.Azure.WebJobs.Extensions.Storage/README.md)
* [Event Hubs](https://github.com/Azure/azure-sdk-for-net/blob/master/sdk/eventhub/Microsoft.Azure.WebJobs.Extensions.EventHubs/README.md)
* [Service Bus](https://github.com/Azure/azure-sdk-for-net/blob/master/sdk/servicebus/Microsoft.Azure.WebJobs.Extensions.ServiceBus/README.md)
* [Event Grid](https://github.com/Azure/azure-sdk-for-net/blob/master/sdk/eventgrid/Microsoft.Azure.WebJobs.Extensions.EventGrid/README.md)

#Azure SDK の Blog 寄稿募集してます！
この記事を読んでいただきありがとうございます。何か新しい学びの一助になったらいいなと願っています。また、私たちは、Azure SDK ブログの記事の寄稿を歓迎しております。[azsdkblog@microsoft.com](azsdkblog@microsoft.com) までご連絡いただければ、ゲストブロガーとして設定させていただきます。
(訳注 : おそらく英語で…だとおもいますがぜひ！我こそは！という方はよろしくお願いします。)

#Azure SDK のリンクたち
* Azure SDK Website: [aka.ms/azsdk](https://aka.ms/azsdk)
* Azure SDK Intro (3 minute video): [aka.ms/azsdk/intro](https://aka.ms/azsdk/intro)
* Azure SDK Intro Deck (PowerPoint deck): [aka.ms/azsdk/intro/deck](https://aka.ms/azsdk/intro/deck)
* Azure SDK Releases: [aka.ms/azsdk/releases](https://aka.ms/azsdk/releases)
* Azure SDK Blog: [aka.ms/azsdk/blog](https://aka.ms/azsdk/blog)
* Azure SDK Twitter: [twitter.com/AzureSDK](https://twitter.com/AzureSDK)
* Azure SDK Design Guidelines: [aka.ms/azsdk/guide](https://aka.ms/azsdk/guide)
* Azure SDKs & Tools: [azure.microsoft.com/downloads](https://azure.microsoft.com/downloads)
* Azure SDK Central Repository: [github.com/azure/azure-sdk](https://github.com/azure/azure-sdk)
* Azure SDK for .NET: [github.com/azure/azure-sdk-for-net](https://github.com/azure/azure-sdk-for-net)
* Azure SDK for Java: [github.com/azure/azure-sdk-for-java](https://github.com/azure/azure-sdk-for-java)
* Azure SDK for Python: [github.com/azure/azure-sdk-for-python](https://github.com/azure/azure-sdk-for-python)
* Azure SDK for JavaScript/TypeScript: [github.com/azure/azure-sdk-for-js](https://github.com/azure/azure-sdk-for-js)
* Azure SDK for Android: [github.com/Azure/azure-sdk-for-android](http://github.com/Azure/azure-sdk-for-android)
* Azure SDK for iOS: [github.com/Azure/azure-sdk-for-ios](https://github.com/Azure/azure-sdk-for-ios)
* Azure SDK for Go: [github.com/Azure/azure-sdk-for-go](https://github.com/Azure/azure-sdk-for-go)
* Azure SDK for C: [github.com/Azure/azure-sdk-for-c](https://github.com/Azure/azure-sdk-for-c)
* Azure SDK for C++: [github.com/Azure/azure-sdk-for-cpp](https://github.com/Azure/azure-sdk-for-cpp)

----------------------

以上、[Josh Love](https://devblogs.microsoft.com/azure-sdk/author/jolov/) さんからでした。

それでは皆さん、ごきげんよう。