チュートリアル:HTTP によってトリガーされる Azure Functions を使用してコンテナー グループを作成する

Azure Functions は、さまざまなイベント (HTTP 要求、タイマー、Azure Storage キューのメッセージなど) に応じてスクリプトまたはコードを実行できるサーバーレスのコンピューティング サービスです。

このチュートリアルでは、HTTP 要求を受け取ってコンテナー グループのデプロイをトリガーする Azure Functions を作成します。 この例では、Azure Functions を使用して Azure Container Instances のリソースを自動的に作成する際の基本を紹介しています。 さらに複雑なシナリオや他のイベント トリガーについては、この例に変更を加えるか拡張してください。

学習内容は次のとおりです。

  • Visual Studio Code と Azure Functions 拡張機能を使用して、HTTP によってトリガーされる基本的な PowerShell 関数を作成する。
  • 関数アプリの ID を有効にして、Azure リソースを作成するためのアクセス許可を与える。
  • コンテナーを 1 つだけ含んだコンテナー グループのデプロイを自動化するように PowerShell 関数に変更を加えて再発行する。
  • HTTP によってトリガーされたコンテナーのデプロイを確認する。

前提条件

ご利用の OS に Visual Studio Code と Azure Functions 拡張機能をインストールして使用するための前提条件については、Visual Studio Code を使用して Azure で初めての関数を作成する方法に関するページを参照してください。

この記事の追加の手順では、Azure PowerShell を使用します。 インストールまたはアップグレードする必要がある場合は、Azure PowerShell のインストールおよび Azure へのサインインに関する記事を参照してください。

基本的な PowerShell 関数を作成する

Azure で初めての PowerShell 関数を作成する方法の手順に従い、HTTP トリガー テンプレートを使用して PowerShell 関数を作成します。 Azure Functions の既定の名前 HttpTrigger を使用します。 このクイックスタートに示すように、関数をローカルでテストし、Azure の関数アプリにプロジェクトを発行します。 この例は、テキスト文字列を返す、HTTP によってトリガーされた関数です。 この記事の後続の手順では、コンテナー グループを作成するよう関数を変更します。

この記事では、myfunctionapp という名前を使用して Azure リソース グループにプロジェクトを発行することを想定しています。Azure リソース グループの名前は、関数アプリの名前に従って自動的に付けられています (こちらも myfunctionapp)。 その後の手順で、一意の関数アプリ名とリソース グループ名に置き換えます。

関数アプリで Azure のマネージド ID を有効にする

次のコマンドを使用すると、お使いの関数アプリで、システムによって割り当てられたマネージド ID を有効にできます。 このアプリを実行している PowerShell ホストは、この ID を使用して Azure に対して自動的に認証できるため、関数は、その ID にアクセス権が付与されている Azure サービスに対してアクションを実行できます。 このチュートリアルでは、関数アプリのリソース グループにリソースを作成するためのアクセス許可をマネージド ID に付与します。

関数アプリに ID を追加するには、次のようにします。

Update-AzFunctionApp -Name myfunctionapp `
    -ResourceGroupName myfunctionapp `
    -IdentityType SystemAssigned

リソース グループのスコープに共同作成者ロールが指定されている ID を割り当てます。

$SP=(Get-AzADServicePrincipal -DisplayName myfunctionapp).Id
$RG=(Get-AzResourceGroup -Name myfunctionapp).ResourceId
New-AzRoleAssignment -ObjectId $SP -RoleDefinitionName "Contributor" -Scope $RG

HttpTrigger 関数を変更する

コンテナー グループを作成するように HttpTrigger 関数の PowerShell コードを変更します。 関数の run.ps1 ファイルで、次のコード ブロックを探します。 このコードは、関数の URL のクエリ文字列として名前が渡された場合に、その値を表示するものです。

[...]
if ($name) {
    $body = "Hello, $name. This HTTP triggered function executed successfully."
}
[...]

このコードを次の例のブロックに置き換えます。 ここで、クエリ文字列で name 値が渡された場合、New-AzContainerGroup コマンドレットを使用したコンテナー グループの名前付けと作成に使用されます。 リソース グループの名前 myfunctionapp は、実際の関数アプリのリソース グループの名前に置き換えてください。

[...]
if ($name) {
    New-AzContainerGroup -ResourceGroupName myfunctionapp -Name $name `
        -Image alpine -OsType Linux `
        -Command "echo 'Hello from an Azure container instance triggered by an Azure function'" `
        -RestartPolicy Never
    if ($?) {
        $body = "This HTTP triggered function executed successfully. Started container group $name"
    }
    else  {
        $body = "There was a problem starting the container group."
    }
[...]

この例では、alpine イメージを実行する 1 つのコンテナー インスタンスから成るコンテナー グループを作成します。 このコンテナーは、echo コマンドを 1 回だけ実行して終了します。 実際の例では、バッチ ジョブを実行するための 1 つ以上のコンテナー グループの作成をトリガーする場合があります。

関数アプリをローカルでテストする

関数アプリ プロジェクトを Azure に再発行する前に、関数がローカルで動作することを確認します。 関数をローカルで実行しても、Azure リソースは作成されません。 ただし、クエリ文字列で name 値を渡したり渡さなかったりすることで、関数のフローをテストすることができます。 関数をデバッグするには、「PowerShell Azure Functions をローカル環境でデバッグする」を参照してください。

Azure Functions アプリを再発行する

関数がローカルで動作することを確認したら、Azure 上の既存の関数アプリにそのプロジェクトを再発行します。

  1. Visual Studio Code で、コマンド パレットを開きます。 Azure Functions: Deploy to Function App... を検索して選択します。
  2. 現在の作業フォルダーを選択して zip 圧縮し、デプロイします。
  3. サブスクリプションを選択し、既存の関数アプリの名前 (myfunctionapp) を選択します。 以前のデプロイを上書きしてもよいことを確認します。

関数アプリが作成され、展開パッケージが適用されると、通知が表示されます。 この通知の [View Output](出力の表示) を選択すると、更新済みの Azure リソースなど、作成とデプロイの結果が表示されます。

Azure で関数を実行する

デプロイが正常に完了したら、関数の URL を取得します。 たとえば、Visual Studio Code の [Azure: Functions] 領域を使用して HttpTrigger 関数の URL をコピーするか、Azure portal で関数の URL を取得します。

関数の URL の形式は次のとおりです。

https://myfunctionapp.azurewebsites.net/api/HttpTrigger

名前を渡さずに関数を実行する

1 回目のテストとして、name クエリ文字列は追加せずに、curl コマンドを実行して関数の URL を渡します。

curl --verbose "https://myfunctionapp.azurewebsites.net/api/HttpTrigger"

この関数から状態コード 200 と This HTTP triggered function executed successfully. Pass a name in the query string or in the request body for a personalized response というテキストが返されます。

[...]
> GET /api/HttpTrigger? HTTP/1.1
> Host: myfunctionapp.azurewebsites.net
> User-Agent: curl/7.64.1
> Accept: */*
>
* Connection state changed (MAX_CONCURRENT_STREAMS updated)!
< HTTP/1.1 200 OK
< Content-Length: 135
< Content-Type: text/plain; charset=utf-8
< Request-Context: appId=cid-v1:d0bd0123-f713-4579-8990-bb368a229c38
< Date: Wed, 10 Jun 2020 17:50:27 GMT
<
* Connection #0 to host myfunctionapp.azurewebsites.net left intact
This HTTP triggered function executed successfully. Pass a name in the query string or in the request body for a personalized response.* Closing connection 0

関数を実行してコンテナー グループの名前を渡す

次に、コンテナー グループの名前 (mycontainergroup) をクエリ文字列 ?name=mycontainergroup として追加して、curl コマンドを実行します。

curl --verbose "https://myfunctionapp.azurewebsites.net/api/HttpTrigger?name=mycontainergroup"

この関数から状態コード 200 が返され、コンテナー グループの作成がトリガーされます。

[...]
> GET /api/HttpTrigger1?name=mycontainergroup HTTP/1.1
> Host: myfunctionapp.azurewebsites.net
> User-Agent: curl/7.64.1
> Accept: */*
>
< HTTP/1.1 200 OK
< Content-Length: 92
< Content-Type: text/plain; charset=utf-8
< Request-Context: appId=cid-v1:d0bd0123-f713-4579-8990-bb368a229c38
< Date: Wed, 10 Jun 2020 17:54:31 GMT
<
* Connection #0 to host myfunctionapp.azurewebsites.net left intact
This HTTP triggered function executed successfully. Started container group mycontainergroup* Closing connection 0

Get-AzContainerInstanceLog コマンドを使用して、コンテナーが実行されたことを確認します。

Get-AzContainerInstanceLog -ResourceGroupName myfunctionapp `
  -ContainerGroupName mycontainergroup

サンプル出力:

Hello from an Azure container instance triggered by an Azure function

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

このチュートリアルで作成したリソースがどれも不要になった場合は、[az group delete][az-group-delete] コマンドを実行して、リソース グループとそこに含まれているすべてのリソースを削除できます。 このコマンドによって、作成した関数アプリだけでなく、実行中のコンテナーおよびすべての関連リソースが削除されます。

az group delete --name myfunctionapp

次のステップ

このチュートリアルでは、HTTP 要求を受け取ってコンテナー グループのデプロイをトリガーする Azure Functions を作成しました。 以下の方法を学習しました。

  • Visual Studio Code と Azure Functions 拡張機能を使用して、HTTP によってトリガーされる基本的な PowerShell 関数を作成する。
  • 関数アプリの ID を有効にして、Azure リソースを作成するためのアクセス許可を与える。
  • コンテナーを 1 つだけ含んだコンテナー グループのデプロイを自動化するように PowerShell 関数のコードに変更を加える。
  • HTTP によってトリガーされたコンテナーのデプロイを確認する。

コンテナー化されたジョブを起動して監視する詳細な例については、ブログ記事「PowerShell Azure Functions と Azure Container Instances を使用したイベント駆動型のサーバーレス コンテナー」と付随するコード サンプルを参照してください。

Azure Functions の作成と関数プロジェクトの発行に関する詳しいガイダンスについては、Azure Functions のドキュメントを参照してください。