カスタム コンテナーを使用して Linux で関数を作成するCreate a function on Linux using a custom container

このチュートリアルでは、コードを作成し、Linux の基本イメージを使用したカスタム Docker コンテナーとして Azure Functions にデプロイします。In this tutorial, you create and deploy your code to Azure Functions as a custom Docker container using a Linux base image. カスタム イメージを使用するのは通常、特定の言語バージョン、特定の依存関係、または組み込みイメージで提供されない構成が関数に必要になるときです。You typically use a custom image when your functions require a specific language version or have a specific dependency or configuration that isn't provided by the built-in image.

Linux でホストされる初めての関数の作成に関するページで説明されている既定の Azure App Service コンテナーを使用することもできます。You can also use a default Azure App Service container as described on Create your first function hosted on Linux. Azure Functions でサポートされている基本イメージについては、Azure Functions 基本イメージ リポジトリを参照してください。Supported base images for Azure Functions are found in the Azure Functions base images repo.

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

  • Azure Functions Core Tools を使用して関数アプリと Dockerfile を作成します。Create a function app and Dockerfile using the Azure Functions Core Tools.
  • Docker を使用してカスタム イメージをビルドします。Build a custom image using Docker.
  • カスタム イメージをコンテナー レジストリに発行します。Publish a custom image to a container registry.
  • 関数アプリ用の関連リソースを Azure に作成します。Create supporting resources in Azure for the function app
  • Docker Hub から Function App をデプロイします。Deploy a function app from Docker Hub.
  • Function App にアプリケーション設定を追加します。Add application settings to the function app.
  • 継続的デプロイを有効にします。Enable continuous deployment.
  • コンテナーへの SSH 接続を有効にします。Enable SSH connections to the container.
  • Queue storage の出力バインドを追加します。Add a Queue storage output binding.

このチュートリアルは、Windows、macOS、または Linux が動作している任意のコンピューターで実行できます。You can follow this tutorial on any computer running Windows, macOS, or Linux. このチュートリアルを完了すると、ご利用の Azure アカウントに数ドルのコストが発生します。Completing the tutorial will incur costs of a few US dollars in your Azure account.

ローカル環境を構成するConfigure your local environment

開始する前に、次の項目を用意する必要があります。Before you begin, you must have the following:

  • Node.js アクティブ LTS およびメンテナンス LTS バージョン (8.11.1 および 10.14.1 を推奨)。Node.js, Active LTS and Maintenance LTS versions (8.11.1 and 10.14.1 recommended).

重要

このクイックスタートを行うには、JAVA_HOME 環境変数を JDK のインストール場所に設定する必要があります。The JAVA_HOME environment variable must be set to the install location of the JDK to complete this quickstart.

前提条件のチェックPrerequisite check

  • ターミナルまたはコマンド ウィンドウで func --version を実行して、Azure Functions Core Tools のバージョンが 2.7.1846 以降であることを確認します。In a terminal or command window, run func --version to check that the Azure Functions Core Tools are version 2.7.1846 or later.

  • az --version を実行して、Azure CLI バージョンが 2.0.76 以降であることを確認します。Run az --version to check that the Azure CLI version is 2.0.76 or later.

  • az login を実行して Azure にサインインし、アクティブなサブスクリプションを確認します。Run az login to sign in to Azure and verify an active subscription.

  • python --version (Linux と macOS の場合) または py --version (Windows の場合) を実行して、使用している Python のバージョンが 3.8.x、3.7.x、または 3.6.x であることを確認します。Run python --version (Linux/MacOS) or py --version (Windows) to check your Python version reports 3.8.x, 3.7.x or 3.6.x.
  • docker login を実行して Docker にサインインします。Run docker login to sign in to Docker. Docker が動作していない場合、このコマンドは失敗します。その場合は、Docker を起動してコマンドを再試行してください。This command fails if Docker isn't running, in which case start docker and retry the command.

仮想環境を作成してアクティブにするCreate and activate a virtual environment

適切なフォルダーで次のコマンドを実行し、.venv という名前の仮想環境を作成してアクティブにします。In a suitable folder, run the following commands to create and activate a virtual environment named .venv. 必ず、Azure Functions でサポートされている Python 3.8、3.7、または 3.6 を使用してください。Be sure to use Python 3.8, 3.7 or 3.6, which are supported by Azure Functions.

python -m venv .venv
source .venv/bin/activate

お使いの Linux ディストリビューションに Python の venv パッケージがインストールされていなかった場合は、次のコマンドを実行します。If Python didn't install the venv package on your Linux distribution, run the following command:

sudo apt-get install python3-venv

以降のコマンドはすべて、このアクティブ化された仮想環境で実行しますYou run all subsequent commands in this activated virtual environment.

ローカル関数プロジェクトを作成してテストするCreate and test the local functions project

ターミナルまたはコマンド プロンプトで、自分が選択した言語に合わせて次のコマンドを実行し、LocalFunctionsProject という名前のフォルダーに関数アプリ プロジェクトを作成します。In a terminal or command prompt, run the following command for your chosen language to create a function app project in a folder named LocalFunctionsProject.

func init LocalFunctionsProject --worker-runtime dotnet --docker
func init LocalFunctionsProject --worker-runtime node --language javascript --docker
func init LocalFunctionsProject --worker-runtime powershell --docker
func init LocalFunctionsProject --worker-runtime python --docker
func init LocalFunctionsProject --worker-runtime node --language typescript --docker

空のフォルダーで次のコマンドを実行して、Maven アーキタイプから Functions プロジェクトを生成します。In an empty folder, run the following command to generate the Functions project from a Maven archetype.

mvn archetype:generate -DarchetypeGroupId=com.microsoft.azure -DarchetypeArtifactId=azure-functions-archetype -Ddocker

Maven により、デプロイ時にプロジェクトの生成を終了するための値の入力が求められます。Maven asks you for values needed to finish generating the project on deployment.
入力を求められたら、次の値を入力します。Provide the following values when prompted:

PromptPrompt Value 説明Description
groupIdgroupId com.fabrikam Java のパッケージ命名規則に従って、すべてのプロジェクトにわたって対象のプロジェクトを一意に識別する値。A value that uniquely identifies your project across all projects, following the package naming rules for Java.
artifactIdartifactId fabrikam-functions バージョン番号のない、jar の名前である値。A value that is the name of the jar, without a version number.
versionversion 1.0-SNAPSHOT 既定値を選択します。Choose the default value.
packagepackage com.fabrikam.functions 生成された関数コードの Java パッケージである値。A value that is the Java package for the generated function code. 既定値を使用します。Use the default.

Y」と入力するか、Enter キーを押して確認します。Type Y or press Enter to confirm.

Maven により、artifactId という名前の新しいフォルダーにプロジェクト ファイルが作成されます (この例では fabrikam-functions)。Maven creates the project files in a new folder with a name of artifactId, which in this example is fabrikam-functions.

--docker オプションによって、プロジェクトの Dockerfile が生成されます。これにより、Azure Functions および選択されたランタイムで使用するための適切なカスタム コンテナーが定義されます。The --docker option generates a Dockerfile for the project, which defines a suitable custom container for use with Azure Functions and the selected runtime.

プロジェクト フォルダーに移動します。Navigate into the project folder:

cd LocalFunctionsProject
cd fabrikam-functions

次のコマンドを使用して、関数を自分のプロジェクトに追加します。ここで、--name 引数は関数の一意の名前で、--template 引数は関数のトリガーを指定するものです。Add a function to your project by using the following command, where the --name argument is the unique name of your function and the --template argument specifies the function's trigger. func new によって、関数と同じ名前のサブフォルダーが作成されます。ここには、プロジェクト用に選択した言語に適したコード ファイルと、function.json という名前の構成ファイルが含まれます。func new create a subfolder matching the function name that contains a code file appropriate to the project's chosen language and a configuration file named function.json.

func new --name HttpExample --template "HTTP trigger"

関数をローカルでテストするために、プロジェクト フォルダーのルートでローカルの Azure Functions ランタイム ホストを起動します。To test the function locally, start the local Azure Functions runtime host in the root of the project folder:

func start --build  
func start  
npm install
npm start
mvn clean package  
mvn azure-functions:run

出力に HttpExample エンドポイントが表示されたら、http://localhost:7071/api/HttpExample?name=Functions に移動します。Once you see the HttpExample endpoint appear in the output, navigate to http://localhost:7071/api/HttpExample?name=Functions. name クエリ パラメーターに指定された値、Functions をエコーバックする "hello" メッセージがブラウザーに表示されます。The browser should display a "hello" message that echoes back Functions, the value supplied to the name query parameter.

Ctrl - C キーを使用してホストを停止します。Use Ctrl-C to stop the host.

コンテナー イメージを作成してローカルでテストするBuild the container image and test locally

(省略可) プロジェクト フォルダーのルートにある *Dockerfile" を確認します。(Optional) Examine the *Dockerfile" in the root of the project folder. Dockerfile には、Linux 上で関数アプリを実行するために必要な環境が記述されています。The Dockerfile describes the required environment to run the function app on Linux. Azure Functions でサポートされている基本イメージの詳細な一覧については、Azure Functions 基本イメージ ページを参照してください。The complete list of supported base images for Azure Functions can be found in the Azure Functions base image page.

ルート プロジェクト フォルダーで、docker build コマンドを実行し、名前に azurefunctionsimage、タグに v1.0.0 を指定します。In the root project folder, run the docker build command, and provide a name, azurefunctionsimage, and tag, v1.0.0. <DOCKER_ID> を Docker Hub アカウント ID で置換します。Replace <DOCKER_ID> with your Docker Hub account ID. このコマンドでは、コンテナーの Docker イメージがビルドされます。This command builds the Docker image for the container.

docker build --tag <DOCKER_ID>/azurefunctionsimage:v1.0.0 .

コマンドが完了すると、新しいコンテナーをローカルで実行できます。When the command completes, you can run the new container locally.

ビルドをテストするために、ローカル コンテナーで docker run コマンドを使用してイメージを実行します。この場合も、<DOCKER_ID は実際の Docker ID に置き換え、ポート引数 -p 8080:80 を追加してください。To test the build, run the image in a local container using the docker run command, replacing again <DOCKER_ID with your Docker ID and adding the ports argument, -p 8080:80:

docker run -p 8080:80 -it <docker_id>/azurefunctionsimage:v1.0.0

ローカル コンテナーでイメージが実行状態になったら、ブラウザーで http://localhost:8080 を開きます。以下に示したプレースホルダー画像が表示されます。Once the image is running in a local container, open a browser to http://localhost:8080, which should display the placeholder image shown below. この時点で画像が表示されるということは、Azure で実行されるときと同じように、ローカル コンテナーで関数が実行されているということです。つまり、function.json"authLevel": "function" プロパティで定義されたアクセス キーによって関数は保護されています。The image appears at this point because your function is running in the local container, as it would in Azure, which means that it's protected by an access key as defined in function.json with the "authLevel": "function" property. ただし、Azure の関数アプリに対してまだコンテナーが発行されていないため、そのキーはまだ利用できません。The container hasn't yet been published to a function app in Azure, however, so the key isn't yet available. ローカル コンテナーに対してテストしたい場合は、Docker を停止し、承認プロパティを "authLevel": "anonymous" に変更して、イメージをリビルドしてから Docker を再起動してください。If you want to test against the local container, stop docker, change the authorization property to "authLevel": "anonymous", rebuild the image, and restart docker. その後、function.json"authLevel": "function" をリセットします。Then reset "authLevel": "function" in function.json. 詳細については、承認キーに関するセクションを参照してください。For more information, see authorization keys.

コンテナーがローカルで実行されていることを示すプレースホルダー画像

ローカル コンテナーでイメージが実行状態になったら、http://localhost:8080/api/HttpExample?name=Functions に移動します。そこに、前と同じ "hello" メッセージが表示されます。Once the image is running in a local container, browse to http://localhost:8080/api/HttpExample?name=Functions, which should display the same "hello" message as before. Maven アーキタイプでは、匿名の承認を使用する、HTTP によってトリガーされる関数が生成されるため、関数はコンテナーで実行されている場合でも呼び出すことができます。Because the Maven archetype generates an HTTP triggered function that uses anonymous authorization, you can still call the function even though it's running in the container.

コンテナー内の関数アプリを確認したら、Ctrl + C キーで Docker を停止します。After you've verified the function app in the container, stop docker with Ctrl+C.

イメージを Docker Hub にプッシュするPush the image to Docker Hub

Docker Hub は、イメージのホストとしてイメージ サービスとコンテナー サービスを提供するコンテナー レジストリです。Docker Hub is a container registry that hosts images and provides image and container services. イメージを共有するには (Azure へのデプロイも含む)、それをレジストリにプッシュする必要があります。To share your image, which includes deploying to Azure, you must push it to a registry.

  1. まだ Docker にサインインしていない場合は、docker login コマンドでサインインします。<docker_id> は、実際の Docker ID に置き換えてください。If you haven't already signed in to Docker, do so with the docker login command, replacing <docker_id> with your Docker ID. このコマンドでは、ユーザー名とパスワードを入力するよう求められます。This command prompts you for your username and password. "ログインに成功しました" のメッセージで、サインインしていることを確認します。A "Login Succeeded" message confirms that you're signed in.

    docker login
    
  2. サインインしたら、docker push コマンドを使用して Docker Hub にイメージをプッシュします。ここでも、<docker_id> は実際の Docker ID に置き換えてください。After you've signed in, push the image to Docker Hub by using the docker push command, again replacing <docker_id> with your Docker ID.

    docker push <docker_id>/azurefunctionsimage:v1.0.0
    
  3. ネットワーク速度によっては、イメージの初回プッシュに数分かかる場合があります (それ以降に行う変更のプッシュは、はるかに短い時間で済みます)。Depending on your network speed, pushing the image the first time might take a few minutes (pushing subsequent changes is much faster). 待っている間、次のセクションに進んで、別のターミナルで Azure リソースを作成することができます。While you're waiting, you can proceed to the next section and create Azure resources in another terminal.

関数用の関連 Azure リソースを作成するCreate supporting Azure resources for your function

関数コードを Azure にデプロイするには、3 つのリソースを作成する必要があります。To deploy your function code to Azure, you need to create three resources:

  • リソース グループ。関連リソースの論理コンテナーです。A resource group, which is a logical container for related resources.
  • Azure ストレージ アカウント。プロジェクトについての状態とその他の情報を保持します。An Azure Storage account, which maintains state and other information about your projects.
  • Azure 関数アプリ。関数コードを実行するための環境となります。An Azure functions app, which provides the environment for executing your function code. 関数アプリは、ローカルの関数プロジェクトと対応関係にあります。これを使用すると、リソースの管理、デプロイ、共有を容易にするための論理ユニットとして関数をグループ化できます。A function app maps to your local function project and lets you group functions as a logical unit for easier management, deployment, and sharing of resources.

Azure CLI コマンドを使用して、これらの項目を作成しましょう。You use Azure CLI commands to create these items. それぞれのコマンドからは、完了時に JSON 出力が返されます。Each command provides JSON output upon completion.

  1. az login コマンドを使用して、Azure にサインインします。Sign in to Azure with the az login command:

    az login
    
  2. az group create コマンドを使用して、リソース グループを作成します。Create a resource group with the az group create command. 次の例では、AzureFunctionsContainers-rg という名前のリソース グループを westeurope リージョンに作成します。The following example creates a resource group named AzureFunctionsContainers-rg in the westeurope region. (リソース グループとリソースは通常、近くのリージョンに作成します。az account list-locations コマンドから返される利用可能なリージョンを使用してください。)(You generally create your resource group and resources in a region near you, using an available region from the az account list-locations command.)

    az group create --name AzureFunctionsContainers-rg --location westeurope
    

    注意

    Linux と Windows のアプリを同じリソース グループ内でホストすることはできません。You can't host Linux and Windows apps in the same resource group. Windows の関数アプリまたは Web アプリで AzureFunctionsContainers-rg という名前のリソース グループが存在する場合、別のリソース グループを使用する必要があります。If you have an existing resource group named AzureFunctionsContainers-rg with a Windows function app or web app, you must use a different resource group.

  3. az storage account create コマンドを使用して、リソース グループとリージョン内に汎用ストレージ アカウントを作成します。Create a general-purpose storage account in your resource group and region by using the az storage account create command. 次の例の <storage_name> は適宜、グローバルに一意の名前に置き換えてください。In the following example, replace <storage_name> with a globally unique name appropriate to you. 名前は 3 文字から 24 文字とし、小文字のみを使用する必要があります。Names must contain three to 24 characters numbers and lowercase letters only. Standard_LRS では、標準的な汎用アカウントを指定します。Standard_LRS specifies a typical general-purpose account.

    az storage account create --name <storage_name> --location westeurope --resource-group AzureFunctionsContainers-rg --sku Standard_LRS
    

    このチュートリアルでは、ストレージ アカウントに関して数セントの料金が発生します。The storage account incurs only a few USD cents for this tutorial.

  4. コマンドを使用して、Azure Functions 用の Premium プランを myPremiumPlan という名前で作成します。価格レベルは Elastic Premium 1 (--sku EP1)、リージョンは西ヨーロッパ (-location westeurope) または最寄りのリージョン、作成先は Linux コンテナー (--is-linux) とします。Use the command to create a Premium plan for Azure Functions named myPremiumPlan in the Elastic Premium 1 pricing tier (--sku EP1), in the West Europe region (-location westeurope, or use a suitable region near you), and in a Linux container (--is-linux).

    az functionapp plan create --resource-group AzureFunctionsContainers-rg --name myPremiumPlan --location westeurope --number-of-workers 1 --sku EP1 --is-linux
    

    カスタム関数コンテナーの Linux ホスティングは、専用 (App Service) プランおよび Premium プランでサポートされています。Linux hosting for custom functions containers are supported on Dedicated (App Service) plans and Premium plans. ここでは、必要に応じてスケーリングできる Premium プランを使用します。We use the Premium plan here, which can scale as needed. ホスティングについて詳しくは、「Azure Functions のホスティング プランの比較」をご覧ください。To learn more about hosting, see Azure Functions hosting plans comparison. コストを計算するには、Functions の価格に関するページを参照してください。To calculate costs, see the Functions pricing page.

    また、このコマンドを実行すると、関連する Azure Application Insights インスタンスが同じリソース グループにプロビジョニングされます。このインスタンスを使用することで、関数アプリを監視したりログを確認したりすることができます。The command also provisions an associated Azure Application Insights instance in the same resource group, with which you can monitor your function app and view logs. 詳しくは、「Azure Functions を監視する」をご覧ください。For more information, see Monitor Azure Functions. このインスタンスは、アクティブにするまでコストが発生しません。The instance incurs no costs until you activate it.

イメージを使用して Azure 上の関数アプリを作成、構成するCreate and configure a function app on Azure with the image

Azure 上の関数アプリでは、ホスティング プランで関数の実行を管理します。A function app on Azure manages the execution of your functions in your hosting plan. このセクションでは、前のセクションの Azure リソースを使用して、Docker Hub 上のイメージから関数アプリを作成し、Azure Storage への接続文字列を使用してそれを構成します。In this section, you use the Azure resources from the previous section to create a function app from an image on Docker Hub and configure it with a connection string to Azure Storage.

  1. az functionapp create コマンドを使用して関数アプリを作成します。Create the Functions app using the az functionapp create command. 次の例の <storage_name> は、前のセクションで使用したストレージ アカウントの名前に置き換えてください。In the following example, replace <storage_name> with the name you used in the previous section for the storage account. また、<app_name> は適宜グローバルに一意の名前に、<docker_id> は実際の Docker ID に置き換えます。Also replace <app_name> with a globally unique name appropriate to you, and <docker_id> with your Docker ID.

    az functionapp create --name <app_name> --storage-account <storage_name> --resource-group AzureFunctionsContainers-rg --plan myPremiumPlan --deployment-container-image-name <docker_id>/azurefunctionsimage:v1.0.0
    

    deployment-container-image-name パラメーターでは、関数アプリに使用するイメージを指定します。The deployment-container-image-name parameter specifies the image to use for the function app. デプロイに使用されているイメージに関する情報は、az functionapp config container show コマンドを使用して表示できます。You can use the az functionapp config container show command to view information about the image used for deployment. az functionapp config container set コマンドを使用して、別のイメージからデプロイすることもできます。You can also use the az functionapp config container set command to deploy from a different image.

  2. 作成したストレージ アカウントの接続文字列を az storage account show-connection-string コマンドで取得し、シェル変数 storageConnectionString に代入します。Retrieve the connection string for the storage account you created by using the az storage account show-connection-string command, assigning it to a shell variable storageConnectionString:

    az storage account show-connection-string --resource-group AzureFunctionsContainers-rg --name <storage_name> --query connectionString --output tsv
    
  3. az functionapp config appsettings set コマンドを使用して、この設定を関数アプリに追加します。Add this setting to the function app by using the az functionapp config appsettings set command. 次のコマンドで、<app_name> を関数アプリの名前に置き換え、<connection_string> を前の手順の接続文字列 ("DefaultEndpointProtocol=" で始まる長いエンコード文字列) に置き換えます。In the following command, replace <app_name> with the name of your function app, and replace <connection_string> with the connection string from the previous step (a long encoded string that begins with "DefaultEndpointProtocol="):

    az functionapp config appsettings set --name <app_name> --resource-group AzureFunctionsContainers-rg --settings AzureWebJobsStorage=<connection_string>
    
  4. 関数でこの接続文字列を使用してストレージ アカウントにアクセスできるようになりました。The function can now use this connection string to access the storage account.

    ヒント

    Bash では、クリップボードではなく、シェル変数を使用して接続文字列をキャプチャできます。In bash, you can use a shell variable to capture the connection string instead of using the clipboard. まず、次のコマンドを使用して、接続文字列の変数を作成します。First, use the following command to create a variable with the connection string:

    storageConnectionString=$(az storage account show-connection-string --resource-group AzureFunctionsContainers-rg --name <storage_name> --query connectionString --output tsv)
    

    次に、2 つ目のコマンドで変数を参照します。Then refer to the variable in the second command:

    az functionapp config appsettings set --name <app_name> --resource-group AzureFunctionsContainers-rg --settings AzureWebJobsStorage=$storageConnectionString
    

注意

カスタム イメージをプライベート コンテナー アカウントに発行する場合は、接続文字列に Dockerfile 内の環境変数を使用する必要があります。If you publish your custom image to a private container account, you should use environment variables in the Dockerfile for the connection string instead. 詳細については、ENV の手順を参照してください。For more information, see the ENV instruction. また、変数 DOCKER_REGISTRY_SERVER_USERNAME および DOCKER_REGISTRY_SERVER_PASSWORD も設定する必要があります。You should also set the variables DOCKER_REGISTRY_SERVER_USERNAME and DOCKER_REGISTRY_SERVER_PASSWORD. これらの値を使用するには、イメージをリビルドしてそのイメージをレジストリにプッシュした後、Azure で関数アプリを再起動する必要があります。To use the values, then, you must rebuild the image, push the image to the registry, and then restart the function app on Azure.

Azure 上で関数を確認するVerify your functions on Azure

Azure 上の関数アプリにイメージをデプロイしたら、HTTP 要求を使用して関数を呼び出すことができます。With the image deployed to the function app on Azure, you can now invoke the function through HTTP requests. function.json 定義に "authLevel": "function" プロパティが存在するので、まずアクセス キー ("関数キー" とも呼ばれます) を取得して、それを URL パラメーターとしてエンドポイントへの要求に含める必要があります。Because the function.json definition includes the property "authLevel": "function", you must first obtain the access key (also called the "function key") and include it as a URL parameter in any requests to the endpoint.

  1. Azure portal を使用するか、または Azure CLI と az rest コマンドを使用して、アクセス (関数) キーを含む関数の URL を取得します。Retrieve the function URL with the access (function) key by using the Azure portal, or by using the Azure CLI with the az rest command.)

    1. Azure portal にサインインし、"関数アプリ" を検索して選択します。Sign in to the Azure portal, then search for and select Function App.

    2. 検証する関数を選択します。Select the function you want to verify.

    3. 左側のナビゲーション パネルで [関数] を選択し、検証する関数を選択します。In the left navigation panel, select Functions, and then select the function you want to verify.

      Azure portal の [関数の URL の取得] コマンド

    4. [関数の URL の取得] を選択します。Select Get Function Url.

      Azure portal の [関数の URL の取得] コマンド

    5. ポップアップ ウィンドウで、 [default (function key)](既定 (関数キー)) を選択し、URL をクリップボードにコピーします。In the pop-up window, select default (function key) and then copy the URL to the clipboard. ?code= に続く文字列がキーですThe key is the string of characters following ?code=.

      Azure portal の [関数の URL の取得] コマンド

    注意

    関数アプリはコンテナーとしてデプロイされるため、ポータルでその関数コードを変更することはできません。Because your function app is deployed as a container, you can't make changes to your function code in the portal. ローカル イメージでプロジェクトを更新して、再度イメージをレジストリにプッシュした後、Azure に再デプロイする必要があります。You must instead update the project in the local image, push the image to the registry again, and then redeploy to Azure. 後続のセクションで継続的デプロイを設定することができます。You can set up continuous deployment in a later section.

  2. 関数 URL をブラウザーのアドレス バーに貼り付けます。この URL の末尾にパラメーター &name=Azure を追加してください。Paste the function URL into your browser's address bar, adding the parameter &name=Azure to the end of this URL. "Hello, Azure" のようなテキストがブラウザーに表示されます。Text like "Hello, Azure" should appear in the browser.

    ブラウザーでの関数の応答。

  3. 承認をテストするために、URL から code= パラメーターを取り除き、関数から応答がないことを確認します。To test authorization, remove the code= parameter from the URL and verify that you get no response from the function.

Azure への継続的デプロイを有効にするEnable continuous deployment to Azure

レジストリ内のイメージを更新するたびに、イメージのデプロイを Azure Functions に自動的に更新させることができます。You can enable Azure Functions to automatically update your deployment of an image whenever you update the image in the registry.

  1. az functionapp deployment container config コマンドを使用して継続的デプロイを有効にします。<app_name> は、実際の関数アプリの名前に置き換えてください。Enable continuous deployment by using az functionapp deployment container config command, replacing <app_name> with the name of your function app:

    az functionapp deployment container config --enable-cd --query CI_CD_URL --output tsv --name <app_name> --resource-group AzureFunctionsContainers-rg
    

    このコマンドは、継続的デプロイを有効にして、デプロイの Webhook URL を返します。This command enables continuous deployment and returns the deployment webhook URL. (この URL は、後から az functionapp deployment container show-cd-url コマンドを使用していつでも取得できます。)(You can retrieve this URL at any later time by using the az functionapp deployment container show-cd-url command.)

  2. デプロイの Webhook URL をクリップボードにコピーします。Copy the deployment webhook URL to the clipboard.

  3. [Docker Hub] を開いてサインインし、ナビゲーション バーの [Repositories](リポジトリ) を選択します。Open Docker Hub, sign in, and select Repositories on the nav bar. イメージを検索して選択し、 [Webhooks] タブを選択します。次に、Webhook の名前を指定して、 [Webhook URL] に URL を貼り付け、 [Create](作成) を選択します。Locate and select image, select the Webhooks tab, specify a Webhook name, paste your URL in Webhook URL, and then select Create:

    DockerHub リポジトリに Webhook を追加する

  4. Webhook の設定後は、Docker Hub でイメージを更新するたびに、それが Azure Functions によって再デプロイされます。With the webhook set, Azure Functions redeploys your image whenever you update it in Docker Hub.

SSH 接続を有効にするEnable SSH connections

SSH では、コンテナーとクライアント間の通信をセキュリティで保護できます。SSH enables secure communication between a container and a client. SSH が有効になっている場合は、App Service Advanced Tools (Kudu) を使用してコンテナーに接続できます。With SSH enabled, you can connect to your container using App Service Advanced Tools (Kudu). SSH を使用してコンテナーに簡単に接続できるように、Azure Functions には、SSH が既に有効になっている基本イメージが用意されています。To make it easy to connect to your container using SSH, Azure Functions provides a base image that has SSH already enabled. 必要な作業は、Dockerfile を編集してから、イメージをリビルドして再デプロイするだけです。You need only edit your Dockerfile, then rebuild and redeploy the image. その後、[高度なツール (Kudu)] を使用してコンテナーに接続することができます。You can then connect to the container through the Advanced Tools (Kudu)

  1. Dockerfile で、FROM 命令の基本イメージに文字列 -appservice を追加します。In your Dockerfile, append the string -appservice to the base image in your FROM instruction:

    FROM microsoft/dotnet:2.2-sdk-appservice AS installer-env
    
    FROM mcr.microsoft.com/azure-functions/node:2.0-appservice
    
    FROM mcr.microsoft.com/azure-functions/powershell:2.0-appservice
    
    FROM mcr.microsoft.com/azure-functions/python:2.0-python3.7-appservice
    
    FROM mcr.microsoft.com/azure-functions/node:2.0-appservice
    

    基本イメージ間の違いは、App Services のカスタム Docker イメージに関するチュートリアルで説明されています。The differences between the base images are described in the App Services - Custom docker images tutorial.

  2. もう一度 docker build コマンドを使用してイメージをリビルドします。<docker_id> は、実際の Docker ID に置き換えてください。Rebuild the image by using the docker build command again, replacing <docker_id> with your Docker ID:

    docker build --tag <docker_id>/azurefunctionsimage:v1.0.0 .
    
  3. 更新済みのイメージを Docker Hub にプッシュします。アップロードする必要があるのは、イメージの更新済みセグメントのみであるため、初回プッシュ時よりもはるかに短時間で済みます。Push the updated image to Docker Hub, which should take considerably less time than the first push only the updated segments of the image need to be uploaded.

    docker push <docker_id>/azurefunctionsimage:v1.0.0
    
  4. Azure Functions によってイメージが自動的に関数アプリに再デプロイされます。この処理の所要時間は 1 分未満です。Azure Functions automatically redeploys the image to your functions app; the process takes place in less than a minute.

  5. ブラウザーで https://<app_name>.scm.azurewebsites.net/ を開きます。<app_name> は、一意の名前に置き換えてください。In a browser, open https://<app_name>.scm.azurewebsites.net/, replacing <app_name> with your unique name. この URL は、関数アプリ コンテナーの [高度なツール (Kudu)] エンドポイントです。This URL is the Advanced Tools (Kudu) endpoint for your function app container.

  6. 自分の Azure アカウントにサインインし、 [SSH] を選択して、コンテナーとの接続を確立します。Sign in to your Azure account, and then select the SSH to establish a connection with the container. Azure によるコンテナー イメージの更新がまだ行われている場合、接続に少し時間がかかる場合があります。Connecting may take a few moments if Azure is still updating the container image.

  7. コンテナーとの接続が確立されたら、top コマンドを実行して、現在実行中のプロセスを表示します。After a connection is established with your container, run the top command to view the currently running processes.

    SSH セッションで実行されている Linux top コマンド

Azure Storage キューに書き込むWrite to an Azure Storage queue

Azure Functions を使用すると、独自の統合コードを記述することなく他の Azure サービスやリソースに関数を接続できます。Azure Functions lets you connect your functions to other Azure services and resources without having to write your own integration code. これらのバインドは、入力と出力の両方を表し、関数定義内で宣言されます。These bindings, which represent both input and output, are declared within the function definition. バインドからのデータは、パラメーターとして関数に提供されます。Data from bindings is provided to the function as parameters. "トリガー" は、特殊な種類の入力バインドです。A trigger is a special type of input binding. 関数はトリガーを 1 つしか持てませんが、複数の入力および出力バインドを持つことができます。Although a function has only one trigger, it can have multiple input and output bindings. 詳細については、「Azure Functions でのトリガーとバインドの概念」を参照してください。To learn more, see Azure Functions triggers and bindings concepts.

このセクションでは、関数と Azure Storage キューを統合する方法について説明します。This section shows you how to integrate your function with an Azure Storage queue. この関数に追加する出力バインドは、HTTP 要求のデータをキュー内のメッセージに書き込みます。The output binding that you add to this function writes data from an HTTP request to a message in the queue.

Azure Storage の接続文字列を取得するRetrieve the Azure Storage connection string

先ほど、関数アプリで使用する Azure ストレージ アカウントを作成しました。Earlier, you created an Azure Storage account for use by the function app. このアカウントの接続文字列は、Azure のアプリ設定に安全に格納されています。The connection string for this account is stored securely in app settings in Azure. 関数をローカルで実行するときは、local.settings.json ファイルに設定をダウンロードすることにより、その接続を使用して同じアカウントのストレージ キューへの書き込みを行うことができます。By downloading the setting into the local.settings.json file, you can use that connection write to a Storage queue in the same account when running the function locally.

  1. プロジェクトのルートから、次のコマンドを実行します。<app_name> は、前のクイックスタートの関数アプリ名に置き換えてください。From the root of the project, run the following command, replacing <app_name> with the name of your function app from the previous quickstart. このコマンドを実行すると、ファイル内の既存の値はすべて上書きされます。This command will overwrite any existing values in the file.

    func azure functionapp fetch-app-settings <app_name>
    
  2. local.settings.json を開き、AzureWebJobsStorage という名前の値を検索します。それがストレージ アカウントの接続文字列です。Open local.settings.json and locate the value named AzureWebJobsStorage, which is the Storage account connection string. AzureWebJobsStorage という名前と接続文字列は、この記事の他のセクションで使用します。You use the name AzureWebJobsStorage and the connection string in other sections of this article.

重要

local.settings.json には、Azure からダウンロードされたシークレットが含まれているため、このファイルは必ずソース管理から除外してください。Because local.settings.json contains secrets downloaded from Azure, always exclude this file from source control. ローカル関数プロジェクトで作成される .gitignore ファイルからは、このファイルが既定で除外されます。The .gitignore file created with a local functions project excludes the file by default.

バインディング拡張機能を登録するRegister binding extensions

HTTP トリガーとタイマー トリガーを除き、バインドは拡張機能パッケージとして実装されます。With the exception of HTTP and timer triggers, bindings are implemented as extension packages. ターミナル ウィンドウで次の dotnet add package コマンドを実行して、Storage 拡張機能パッケージをプロジェクトに追加します。Run the following dotnet add package command in the Terminal window to add the Storage extension package to your project.

dotnet add package Microsoft.Azure.WebJobs.Extensions.Storage --version 3.0.4

これで、Storage の出力バインドをプロジェクトに追加できるようになります。Now, you can add the storage output binding to your project.

出力バインディングの定義を関数に追加するAdd an output binding definition to the function

関数に割り当てることができるトリガーは 1 つだけですが、入力と出力のバインディングは複数割り当てることができます。これらを使用すると、カスタム統合コードを記述しなくても、他の Azure サービスやリソースに接続できます。Although a function can have only one trigger, it can have multiple input and output bindings, which let you connect to other Azure services and resources without writing custom integration code.

関数フォルダーの function.json ファイルでそれらのバインディングを宣言します。You declare these bindings in the function.json file in your function folder. 前のクイックスタートの HttpExample フォルダーにある function.json ファイルでは、bindings コレクション内に 2 つのバインディングが含まれています。From the previous quickstart, your function.json file in the HttpExample folder contains two bindings in the bindings collection:

"bindings": [
    {
        "authLevel": "function",
        "type": "httpTrigger",
        "direction": "in",
        "name": "req",
        "methods": [
            "get",
            "post"
        ]
    },
    {
        "type": "http",
        "direction": "out",
        "name": "res"
    }
]
"scriptFile": "__init__.py",
"bindings": [
    {
        "authLevel": "function",
        "type": "httpTrigger",
        "direction": "in",
        "name": "req",
        "methods": [
            "get",
            "post"
        ]
    },
    {
        "type": "http",
        "direction": "out",
        "name": "$return"
    }
"bindings": [
  {
    "authLevel": "function",
    "type": "httpTrigger",
    "direction": "in",
    "name": "Request",
    "methods": [
      "get",
      "post"
    ]
  },
  {
    "type": "http",
    "direction": "out",
    "name": "Response"
  }
]

それぞれのバインディングには、少なくとも型、方向、名前があります。Each binding has at least a type, a direction, and a name. 上の例の 1 つ目のバインディングは、型が httpTrigger で、方向が in になっています。In the example above, the first binding is of type httpTrigger with the direction in. in 方向の場合、トリガーによって呼び出された関数に送信される入力パラメーターの名前が name で指定されます。For the in direction, name specifies the name of an input parameter that's sent to the function when invoked by the trigger.

コレクションの 2 つ目のバインディングの名前は res です。The second binding in the collection is named res. この http バインディングは、HTTP 応答の書き込みに使用される出力バインディング (out) です。This http binding is an output binding (out) that is used to write the HTTP response.

この関数から Azure Storage キューに書き込みを行うには、次のコードで示すように、queue 型の out バインディングを msg という名前で追加します。To write to an Azure Storage queue from this function, add an out binding of type queue with the name msg, as shown in the code below:

    {
      "authLevel": "function",
      "type": "httpTrigger",
      "direction": "in",
      "name": "req",
      "methods": [
        "get",
        "post"
      ]
    },
    {
      "type": "http",
      "direction": "out",
      "name": "res"
    },
    {
      "type": "queue",
      "direction": "out",
      "name": "msg",
      "queueName": "outqueue",
      "connection": "AzureWebJobsStorage"
    }
  ]
}

コレクションの 2 つ目のバインディングは、型が http で方向が out です。この場合、このバインディングは入力パラメーターを渡すものではなく、関数の戻り値を使用するものであることが、$return という特殊な name からわかります。The second binding in the collection is of type http with the direction out, in which case the special name of $return indicates that this binding uses the function's return value rather than providing an input parameter.

この関数から Azure Storage キューに書き込みを行うには、次のコードで示すように、queue 型の out バインディングを msg という名前で追加します。To write to an Azure Storage queue from this function, add an out binding of type queue with the name msg, as shown in the code below:

"bindings": [
  {
    "authLevel": "anonymous",
    "type": "httpTrigger",
    "direction": "in",
    "name": "req",
    "methods": [
      "get",
      "post"
    ]
  },
  {
    "type": "http",
    "direction": "out",
    "name": "$return"
  },
  {
    "type": "queue",
    "direction": "out",
    "name": "msg",
    "queueName": "outqueue",
    "connection": "AzureWebJobsStorage"
  }
]

コレクションの 2 つ目のバインディングの名前は res です。The second binding in the collection is named res. この http バインディングは、HTTP 応答の書き込みに使用される出力バインディング (out) です。This http binding is an output binding (out) that is used to write the HTTP response.

この関数から Azure Storage キューに書き込みを行うには、次のコードで示すように、queue 型の out バインディングを msg という名前で追加します。To write to an Azure Storage queue from this function, add an out binding of type queue with the name msg, as shown in the code below:

    {
      "authLevel": "function",
      "type": "httpTrigger",
      "direction": "in",
      "name": "Request",
      "methods": [
        "get",
        "post"
      ]
    },
    {
      "type": "http",
      "direction": "out",
      "name": "Response"
    },
    {
      "type": "queue",
      "direction": "out",
      "name": "msg",
      "queueName": "outqueue",
      "connection": "AzureWebJobsStorage"
    }
  ]
}

このケースでは、msg が出力引数として関数に与えられています。In this case, msg is given to the function as an output argument. queue では、queueName にキューの名前を指定し、(local.settings.json から得られる) Azure Storage 接続の "名前" を connection に指定する必要もあります。For a queue type, you must also specify the name of the queue in queueName and provide the name of the Azure Storage connection (from local.settings.json) in connection.

C# クラス ライブラリ プロジェクトでは、バインドは関数メソッドのバインド属性として定義されます。In a C# class library project, the bindings are defined as binding attributes on the function method. その後、Functions に必要な function.json ファイルが、これらの属性に基づいて自動的に生成されます。The function.json file required by Functions is then auto-generated based on these attributes.

HttpExample.cs プロジェクト ファイルを開いて、Run メソッドの定義に次のパラメーターを追加します。Open the HttpExample.cs project file and add the following parameter to the Run method definition:

[Queue("outqueue"),StorageAccount("AzureWebJobsStorage")] ICollector<string> msg,

msg パラメーターは ICollector<T> 型です。これは、関数の完了時に出力バインドに書き込まれるメッセージのコレクションを表します。The msg parameter is an ICollector<T> type, which represents a collection of messages that are written to an output binding when the function completes. この場合、出力は outqueue という名前のストレージ キューです。In this case, the output is a storage queue named outqueue. このストレージ アカウントの接続文字列は、StorageAccountAttribute で設定されます。The connection string for the Storage account is set by the StorageAccountAttribute. この属性は、ストレージ アカウントの接続文字列を含む設定を示し、クラス、メソッド、パラメーター レベルで適用できます。This attribute indicates the setting that contains the Storage account connection string and can be applied at the class, method, or parameter level. この例では、既定のストレージ アカウントを既に使用しているため、StorageAccountAttribute を省略できます。In this case, you could omit StorageAccountAttribute because you are already using the default storage account.

Run メソッドの定義は次のようになります。The Run method definition should now look like the following:

[FunctionName("HttpExample")]
public static async Task<IActionResult> Run(
    [HttpTrigger(AuthorizationLevel.Function, "get", "post", Route = null)] HttpRequest req, 
    [Queue("outqueue"),StorageAccount("AzureWebJobsStorage")] ICollector<string> msg, 
    ILogger log)

Java プロジェクトでは、バインドは関数メソッドのバインド注釈として定義されます。In a Java project, the bindings are defined as binding annotations on the function method. その後、これらの注釈に基づいて function.json ファイルが自動的に生成されます。The function.json file is then autogenerated based on these annotations.

src/main/java の下の対象の関数コードの場所を参照し、Function.java プロジェクト ファイルを開きます。run メソッド定義に、次のパラメーターを追加します。Browse to the location of your function code under src/main/java, open the Function.java project file, and add the following parameter to the run method definition:

@QueueOutput(name = "msg", queueName = "outqueue", connection = "AzureWebJobsStorage") OutputBinding<String> msg

msg パラメーターは OutputBinding<T> 型です。これは、関数の完了時に出力バインドにメッセージとして書き込まれる文字列のコレクションを表します。The msg parameter is an OutputBinding<T> type, which represents a collection of strings that are written as messages to an output binding when the function completes. この場合、出力は outqueue という名前のストレージ キューです。In this case, the output is a storage queue named outqueue. このストレージ アカウントの接続文字列は、connection メソッドによって設定されます。The connection string for the Storage account is set by the connection method. 接続文字列自体ではなく、ストレージ アカウントの接続文字列を含むアプリケーション設定を渡します。Rather than the connection string itself, you pass the application setting that contains the Storage account connection string.

run メソッドの定義は次の例のようになります。The run method definition should now look like the following example:

@FunctionName("HttpTrigger-Java")
public HttpResponseMessage run(
        @HttpTrigger(name = "req", methods = {HttpMethod.GET, HttpMethod.POST}, authLevel = AuthorizationLevel.FUNCTION)  
        HttpRequestMessage<Optional<String>> request, 
        @QueueOutput(name = "msg", queueName = "outqueue", connection = "AzureWebJobsStorage") 
        OutputBinding<String> msg, final ExecutionContext context) {
    ...
}

出力バインディングを使用するコードを追加するAdd code to use the output binding

キュー バインディングが定義されたら、msg 出力パラメーターを受け取ってメッセージをキューに書き込むように関数を更新することができます。With the queue binding defined, you can now update your function to receive the msg output parameter and write messages to the queue.

次のコードに合わせて HttpExample\__init__.py を更新します。関数の定義に msg パラメーターを、if name: ステートメントの下に msg.set(name) を追加してください。Update HttpExample\__init__.py to match the following code, adding the msg parameter to the function definition and msg.set(name) under the if name: statement.

import logging

import azure.functions as func


def main(req: func.HttpRequest, msg: func.Out[func.QueueMessage]) -> str:

    name = req.params.get('name')
    if not name:
        try:
            req_body = req.get_json()
        except ValueError:
            pass
        else:
            name = req_body.get('name')

    if name:
        msg.set(name)
        return func.HttpResponse(f"Hello {name}!")
    else:
        return func.HttpResponse(
            "Please pass a name on the query string or in the request body",
            status_code=400
        )

msg パラメーターは、azure.functions.InputStream class のインスタンスです。The msg parameter is an instance of the azure.functions.InputStream class. その set メソッドでは、文字列メッセージ (この場合、URL のクエリ文字列として関数に渡された名前) をキューに書き込みます。Its set method writes a string message to the queue, in this case the name passed to the function in the URL query string.

context.bindingsmsg 出力バインド オブジェクトを使用してキュー メッセージを作成するコードを追加します。Add code that uses the msg output binding object on context.bindings to create a queue message. このコードを context.res ステートメントの前に追加します。Add this code before the context.res statement.

context.bindings.msg = (req.query.name || req.body.name);

この時点で、関数は次のようになります。At this point, your function should look as follows:

module.exports = async function (context, req) {
    context.log('JavaScript HTTP trigger function processed a request.');

    if (req.query.name || (req.body && req.body.name)) {
        // Add a message to the Storage queue,
        // which is the name passed to the function.
        context.bindings.msg = (req.query.name || req.body.name);
        context.res = {
            // status: 200, /* Defaults to 200 */
            body: "Hello " + (req.query.name || req.body.name)
        };
    }
    else {
        context.res = {
            status: 400,
            body: "Please pass a name on the query string or in the request body"
        };
    }
};

context.bindingsmsg 出力バインド オブジェクトを使用してキュー メッセージを作成するコードを追加します。Add code that uses the msg output binding object on context.bindings to create a queue message. このコードを context.res ステートメントの前に追加します。Add this code before the context.res statement.

context.bindings.msg = name;

この時点で、関数は次のようになります。At this point, your function should look as follows:

import { AzureFunction, Context, HttpRequest } from "@azure/functions"

const httpTrigger: AzureFunction = async function (context: Context, req: HttpRequest): Promise<void> {
    context.log('HTTP trigger function processed a request.');
    const name = (req.query.name || (req.body && req.body.name));

    if (name) {
        // Add a message to the storage queue, 
        // which is the name passed to the function.
        context.bindings.msg = name; 
        // Send a "hello" response.
        context.res = {
            // status: 200, /* Defaults to 200 */
            body: "Hello " + (req.query.name || req.body.name)
        };
    }
    else {
        context.res = {
            status: 400,
            body: "Please pass a name on the query string or in the request body"
        };
    }
};

export default httpTrigger;

Push-OutputBinding コマンドレットと msg 出力バインディングを使用してキューにテキストを書き込むコードを追加します。Add code that uses the Push-OutputBinding cmdlet to write text to the queue using the msg output binding. if ステートメントで OK ステータスを設定する前に、このコードを追加してください。Add this code before you set the OK status in the if statement.

$outputMsg = $name
Push-OutputBinding -name msg -Value $outputMsg

この時点で、関数は次のようになります。At this point, your function should look as follows:

using namespace System.Net

# Input bindings are passed in via param block.
param($Request, $TriggerMetadata)

# Write to the Azure Functions log stream.
Write-Host "PowerShell HTTP trigger function processed a request."

# Interact with query parameters or the body of the request.
$name = $Request.Query.Name
if (-not $name) {
    $name = $Request.Body.Name
}

if ($name) {
    # Write the $name value to the queue, 
    # which is the name passed to the function.
    $outputMsg = $name
    Push-OutputBinding -name msg -Value $outputMsg

    $status = [HttpStatusCode]::OK
    $body = "Hello $name"
}
else {
    $status = [HttpStatusCode]::BadRequest
    $body = "Please pass a name on the query string or in the request body."
}

# Associate values to output bindings by calling 'Push-OutputBinding'.
Push-OutputBinding -Name Response -Value ([HttpResponseContext]@{
    StatusCode = $status
    Body = $body
})

msg 出力バインド オブジェクトを使用してキュー メッセージを作成するコードを追加します。Add code that uses the msg output binding object to create a queue message. このコードは、メソッドから制御が戻る前に追加します。Add this code before the method returns.

if (!string.IsNullOrEmpty(name))
{
    // Add a message to the output collection.
    msg.Add(string.Format("Name passed to the function: {0}", name));
}

この時点で、関数は次のようになります。At this point, your function should look as follows:

[FunctionName("HttpExample")]
public static async Task<IActionResult> Run(
    [HttpTrigger(AuthorizationLevel.Function, "get", "post", Route = null)] HttpRequest req, 
    [Queue("outqueue"),StorageAccount("AzureWebJobsStorage")] ICollector<string> msg, 
    ILogger log)
{
    log.LogInformation("C# HTTP trigger function processed a request.");

    string name = req.Query["name"];

    string requestBody = await new StreamReader(req.Body).ReadToEndAsync();
    dynamic data = JsonConvert.DeserializeObject(requestBody);
    name = name ?? data?.name;

    if (!string.IsNullOrEmpty(name))
    {
        // Add a message to the output collection.
        msg.Add(string.Format("Name passed to the function: {0}", name));
    }
    return name != null
        ? (ActionResult)new OkObjectResult($"Hello, {name}")
        : new BadRequestObjectResult("Please pass a name on the query string or in the request body");
}

これで、新しい msg パラメーターを使用して、関数コードから出力バインドに書き込むことができます。Now, you can use the new msg parameter to write to the output binding from your function code. 成功応答の前に次のコード行を追加して、name の値を msg 出力バインドに追加します。Add the following line of code before the success response to add the value of name to the msg output binding.

msg.setValue(name);

出力バインドを使用すると、認証、キュー参照の取得、またはデータの書き込みに、Azure Storage SDK のコードを使用する必要がなくなります。When you use an output binding, you don't have to use the Azure Storage SDK code for authentication, getting a queue reference, or writing data. Functions ランタイムおよびキューの出力バインドが、ユーザーに代わってこれらのタスクを処理します。The Functions runtime and queue output binding do those tasks for you.

run メソッドは次の例のようになります。Your run method should now look like the following example:

public HttpResponseMessage run(
        @HttpTrigger(name = "req", methods = {HttpMethod.GET, HttpMethod.POST}, authLevel = AuthorizationLevel.ANONYMOUS) 
        HttpRequestMessage<Optional<String>> request, 
        @QueueOutput(name = "msg", queueName = "outqueue", 
        connection = "AzureWebJobsStorage") OutputBinding<String> msg, 
        final ExecutionContext context) {
    context.getLogger().info("Java HTTP trigger processed a request.");

    // Parse query parameter
    String query = request.getQueryParameters().get("name");
    String name = request.getBody().orElse(query);

    if (name == null) {
        return request.createResponseBuilder(HttpStatus.BAD_REQUEST)
        .body("Please pass a name on the query string or in the request body").build();
    } else {
        // Write the name to the message queue. 
        msg.setValue(name);

        return request.createResponseBuilder(HttpStatus.OK).body("Hello, " + name).build();
    }
}

テストを更新するUpdate the tests

アーキタイプはテストのセットも作成するため、run メソッド シグネチャ内の新しい msg パラメーターを処理するためにこれらのテストを更新する必要があります。Because the archetype also creates a set of tests, you need to update these tests to handle the new msg parameter in the run method signature.

src/main/java の下の対象のテスト コードの場所を参照し、Function.java プロジェクト ファイルを開きます。//Invoke の下のコード行を次のコードに置き換えます。Browse to the location of your test code under src/test/java, open the Function.java project file, and replace the line of code under //Invoke with the following code.

@SuppressWarnings("unchecked")
final OutputBinding<String> msg = (OutputBinding<String>)mock(OutputBinding.class);
final HttpResponseMessage ret = new Function().run(req, msg, context);

レジストリ内のイメージを更新するUpdate the image in the registry

  1. ルート フォルダーで docker build コマンドを再度実行します。今回は、タグ内のバージョンを v1.0.1 に更新します。In the root folder, run docker build again, and this time update the version in the tag to v1.0.1. 以前と同様に、<docker_id> を Docker Hub アカウント ID に置き換えてください。As before, replace <docker_id> with your Docker Hub account ID:

    docker build --tag <docker_id>/azurefunctionsimage:v1.0.1
    
  2. docker push を使用して、更新済みのイメージをリポジトリにプッシュして戻します。Push the updated image back to the repository with docker push:

    docker push <docker_id>/azurefunctionsimage:v1.0.1
    
  3. 継続的デリバリーを構成したため、レジストリにあるイメージを再度更新すると、Azure にある関数アプリが自動的に更新されます。Because you configured continuous delivery, updating the image in the registry again automatically updates your function app in Azure.

Azure Storage キューのメッセージを確認するView the message in the Azure Storage queue

ブラウザーで、これまでと同じ URL を使用して自分の関数を呼び出します。In a browser, use the same URL as before to invoke your function. 以前と同じ応答がブラウザーに表示されるはずです。その部分については、関数コードに変更を加えていないためです。The browser should display the same response as before, because you didn't modify that part of the function code. ただし追加したコードでは、URL パラメーター name を使用して、outqueue ストレージ キューにメッセージを書き込みました。The added code, however, wrote a message using the name URL parameter to the outqueue storage queue.

キューは、Azure portal または Microsoft Azure Storage Explorer で確認できます。You can view the queue in the Azure portal or in the Microsoft Azure Storage Explorer. 次の手順に従って、Azure CLI でキューを確認することもできます。You can also view the queue in the Azure CLI, as described in the following steps:

  1. 関数プロジェクトの local.setting.json ファイルを開き、接続文字列の値をコピーします。Open the function project's local.setting.json file and copy the connection string value. ターミナルまたはコマンド ウィンドウで、次のコマンドを実行して、AZURE_STORAGE_CONNECTION_STRING という名前の環境変数を作成し、<MY_CONNECTION_STRING> の代わりに実際の接続文字列を貼り付けます。In a terminal or command window, run the following command to create an environment variable named AZURE_STORAGE_CONNECTION_STRING, pasting your specific connection string in place of <MY_CONNECTION_STRING>. (この環境変数を作成すれば、--connection-string 引数を使用して接続文字列を後続の各コマンドに指定する必要はありません。)(This environment variable means you don't need to supply the connection string to each subsequent command using the --connection-string argument.)

    AZURE_STORAGE_CONNECTION_STRING="<MY_CONNECTION_STRING>"
    
  2. (省略可) az storage queue list コマンドを使用して、ご利用のアカウント内のストレージ キューを表示します。(Optional) Use the az storage queue list command to view the Storage queues in your account. このコマンドからの出力には、outqueue という名前のキューが含まれています。これはこのキューに対する最初のメッセージを関数が書き込んだときに作成されたものです。The output from this command should include a queue named outqueue, which was created when the function wrote its first message to that queue.

    az storage queue list --output tsv
    
  3. az storage message get コマンドを使用して、このキューからメッセージ (先ほど関数をテストするときに使用した名) を読み取ります。Use the az storage message get command to read the message from this queue, which should be the first name you used when testing the function earlier. このコマンドは、キューから最初のメッセージを読み取って削除します。The command reads and removes the first message from the queue.

    echo `echo $(az storage message get --queue-name outqueue -o tsv --query '[].{Message:content}') | base64 --decode`
    

    メッセージ本文は base64 でエンコードされた状態で保存されるため、表示するメッセージをあらかじめデコードしておく必要があります。Because the message body is stored base64 encoded, the message must be decoded before it's displayed. az storage message get を実行すると、メッセージがキューから削除されます。After you execute az storage message get, the message is removed from the queue. outqueue にメッセージが 1 つしかない場合、このコマンドを 2 回目に実行したときにメッセージは取得されず、代わりにエラーが返されます。If there was only one message in outqueue, you won't retrieve a message when you run this command a second time and instead get an error.

リソースをクリーンアップするClean up resources

このチュートリアルで作成したリソースを使用して、引き続き Azure 関数に取り組む場合は、それらのリソースをすべてそのままにしてかまいません。If you want to continue working with Azure Function using the resources you created in this tutorial, you can leave all those resources in place. Azure Functions 用の Premium プランを作成したため、継続するためのコストとして、1 日につき 1 ドルまたは 2 ドルの料金がかかります。Because you created a Premium Plan for Azure Functions, you'll incur one or two USD per day in ongoing costs.

継続コストを避けるためには、AzureFunctionsContainer-rg リソース グループを削除して、そのグループのリソースをすべてクリーンアップしてください。To avoid ongoing costs, delete the AzureFunctionsContainer-rg resource group to clean up all the resources in that group:

az group delete --name AzureFunctionsContainer-rg

次のステップNext steps