Azure Arc でコンテナー化された最初の Azure Functions を作成する (プレビュー)

この記事では、Linux コンテナーで実行されている関数アプリを作成し、Azure Arc 対応 Kubernetes クラスターにコンテナー レジストリからデプロイします。 独自のコンテナーを作成する際、関数アプリの実行環境をカスタマイズすることができます。 詳細は、「Azure Arc の App Service、Functions、および Logic Apps」をご覧ください。

注意

Azure Arc 対応 Kubernetes クラスターに対するカスタム コンテナーのデプロイのサポートは、現在プレビュー段階です。

最初にコンテナーを作成するのではなく、Azure Arc 対応 Kubernetes クラスターに関数を発行することもできます。 詳細については、「Azure Arc で初めての関数を作成する (プレビュー)」を参照してください

開発言語を選択する

まず、Azure Functions ツールで、言語固有の Linux 基本イメージを使用して、Docker コンテナーに関数アプリとしてプロジェクト コードを作成します。 記事の冒頭で言語を必ず選択してください。

Core Tools では、お使いの関数言語の正しい基本イメージの最新バージョンを使用するプロジェクトの Dockerfile が自動的に生成されます。 最新の基本イメージからコンテナーを定期的に更新し、コンテナーの更新されたバージョンから再デプロイする必要があります。 詳細については、「コンテナー化された関数アプリの作成」を参照してください。

前提条件

操作を始める前に、以下の要件を満たしておく必要があります。

  • Azure CLI バージョン 2.4 以降のバージョン。

Azure サブスクリプションをお持ちでない場合は、開始する前に Azure 無料アカウントを作成してください。

作成したコンテナー化された関数アプリ イメージをコンテナー レジストリにを発行するには、Docker ID とローカル コンピューターで実行されている Docker が必要です。 Docker ID がない場合は、Docker アカウントを作成することができます。

また、レジストリ インスタンスを作成するには、Container Registry のクイックスタートに記載の「コンテナー レジストリの作成」セクションを完了する必要があります。 完全修飾ログイン サーバー名を書き留めます。

仮想環境を作成してアクティブにする

適切なフォルダーで次のコマンドを実行し、.venv という名前の仮想環境を作成してアクティブにします。 Azure Functions でサポートされているいずれかの Python バージョンを必ず使用してください。

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

お使いの Linux ディストリビューションに Python の venv パッケージがインストールされていなかった場合は、次のコマンドを実行します。

sudo apt-get install python3-venv

以降のコマンドはすべて、このアクティブ化された仮想環境で実行します

ローカル関数プロジェクトを作成してテストする

ターミナルまたはコマンド プロンプトで、自分が選択した言語に合わせて次のコマンドを実行し、現在のフォルダーに関数アプリ プロジェクトを作成します。

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

空のフォルダーで次のコマンドを実行して、Maven アーキタイプから Functions プロジェクトを生成します。

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

-DjavaVersion パラメーターは、使用する Java のバージョンを Functions Runtime に指示します。 Java 11 で関数を実行する場合は、-DjavaVersion=11 を使用します。 -DjavaVersion を指定しない場合、Maven の既定値は Java 8 になります。 詳細については、「Java のバージョン」を参照してください。

重要

この記事の作業を行うには、JAVA_HOME 環境変数を、適切なバージョンの JDK のインストール場所に設定する必要があります。

Maven により、デプロイ時にプロジェクトの生成を終了するための値の入力が求められます。 プロンプトに従って、次の情報を指定します。

Prompt 説明
groupId com.fabrikam Java のパッケージ命名規則に従って、すべてのプロジェクトにわたって対象のプロジェクトを一意に識別する値。
artifactId fabrikam-functions バージョン番号のない、jar の名前である値。
version 1.0-SNAPSHOT 既定値を選択します。
package com.fabrikam.functions 生成された関数コードの Java パッケージである値。 既定値を使用します。

Y」と入力するか、Enter キーを押して確認します。

Maven により、artifactId という名前の新しいフォルダーにプロジェクト ファイルが作成されます (この例では fabrikam-functions)。

--docker オプションによって、プロジェクトの Dockerfile が生成されます。これにより、Azure Functions および選択されたランタイムで使用するための適切なコンテナーが定義されます。

プロジェクト フォルダーに移動します。

cd fabrikam-functions

次のコマンドを使用して、関数を自分のプロジェクトに追加します。ここで、--name 引数は関数の一意の名前で、--template 引数は関数のトリガーを指定するものです。 func new により、お使いのプロジェクトに C# コード ファイルが作成されます。

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

次のコマンドを使用して、関数を自分のプロジェクトに追加します。ここで、--name 引数は関数の一意の名前で、--template 引数は関数のトリガーを指定するものです。 func new によって、関数と同じ名前のサブフォルダーが作成されます。このサブフォルダーには、func new という名前の構成ファイルが含まれます。

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

関数をローカルでテストするために、プロジェクト フォルダーのルートでローカルの Azure Functions ランタイム ホストを起動します。

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

HttpExample エンドポイントが出力に書き込まれたのを確認したら、そのエンドポイントに移動します。 応答出力にウェルカム メッセージが表示されます。

HttpExample エンドポイントが出力に書き込まれたのを確認した後で、http://localhost:7071/api/HttpExample?name=Functions に移動します。 name クエリ パラメーターに指定された値、Functions をエコーバックする "hello" メッセージがブラウザーに表示されるはずです。

Ctrl+C (macOS の場合は Command+C) キーを押してホストを停止します。

コンテナー イメージを作成してローカルで検証する

(省略可) プロジェクト フォルダーのルートにある Dockerfile を確認します。 Dockerfile には、Linux 上で関数アプリを実行するために必要な環境が記述されています。 Azure Functions でサポートされている基本イメージの詳細な一覧については、Azure Functions 基本イメージ ページを参照してください。

ルート プロジェクト フォルダーで、docker build コマンドを実行し、名前に azurefunctionsimage、タグに v1.0.0 を指定します。 <DOCKER_ID> を Docker Hub アカウント ID で置換します。 このコマンドでは、コンテナーの Docker イメージがビルドされます。

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

コマンドが完了すると、新しいコンテナーをローカルで実行できます。

ビルドを検証するために、ローカル コンテナーで docker run コマンドを使用してイメージを実行します。この場合も、<DOCKER_ID> は実際の Docker Hub アカウント ID に置き換え、ポート引数として -p 8080:80 を追加してください。

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

イメージがローカル コンテナーで開始したら、http://localhost:8080/api/HttpExample に移動します。そこに、前と同じ挨拶メッセージが表示されている必要があります。 作成した HTTP トリガー関数は匿名承認を使用するため、コンテナーで実行されている関数は、アクセス キーを取得しなくても呼び出すことができます。 詳細については、承認キーに関するセクションを参照してください。

イメージがローカル コンテナーで開始したら、http://localhost:8080/api/HttpExample?name=Functions に移動します。そこに、前と同じ "hello" メッセージが表示されている必要があります。 作成した HTTP トリガー関数は匿名承認を使用するため、コンテナーで実行されている関数は、アクセス キーを取得しなくても呼び出すことができます。 詳細については、承認キーに関するセクションを参照してください。

コンテナーで関数アプリを検証したら、Ctrl+C (macOS の場合は Command+C) キーを押して実行を停止します。

コンテナー イメージをレジストリに発行する

コンテナー イメージをホスティング環境にデプロイできるようにするには、コンテナー レジストリにプッシュする必要があります。

Azure Container Registry は、コンテナー イメージおよび関連アーティクルのビルド、保管、管理をするための、プライベート レジストリ サービスです。 コンテナーを Azure サービスに発行するには、プライベート レジストリ サービスを使用する必要があります。

  1. 次のコマンドを使用して、現在の Azure 資格情報でレジストリ インスタンスにサインインします。

    az acr login --name <REGISTRY_NAME>
    

    前のコマンドで、<REGISTRY_NAME> をご自身の Container Registry インスタンスの名前に置き換えます。

  2. 次のコマンドを使用して、レジストリ ログイン サーバーの完全修飾名でイメージにタグ付けします。

    docker tag <DOCKER_ID>/azurefunctionsimage:v1.0.0 <LOGIN_SERVER>/azurefunctionsimage:v1.0.0 
    

    <LOGIN_SERVER> をレジストリ ログイン サーバーの完全修飾名に、<DOCKER_ID> を Docker ID に置き換えます。

  3. 次のコマンドを使用して、コンテナーをレジストリ インスタンスにプッシュします。

    docker push <LOGIN_SERVER>/azurefunctionsimage:v1.0.0
    

App Service Kubernetes 環境の作成

開始する前に、Azure Arc 対応 Kubernetes クラスター用の App Service Kubernetes 環境を作成する必要があります。

Note

環境を作成するときは、カスタムの場所名とカスタムの場所を含むリソース グループの名前の両方をメモしておいてください。 これらを使用すると、環境で関数アプリを作成するときに必要なカスタムの場所 ID を見つけることができます。

環境を作成していなかった場合は、クラスター管理者に確認してください。

Azure CLI の拡張機能を追加する

Azure Cloud Shell で Bash 環境を起動します。

これらの CLI コマンドはまだコア CLI セットに含まれていないため、次のコマンドを使用して追加します。

az extension add --upgrade --yes --name customlocation
az extension remove --name appservice-kube
az extension add --upgrade --yes --name appservice-kube

Azure リソースを作成する

新しい App Service Kubernetes 環境にコンテナーをデプロイする前に、次の 2 つのリソースをさらに作成する必要があります。

  • ストレージ アカウント。 この記事ではストレージ アカウントを作成しますが、場合によってはストレージ アカウントが不要なことがあります。 詳細については、ストレージに関する考慮事項についての記事の「Azure Arc 対応クラスター」を参照してください。
  • コンテナーの実行のためのコンテキストを提供する関数アプリ。 関数アプリは App Service Kubernetes 環境で実行され、ローカル関数プロジェクトにマップされます。 関数アプリを使用すると、リソースの管理、デプロイ、および共有を容易にするための論理ユニットとして関数をグループ化できます。

Note

関数アプリは、Dedicated (App Service) プランの App Service Kubernetes 環境で実行されます。 既存のプランを使用せずに関数アプリを作成すると、プランが自動的に作成されます。

ストレージ アカウントの作成

az storage account create コマンドを使用して、リソース グループとリージョン内に汎用ストレージ アカウントを作成します。

az storage account create --name <STORAGE_NAME> --location westeurope --resource-group myResourceGroup --sku Standard_LRS

Note

場合によっては、ストレージ アカウントが不要なことがあります。 詳細については、ストレージに関する考慮事項についての記事の「Azure Arc 対応クラスター」を参照してください。

前の例の <STORAGE_NAME> は、適宜、Azure Storage 内で一意の名前に置き換えてください。 名前は 3 文字から 24 文字とし、小文字のみを使用する必要があります。 Standard_LRS は汎用アカウントを指定します。これは Functions でサポートされています。 値 --location は標準の Azure リージョンです。

Function App の作成

az functionapp create コマンドを実行して、環境内に新しい関数アプリを作成します。

az functionapp create --name <APP_NAME> --custom-location <CUSTOM_LOCATION_ID> --storage-account <STORAGE_NAME> --resource-group AzureFunctionsContainers-rg --image <LOGIN_SERVER>/azurefunctionsimage:v1.0.0 --registry-username <USERNAME> --registry-password <SECURE_PASSWORD> 

この例では、<CUSTOM_LOCATION_ID> を、App Service Kubernetes 環境に対して決定したカスタムの場所の ID に置き換えます。 また、<STORAGE_NAME> を前の手順で使用したアカウントの名前に、<APP_NAME> をグローバルに一意の名前に、<DOCKER_ID> または <LOGIN_SERVER> を Docker Hub ID または Container Registry サーバーにそれぞれ置き換えます。 カスタム コンテナー レジストリからのデプロイ中は、イメージ名にレジストリの URL が表示されます。

関数アプリを初めて作成すると、Docker Hub から最初のイメージがプルされます。

必須のアプリ設定を設定する

以下のコマンドを実行して、ストレージ アカウント接続文字列のためのアプリ設定を作成します。

storageConnectionString=$(az storage account show-connection-string --resource-group AzureFunctionsContainers-rg --name <STORAGE_NAME> --query connectionString --output tsv)
az functionapp config appsettings set --name <app_name> --resource-group AzureFunctionsContainers-rg --settings AzureWebJobsStorage=$storageConnectionString

このコードは、ユーザーのローカル コンピューター上の Cloud Shell または Bash のいずれかで実行する必要があります。 <STORAGE_NAME> をストレージ アカウントの名前に、<APP_NAME> を関数アプリ名に置き換えます。

Azure 上の関数を呼び出す

この関数は HTTP トリガーを使用しているため、呼び出しは、その URL にブラウザーから HTTP 要求を送信するか、または curl などのツールを使用して行います。

publish コマンドの出力に表示されている完全な呼び出し URL にクエリ パラメーター ?name=Functions を追加して、ブラウザーのアドレス バーにコピーします。 関数をローカルで実行したときと同様の出力がブラウザーに表示されるはずです。

Azure 上で実行された関数の出力をブラウザーで表示したところ

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

この記事で作成したリソースを使用して、引き続き Azure 関数を処理する場合は、それらのリソースをすべてそのままにしてかまいません。

この関数アプリのデプロイの作業が完了したら、AzureFunctionsContainers-rg リソース グループを削除して、そのグループ内のすべてのリソースをクリーンアップします。

az group delete --name AzureFunctionsContainers-rg

これにより、この記事で作成されたリソースのみが削除されます。 基になる Azure Arc 環境はそのまま残ります。

次の手順