チュートリアル: Event Grid を使用して、アップロードされたイメージのサイズ変更を自動化するTutorial: Automate resizing uploaded images using Event Grid

Azure Event Grid は、クラウドのイベント処理サービスです。Azure Event Grid is an eventing service for the cloud. Event Grid を使うと、Azure サービスまたはサード パーティのリソースによって生成されるイベントのサブスクリプションを作成できます。Event Grid enables you to create subscriptions to events raised by Azure services or third-party resources.

このチュートリアルは、ストレージ チュートリアル シリーズの第 2 部です。This tutorial is part two of a series of Storage tutorials. 前のストレージ チュートリアルに、Azure Event Grid と Azure Functions を使うサーバーレスの自動サムネイル生成機能を追加します。It extends the previous Storage tutorial to add serverless automatic thumbnail generation using Azure Event Grid and Azure Functions. Event Grid により、Azure FunctionsAzure Blob Storage のイベントに応答して、アップロードされたイメージのサムネイルを生成できます。Event Grid enables Azure Functions to respond to Azure Blob storage events and generate thumbnails of uploaded images. Blob Storage の作成イベントに対して、イベント サブスクリプションが作成されます。An event subscription is created against the Blob storage create event. 特定の Blob Storage コンテナーに BLOB が追加されると、関数エンドポイントが呼び出されます。When a blob is added to a specific Blob storage container, a function endpoint is called. Event Grid から関数バインドに渡されたデータが、BLOB へのアクセスとサムネイル イメージの生成に使われます。Data passed to the function binding from Event Grid is used to access the blob and generate the thumbnail image.

既存のイメージ アップロード アプリにサイズ変更機能を追加するには、Azure CLI と Azure Portal を使います。You use the Azure CLI and the Azure portal to add the resizing functionality to an existing image upload app.

このチュートリアルでは、以下の内容を学習します。In this tutorial, you learn how to:

  • 一般 Azure ストレージ アカウントを作成しますCreate a general Azure Storage account
  • Azure Functions を使ってサーバーレス コードをデプロイしますDeploy serverless code using Azure Functions
  • Event Grid で Blob Storage のイベント サブスクリプションを作成しますCreate a Blob storage event subscription in Event Grid

前提条件Prerequisites

注意

この記事は、新しい Azure PowerShell Az モジュールを使用するために更新されました。This article has been updated to use the new Azure PowerShell Az module. AzureRM モジュールはまだ使用でき、少なくとも 2020 年 12 月までは引き続きバグ修正が行われます。You can still use the AzureRM module, which will continue to receive bug fixes until at least December 2020. Az モジュールと AzureRM の互換性の詳細については、「Introducing the new Azure PowerShell Az module (新しい Azure PowerShell Az モジュールの概要)」を参照してください。To learn more about the new Az module and AzureRM compatibility, see Introducing the new Azure PowerShell Az module. Az モジュールのインストール手順については、Azure PowerShell のインストールを参照してください。For Az module installation instructions, see Install Azure PowerShell.

このチュートリアルを完了するには、以下が必要です。To complete this tutorial:

前の Blob ストレージのチュートリアル「Azure Storage を使用してクラウドに画像データをアップロードする」を完了している必要があります。You must have completed the previous Blob storage tutorial: Upload image data in the cloud with Azure Storage.

Azure サブスクリプションをお持ちでない場合は、開始する前に無料アカウントを作成してください。If you don't have an Azure subscription, create a free account before you begin.

以前サブスクリプションに Event Grid リソース プロバイダーを登録していない場合は、それが登録されるようにします。If you've not previously registered the Event Grid resource provider in your subscription, make sure it's registered.

az provider register --namespace Microsoft.EventGrid

Azure Cloud Shell を使用するUse Azure Cloud Shell

Azure では、ブラウザーを介して使用できる対話型のシェル環境、Azure Cloud Shell がホストされています。Azure hosts Azure Cloud Shell, an interactive shell environment that you can use through your browser. Cloud Shell では、bashPowerShell のいずれかを使用して Azure サービスを操作できます。Cloud Shell lets you use either bash or PowerShell to work with Azure services. ローカル環境に何もインストールしなくても、Cloud Shell にプレインストールされているコマンドを使用して、この記事のコードを実行できます。You can use the Cloud Shell pre-installed commands to run the code in this article without having to install anything on your local environment.

Azure Cloud Shell を起動するには:To launch Azure Cloud Shell:

オプションOption 例とリンクExample/Link
コード ブロックの右上隅にある [使ってみる] を選択します。Select Try It in the upper-right corner of a code block. [試してみる] を選択しても、コードは Cloud Shell に自動的にコピーされません。Selecting Try It doesn't automatically copy the code to Cloud Shell. Azure Cloud Shell の [使ってみる] の例
https://shell.azure.com に移動するか、 [Cloud Shell を起動する] ボタンを選択して、ブラウザーで Cloud Shell を開きます。Go to https://shell.azure.com or select the Launch Cloud Shell button to open Cloud Shell in your browser. 新しいウィンドウで Cloud Shell を起動するLaunch Cloud Shell in a new window
Azure portal の右上にあるメニュー バーの [Cloud Shell] ボタンを選択します。Select the Cloud Shell button on the top-right menu bar in the Azure portal. Azure Portal の [Cloud Shell] ボタン

Azure Cloud Shell でこの記事のコードを実行するには:To run the code in this article in Azure Cloud Shell:

  1. Cloud Shell を起動します。Launch Cloud Shell.
  2. [コピー] ボタンを選択して、コード ブロックをコードにコピーします。Select the Copy button on a code block to copy the code.
  3. Windows と Linux では Ctrl + Shift + V キー、macOS では Cmd + Shift + V キーを使用して、コードを Cloud Shell セッションに貼り付けます。Paste the code into the Cloud Shell session with Ctrl+Shift+V on Windows and Linux, or Cmd+Shift+V on macOS.
  4. Enter キーを押して、コードを実行します。Press Enter to run the code.

CLI をローカルにインストールして使用する場合、このチュートリアルでは、Azure CLI バージョン 2.0.14 以降が必要です。If you choose to install and use the CLI locally, this tutorial requires the Azure CLI version 2.0.14 or later. バージョンを確認するには、az --version を実行します。Run az --version to find the version. インストールまたはアップグレードする必要がある場合は、Azure CLI のインストールに関するページを参照してください。If you need to install or upgrade, see Install Azure CLI.

Cloud Shell を使用していない場合は、先に az login でサインインする必要があります。If you are not using Cloud Shell, you must first sign in using az login.

Azure Storage アカウントの作成Create an Azure Storage account

Azure Functions には、一般的なストレージ アカウントが必要です。Azure Functions requires a general storage account. 前のチュートリアルで作成した BLOB ストレージ アカウントに加え、az storage account create コマンドを使って、リソース グループ内に一般的なストレージ アカウントを別に作成します。In addition to the Blob storage account you created in the previous tutorial, create a separate general storage account in the resource group by using the az storage account create command. ストレージ アカウント名の長さは 3 ~ 24 文字で、数字と小文字のみを使用できます。Storage account names must be between 3 and 24 characters in length and may contain numbers and lowercase letters only.

  1. 前のチュートリアルで作成したリソース グループの名前を保持する変数を設定します。Set a variable to hold the name of the resource group that you created in the previous tutorial.

    resourceGroupName=myResourceGroup
    
  2. Azure 関数が必要とする新しいストレージ アカウントの名前の変数を設定します。Set a variable for the name of the new storage account that Azure Functions requires.

    functionstorage=<name of the storage account to be used by the function>
    
  3. Azure 関数用のストレージ アカウントを作成します。Create the storage account for the Azure function.

    az storage account create --name $functionstorage --location southeastasia \
    --resource-group $resourceGroupName --sku Standard_LRS --kind storage
    

Function App を作成するCreate a function app

関数の実行をホストするには Function App が必要です。You must have a function app to host the execution of your function. Function App は、関数コードのサーバーレス実行の環境を提供します。The function app provides an environment for serverless execution of your function code. Function App の作成には、az functionapp create コマンドを使用します。Create a function app by using the az functionapp create command.

以下のコマンドには、実際に使用する一意の関数アプリ名を使用してください。In the following command, provide your own unique function app name. この関数アプリ名は、関数アプリの既定の DNS ドメインとして使用されます。そのため、名前は Azure のすべてのアプリ間で一意である必要があります。The function app name is used as the default DNS domain for the function app, and so the name needs to be unique across all apps in Azure.

  1. 作成する関数アプリの名前を指定します。Specify a name for the function app that's to be created.

    functionapp=<name of the function app>
    
  2. Azure 関数を作成します。Create the Azure function.

    az functionapp create --name $functionapp --storage-account $functionstorage \
    --resource-group $resourceGroupName --consumption-plan-location southeastasia
    

ここで、前のチュートリアルで作成した BLOB ストレージ アカウントに接続するように関数アプリを構成する必要があります。Now you must configure the function app to connect to the Blob storage account you created in the previous tutorial.

Function App を構成するConfigure the function app

関数には、BLOB ストレージ アカウントの資格情報が必要となります。az functionapp config appsettings set コマンドを使用して、関数アプリのアプリケーション設定にこの資格情報を追加します。The function needs credentials for the Blob storage account, which are added to the application settings of the function app using the az functionapp config appsettings set command.

blobStorageAccount=<name of the Blob storage account you created in the previous tutorial>
storageConnectionString=$(az storage account show-connection-string --resource-group $resourceGroupName \
--name $blobStorageAccount --query connectionString --output tsv)

az functionapp config appsettings set --name $functionapp --resource-group $resourceGroupName \
--settings AzureWebJobsStorage=$storageConnectionString THUMBNAIL_CONTAINER_NAME=thumbnails \
THUMBNAIL_WIDTH=100 FUNCTIONS_EXTENSION_VERSION=~2

FUNCTIONS_EXTENSION_VERSION=~2 設定によって、関数アプリは Azure Functions ランタイムのバージョン 2.x で動作するようになります。The FUNCTIONS_EXTENSION_VERSION=~2 setting makes the function app run on version 2.x of the Azure Functions runtime.

この Function App に関数コード プロジェクトをデプロイできるようになります。You can now deploy a function code project to this function app.

関数コードをデプロイするDeploy the function code

C# のサイズ変更関数のサンプルは、GitHub で入手できます。The sample C# resize function is available on GitHub. az functionapp deployment source config コマンドを使って、このコード プロジェクトを関数アプリにデプロイします。Deploy this code project to the function app by using the az functionapp deployment source config command.

az functionapp deployment source config --name $functionapp --resource-group $resourceGroupName --branch master --manual-integration --repo-url https://github.com/Azure-Samples/function-image-upload-resize

イメージのサイズ変更関数は、Event Grid サービスからその関数に送信される HTTP 要求によってトリガーされます。The image resize function is triggered by HTTP requests sent to it from the Event Grid service. Event Grid には、イベントのサブスクリプションを作成して関数の URL でこれらの通知を取得することを指示します。You tell Event Grid that you want to get these notifications at your function's URL by creating an event subscription. このチュートリアルでは、BLOB によって作成されたイベントをサブスクライブします。For this tutorial you subscribe to blob-created events.

Event Grid の通知から関数に渡されるデータには、BLOB の URL が含まれます。The data passed to the function from the Event Grid notification includes the URL of the blob. その URL は、Blob Storage からアップロードされたイメージを取得するために入力バインドに渡されます。That URL is in turn passed to the input binding to obtain the uploaded image from Blob storage. 関数はサムネイル イメージを生成し、結果のストリームを Blob Storage 内の別のコンテナーに書き込みます。The function generates a thumbnail image and writes the resulting stream to a separate container in Blob storage.

このプロジェクトでは、トリガーの種類として EventGridTrigger が使用されています。This project uses EventGridTrigger for the trigger type. 汎用の HTTP トリガーよりも Event Grid トリガーを使用することをお勧めします。Using the Event Grid trigger is recommended over generic HTTP triggers. Event Grid では、Event Grid 関数トリガーが自動的に検証されます。Event Grid automatically validates Event Grid Function triggers. 汎用 HTTP トリガーの場合は、検証応答を実装する必要があります。With generic HTTP triggers, you must implement the validation response.

この関数の詳細については、function.json ファイルと run.csx ファイルを参照してください。To learn more about this function, see the function.json and run.csx files.

関数プロジェクトのコードは、パブリック サンプル リポジトリから直接デプロイされます。The function project code is deployed directly from the public sample repository. Azure Functions のデプロイ オプションについて詳しくは、「Azure Functions の継続的なデプロイ」をご覧ください。To learn more about deployment options for Azure Functions, see Continuous deployment for Azure Functions.

イベント サブスクリプションの作成Create an event subscription

イベント サブスクリプションは、どのプロバイダー生成イベントを特定のエンドポイントに送信するかを示します。An event subscription indicates which provider-generated events you want sent to a specific endpoint. この場合、エンドポイントは関数によって公開されます。In this case, the endpoint is exposed by your function. Azure Portal で関数に通知を送信するイベント サブスクリプションを作成するには、次の手順に従います。Use the following steps to create an event subscription that sends notifications to your function in the Azure portal:

  1. Azure portal の左側のメニューで [すべてのサービス] を選択し、[Function App] を選択します。In the Azure portal, select All Services on the left menu, and then select Function Apps.

    Azure Portal で Function App を参照する

  2. 目的の関数アプリを展開して、Thumbnail 関数を選択し、[Event Grid サブスクリプションの追加] を選択します。Expand your function app, choose the Thumbnail function, and then select Add Event Grid subscription.

    Azure Portal で Function App を参照する

  3. 次の表で指定されているようにイベント サブスクリプションを設定します。Use the event subscription settings as specified in the table.

    Azure Portal で関数からイベント サブスクリプションを作成する

    SettingSetting 推奨値Suggested value DescriptionDescription
    NameName imageresizersubimageresizersub 新しいイベント サブスクリプションを示す名前。Name that identifies your new event subscription.
    トピックの種類Topic type ストレージ アカウントStorage accounts ストレージ アカウント イベント プロバイダーを選びます。Choose the Storage account event provider.
    サブスクリプションSubscription お使いの Azure サブスクリプションYour Azure subscription 既定では、現在の Azure サブスクリプションが選択されています。By default, your current Azure subscription is selected.
    リソース グループResource group myResourceGroupmyResourceGroup [既存のものを使用] を選び、このチュートリアルで使っているリソース グループを選びます。Select Use existing and choose the resource group you have been using in this tutorial.
    リソースResource お使いの BLOB ストレージ アカウントYour Blob storage account 作成した Blob Storage アカウントを選びます。Choose the Blob storage account you created.
    イベントの種類Event types Blob created (作成された BLOB)Blob created [Blob created](作成された BLOB) 以外のすべての種類をオフにします。Uncheck all types other than Blob created. Microsoft.Storage.BlobCreated のイベントの種類のみが関数に渡されます。Only event types of Microsoft.Storage.BlobCreated are passed to the function.
    サブスクライバーの種類Subscriber type 自動生成autogenerated Web hook として事前定義されています。Pre-defined as Web Hook.
    サブスクライバー エンドポイントSubscriber endpoint 自動生成autogenerated 自動的に生成されるエンドポイントの URL を使います。Use the endpoint URL that is generated for you.
  4. [フィルター] タブに切り替えて、次の手順を実行します。Switch to the Filter tab, and do the following actions:

    1. [サブジェクト フィルタリングを有効にする] オプションを選択します。Select Enable subject filtering option.

    2. [次で始まるサブジェクト] には、「/blobServices/default/containers/images/blobs/」と入力します。For Subject begins with, enter the following value : /blobServices/default/containers/images/blobs/.

      イベント サブスクリプションのフィルターを指定する

  5. [作成] を選択して、イベント サブスクリプションを追加します。Select Create to add the event subscription. これにより、BLOB が images コンテナーに追加されたときに Thumbnail 関数をトリガーするイベント サブスクリプションが作成されます。This creates an event subscription that triggers Thumbnail function when a blob is added to the images container. この関数により、イメージはサイズが変更されて、thumbnails コンテナーに追加されます。The function resizes the images and adds them to the thumbnails container.

バックエンド サービスの構成が済んだので、サンプル Web アプリでイメージ サイズ変更の機能をテストします。Now that the backend services are configured, you test the image resize functionality in the sample web app.

サンプル アプリをテストするTest the sample app

Web アプリでイメージのサイズ変更をテストするには、公開したアプリの URL を参照します。To test image resizing in the web app, browse to the URL of your published app. Web アプリの既定の URL は、https://<web_app>.azurewebsites.net です。The default URL of the web app is https://<web_app>.azurewebsites.net.

[Upload photos] 領域をクリックし、ファイルを選んでアップロードします。Click the Upload photos region to select and upload a file. この領域に写真をドラッグしてもかまいません。You can also drag a photo to this region.

アップロードされたイメージが消えた後、アップロードされたイメージのコピーが [Generated thumbnails] 領域に表示されることを確認します。Notice that after the uploaded image disappears, a copy of the uploaded image is displayed in the Generated thumbnails carousel. この画像は、関数によってサイズが変更され、thumbnails コンテナーに追加された後、Web クライアントによってダウンロードされたものです。This image was resized by the function, added to the thumbnails container, and downloaded by the web client.

ブラウザーでの発行された Web アプリ