この記事では、ローカル コマンド ライン ツールを使用して、HTTP 要求に応答する関数を作成します。 コードをローカルで確認したら、Azure Functions のサーバーレス Flex Consumption ホスティング プランにデプロイします。
このクイックスタートを完了すると、ご利用の Azure アカウントでわずかな (数セント未満の) コストが発生します。
必ず、記事の上部にある任意の開発言語を選択してください。
Prerequisites
- アクティブなサブスクリプションを持つ Azure アカウント。 無料でアカウントを作成できます。
-
Java 17 Developer Kit
- 別のサポートされているバージョンの Java を使用する場合は、プロジェクトの pom.xml ファイルを更新する必要があります。
-
JAVA_HOME環境変数は、Java Development Kit (JDK) の正しいバージョンのインストール場所に設定する必要があります。
- Apache Maven 3.8.x
jqコマンド ライン JSON プロセッサ。JSON 出力の解析に使用され、Azure Cloud Shell でも使用できます。
Azure Functions Core Tools のインストール
Core Tools をインストールするための推奨される方法は、ローカル開発用コンピューターのオペレーティング システムによって異なります。
次の手順で、Windows インストーラー (MSI) を使用して Core Tools v4.x をインストールします。 その他のパッケージベースのインストーラーの詳細については、Core Tools の Readme をご覧ください。
Windows のバージョンに応じて、 以下の Core Tools インストーラーをダウンロードして実行します。
- v4.x - Windows 64 ビット (推奨。Visual Studio Code デバッグには 64 ビットが必要です)。
- v4.x - Windows 32 ビット
以前に Windows で Windows インストーラー (MSI) を使用して Core Tools をインストールした場合は、最新のバージョンをインストールする前に、[プログラムの追加と削除] から古いバージョンをアンインストールする必要があります。
仮想環境を作成してアクティブにする
適切なフォルダーで次のコマンドを実行し、.venv という名前の仮想環境を作成してアクティブにします。 Azure Functions でサポートされている Python バージョン のいずれかを使用してください。
python -m venv .venv
source .venv/bin/activate
お使いの Linux ディストリビューションに Python の venv パッケージがインストールされていなかった場合は、次のコマンドを実行します。
sudo apt-get install python3-venv
以降のコマンドはすべて、このアクティブ化された仮想環境で実行します
ローカル コード プロジェクトと関数を作成する
Azure Functions では、コード プロジェクトは、それぞれが特定のトリガーに応答する 1 つ以上の個別の関数を含むアプリです。 プロジェクト内のすべての関数は同じ構成を共有し、ユニットとして Azure にデプロイされます。 このセクションでは、1 つの関数を含むコード プロジェクトを作成します。
ターミナルまたはコマンド プロンプトで、次の
func initコマンドを実行して、現在のフォルダーに関数アプリ プロジェクトを作成します。func init --worker-runtime dotnet-isolated
ターミナルまたはコマンド プロンプトで、次の
func initコマンドを実行して、現在のフォルダーに関数アプリ プロジェクトを作成します。func init --worker-runtime node --language javascript
ターミナルまたはコマンド プロンプトで、次の
func initコマンドを実行して、現在のフォルダーに関数アプリ プロジェクトを作成します。func init --worker-runtime powershell
ターミナルまたはコマンド プロンプトで、次の
func initコマンドを実行して、現在のフォルダーに関数アプリ プロジェクトを作成します。func init --worker-runtime python
ターミナルまたはコマンド プロンプトで、次の
func initコマンドを実行して、現在のフォルダーに関数アプリ プロジェクトを作成します。func init --worker-runtime node --language typescript
ターミナルまたはコマンド プロンプトで、次の
func initコマンドを実行して、現在のフォルダーに関数アプリ プロジェクトを作成します。func init --worker-runtime custom
空のフォルダーで、次の
mvnコマンドを実行して、Azure Functions Maven アーキタイプからコード プロジェクトを生成します。mvn archetype:generate -DarchetypeGroupId=com.microsoft.azure -DarchetypeArtifactId=azure-functions-archetype -DjavaVersion=17Important
- Java 11 で関数を実行する場合は、
-DjavaVersion=11を使用します。 詳細については、 Java のバージョンを参照してください。 - この記事を完了するには、
JAVA_HOME環境変数を適切なバージョンの JDK のインストール場所に設定します。
- Java 11 で関数を実行する場合は、
Maven により、デプロイ時にプロジェクトの生成を終了するための値の入力が求められます。
入力を求められたら、次の値を入力します。Prompt Value Description groupId com.fabrikamJava のパッケージ命名規則に従って、すべてのプロジェクトにわたって対象のプロジェクトを一意に識別する値。 artifactId fabrikam-functionsバージョン番号のない、jar の名前である値。 version 1.0-SNAPSHOT既定値を選択します。 package com.fabrikam生成された関数コードの Java パッケージである値。 既定値を使用します。 「
Y」と入力するか、Enter キーを押して確認します。Maven は 、artifactId という名前の新しいフォルダーにプロジェクト ファイルを作成します。この例では、
fabrikam-functions。プロジェクト フォルダーに移動します。
cd fabrikam-functions\src\main\java\com\fabrikam プロジェクト ディレクトリのFunction.javaで、新しい HTTP トリガー関数のテンプレートで生成されたコードを確認できます。
次の
func newコマンドを使用して、プロジェクトに関数を追加します。func new --name HttpExample --template "HTTP trigger" --authlevel "function"新しいコード ファイルがプロジェクトに追加されます。 この場合、
--name引数は関数の一意の名前 (HttpExample) であり、--template引数は HTTP トリガーを指定します。
プロジェクト のルート フォルダーには、local.settings.jsonや host.json という名前の構成ファイルなど、プロジェクトのさまざまなファイルが含 まれています 。 local.settings.json には Azure からダウンロードしたシークレットを含めることができるため、ファイルは既定で .gitignore ファイルのソース管理から除外されます。
関数を作成してビルドする
HTTP トリガー関数は、HttpExample フォルダー内の function.json ファイルで宣言されています。 この関数を完成させるには、ハンドラーを追加し、実行可能ファイルにコンパイルします。
Ctrl + N (macOS の場合は Cmd + N) キーを押して新しいファイルを作成します。 それを関数アプリのルート (host.json と同じフォルダー) に handler.go として保存します。
handler.go に次のコードを追加して、ファイルを保存します。 これが Go のカスタム ハンドラーです。
package main import ( "fmt" "log" "net/http" "os" ) func helloHandler(w http.ResponseWriter, r *http.Request) { message := "This HTTP triggered function executed successfully. Pass a name in the query string for a personalized response.\n" name := r.URL.Query().Get("name") if name != "" { message = fmt.Sprintf("Hello, %s. This HTTP triggered function executed successfully.\n", name) } fmt.Fprint(w, message) } func main() { listenAddr := ":8080" if val, ok := os.LookupEnv("FUNCTIONS_CUSTOMHANDLER_PORT"); ok { listenAddr = ":" + val } http.HandleFunc("/api/HttpExample", helloHandler) log.Printf("About to listen on %s. Go to https://127.0.0.1%s/", listenAddr, listenAddr) log.Fatal(http.ListenAndServe(listenAddr, nil)) }Ctrl + Shift + ` キーを押すか、[ターミナル] メニューの [新しいターミナル] を選択して、新しい統合ターミナルを VS Code で開きます。
次のコマンドを使用してカスタム ハンドラーをコンパイルします。 関数アプリのルート フォルダーに、
handler(Windows の場合はhandler.exe) という名前の実行可能ファイルが出力されます。go build handler.go
関数アプリを構成する
関数のホストは、起動時にカスタム ハンドラーのバイナリを実行するよう構成する必要があります。
host.json を開きます。
customHandler.descriptionセクションで、defaultExecutablePathの値をhandlerに設定します (Windows の場合はhandler.exeに設定します)。customHandlerセクションで、enableForwardingHttpRequestという名前のプロパティを追加し、その値をtrueに設定します。 HTTP トリガーのみで構成される関数の場合、この設定により、カスタム ハンドラーの要求ペイロードではなく、標準的な HTTP 要求を使用できるようになるため、プログラミングが容易になります。customHandlerセクションが次の例のようになっていることを確認します。 ファイルを保存します。"customHandler": { "description": { "defaultExecutablePath": "handler", "workingDirectory": "", "arguments": [] }, "enableForwardingHttpRequest": true }
この関数アプリは、カスタム ハンドラーの実行可能ファイルを起動するように構成されました。
関数をローカルで実行する
プロジェクトをローカルで実行し、関数エンドポイントを呼び出して、新しい関数を確認します。
次のコマンドを使用して、プロジェクト フォルダーのルートにあるローカル Azure Functions ランタイム ホストを開始します。
func startnpm install npm startmvn clean package mvn azure-functions:run出力の末尾には、次の行が表示されます。
... Now listening on: http://0.0.0.0:7071 Application started. Press Ctrl+C to shut down. Http Functions: HttpExample: [GET,POST] http://localhost:7071/api/HttpExample ...HttpExample関数の URL をこの出力からブラウザーにコピーし、関数の URL を参照します。 "hello world" というメッセージが表示された成功応答を受け取ります。Note
ローカルで実行する場合、アクセス キーの承認は適用されないため、返される関数の URL にはアクセス キーの値が含まれていないため、関数を呼び出すために必要ありません。
完了したら、Ctrl+キーを使用し、
yを選択して関数ホストを停止します。
関数用の関連 Azure リソースを作成する
関数コードを Azure にデプロイする前に、次のリソースを作成する必要があります。
- リソース グループ。関連リソースの論理コンテナーです。
- 既定のストレージ アカウント。関数の状態とその他の情報を維持するために、関数ホストによって使用されます。
- ユーザーが割り当てたマネージドIDで、Functions ホストが既定のストレージ アカウントに接続します。
- 関数アプリ。関数コードを実行するための環境となります。 関数アプリは、ローカルの関数プロジェクトと対応関係にあります。これを使用すると、リソースの管理、デプロイ、共有を容易にするための論理ユニットとして関数をグループ化できます。
これらの手順の Azure CLI コマンドを使用して、必要なリソースを作成します。
まだ Azure にサインインしていない場合は、Azure にサインインします。
az loginaz loginコマンドで Azure アカウントにサインインします。 Azure Cloud Shell で実行する場合は、この手順をスキップします。まだ実行していない場合は、次の
az extension addコマンドを使用して Application Insights 拡張機能をインストールします。az extension add --name application-insights次の az group create コマンドを使用して、選択したリージョンに
AzureFunctionsQuickstart-rgという名前のリソース グループを作成します。az group create --name "AzureFunctionsQuickstart-rg" --location "<REGION>"この例では、
<REGION>を、Flex 従量課金プランをサポートする近くのリージョンに置き換えます。 az functionapp list-flexconsumption-locations コマンドを使用して、現在サポートされているリージョンの一覧を表示します。次の az storage account create コマンドを使用して、リソース グループとリージョンに汎用ストレージ アカウントを作成します。
az storage account create --name <STORAGE_NAME> --location "<REGION>" --resource-group "AzureFunctionsQuickstart-rg" \ --sku "Standard_LRS" --allow-blob-public-access false --allow-shared-key-access falseこの例では、
<STORAGE_NAME>を自分に適した名前に置き換え、Azure Storage で一意の名前に置き換えます。 名前は 3 文字から 24 文字とし、小文字のみを使用する必要があります。Standard_LRSは汎用アカウントを指定します。これは Functions でサポートされています。 この新しいアカウントには、特定のリソースへのアクセス許可が付与されている Microsoft Entra 認証 ID を使用してのみアクセスできます。このスクリプトを使用して、ユーザー割り当てマネージド ID を作成し、
jqを使用してオブジェクトの返された JSON プロパティを解析し、既定のストレージ アカウントでStorage Blob Data Ownerアクセス許可を付与します。output=$(az identity create --name "func-host-storage-user" --resource-group "AzureFunctionsQuickstart-rg" --location <REGION> \ --query "{userId:id, principalId: principalId, clientId: clientId}" -o json) userId=$(echo $output | jq -r '.userId') principalId=$(echo $output | jq -r '.principalId') clientId=$(echo $output | jq -r '.clientId') storageId=$(az storage account show --resource-group "AzureFunctionsQuickstart-rg" --name <STORAGE_NAME> --query 'id' -o tsv) az role assignment create --assignee-object-id $principalId --assignee-principal-type ServicePrincipal \ --role "Storage Blob Data Owner" --scope $storageIdローカルの Bash シェルに
jqユーティリティがない場合は、Azure Cloud Shell で使用できます。 この例では、<STORAGE_NAME>と<REGION>をそれぞれ既定のストレージ アカウント名とリージョンに置き換えます。az identity create コマンドは、
func-host-storage-userという名前の ID を作成します。 返されたprincipalIdは、az role assignment createコマンドを使用して、既定のストレージ アカウントでこの新しい ID にアクセス許可を割り当てるために使用されます。az storage account showコマンドを使用して、ストレージ アカウント ID を取得します。次の az functionapp create コマンドを使用して、Azure で関数アプリを作成します。
az functionapp create --resource-group "AzureFunctionsQuickstart-rg" --name <APP_NAME> --flexconsumption-location <REGION> \ --runtime dotnet-isolated --runtime-version <LANGUAGE_VERSION> --storage-account <STORAGE_NAME> \ --deployment-storage-auth-type UserAssignedIdentity --deployment-storage-auth-value "func-host-storage-user"az functionapp create --resource-group "AzureFunctionsQuickstart-rg" --name <APP_NAME> --flexconsumption-location <REGION> \ --runtime java --runtime-version <LANGUAGE_VERSION> --storage-account <STORAGE_NAME> \ --deployment-storage-auth-type UserAssignedIdentity --deployment-storage-auth-value "func-host-storage-user"az functionapp create --resource-group "AzureFunctionsQuickstart-rg" --name <APP_NAME> --flexconsumption-location <REGION> \ --runtime node --runtime-version <LANGUAGE_VERSION> --storage-account <STORAGE_NAME> \ --deployment-storage-auth-type UserAssignedIdentity --deployment-storage-auth-value "func-host-storage-user"az functionapp create --resource-group "AzureFunctionsQuickstart-rg" --name <APP_NAME> --flexconsumption-location <REGION> \ --runtime python --runtime-version <LANGUAGE_VERSION> --storage-account <STORAGE_NAME> \ --deployment-storage-auth-type UserAssignedIdentity --deployment-storage-auth-value "func-host-storage-user"az functionapp create --resource-group "AzureFunctionsQuickstart-rg" --name <APP_NAME> --flexconsumption-location <REGION> \ --runtime python --runtime-version <LANGUAGE_VERSION> --storage-account <STORAGE_NAME> \ --deployment-storage-auth-type UserAssignedIdentity --deployment-storage-auth-value "func-host-storage-user"az functionapp create --resource-group "AzureFunctionsQuickstart-rg" --name <APP_NAME> --flexconsumption-location <REGION> \ --runtime other --storage-account <STORAGE_NAME> \ --deployment-storage-auth-type UserAssignedIdentity --deployment-storage-auth-value "func-host-storage-user"この例では、これらのプレースホルダーを適切な値に置き換えます。
-
<APP_NAME>: 自分に適したグローバルに一意の名前。<APP_NAME>は、関数アプリの既定の DNS ドメインでもあります。 -
<STORAGE_NAME>: 前の手順で使用したアカウントの名前。 -
<REGION>: 現在のリージョン。 -
<LANGUAGE_VERSION>: 必要に応じて、ローカルで確認したのと同じ サポートされている言語スタック バージョン を使用します。
このコマンドは、 Flex 従量課金プランで Linux 上の指定された言語ランタイムで実行されている関数アプリを作成します。これは、ここで発生する使用量に対して無料です。 このコマンドでは、関連付けられている Azure Application Insights インスタンスも同じリソース グループに作成されます。このインスタンスを使用して、関数アプリの実行を監視し、ログを表示できます。 詳しくは、「Azure Functions を監視する」をご覧ください。 このインスタンスは、アクティブにするまでコストが発生しません。
-
このスクリプトを使用して、Application Insights インスタンスの Monitoring Metrics Publisher ロールにユーザー割り当てマネージド ID を追加します。
appInsights=$(az monitor app-insights component show --resource-group "AzureFunctionsQuickstart-rg" \ --app <APP_NAME> --query "id" --output tsv) principalId=$(az identity show --name "func-host-storage-user" --resource-group "AzureFunctionsQuickstart-rg" \ --query principalId -o tsv) az role assignment create --role "Monitoring Metrics Publisher" --assignee $principalId --scope $appInsightsこの例では、
<APP_NAME>をお使いの関数アプリの名前に置き換えます。 az role assignment create コマンドによって、ユーザーがロールに追加されます。 Application Insights インスタンスのリソース ID とユーザーのプリンシパル ID は、az monitor app-insights コンポーネント show コマンドとaz identity showコマンドをそれぞれ使用して取得されます。
アプリケーション設定を更新する
Functions ホストが共有シークレットを使用して既定のストレージ アカウントに接続できるようにするには、 AzureWebJobsStorage 接続文字列の設定を、プレフィックスとして AzureWebJobsStorage__ で始まるいくつかの設定に置き換えます。 これらの設定は、ユーザー割り当てマネージド ID を使用してストレージと Application Insights に接続するためにアプリが使用する複雑な設定を定義します。
このスクリプトを使用して、ユーザー割り当てマネージド ID のクライアント ID を取得し、それを使用してストレージと Application Insights の両方へのマネージド ID 接続を定義します。
clientId=$(az identity show --name func-host-storage-user \ --resource-group AzureFunctionsQuickstart-rg --query 'clientId' -o tsv) az functionapp config appsettings set --name <APP_NAME> --resource-group "AzureFunctionsQuickstart-rg" \ --settings AzureWebJobsStorage__accountName=<STORAGE_NAME> \ AzureWebJobsStorage__credential=managedidentity AzureWebJobsStorage__clientId=$clientId \ APPLICATIONINSIGHTS_AUTHENTICATION_STRING="ClientId=$clientId;Authorization=AAD"このスクリプトでは、
<APP_NAME>と<STORAGE_NAME>をそれぞれ関数アプリとストレージ アカウントの名前に置き換えます。az functionapp config appsettings delete コマンドを実行して、共有秘密鍵を含む既存の
AzureWebJobsStorage接続文字列設定を削除します。az functionapp config appsettings delete --name <APP_NAME> --resource-group "AzureFunctionsQuickstart-rg" --setting-names AzureWebJobsStorageこの例では、
<APP_NAME>を関数アプリの名前に置き換えます。
この時点で、Functions ホストは、共有シークレットではなくマネージド ID を使用して、ストレージ アカウントに安全に接続できます。 これで、プロジェクト コードを Azure リソースにデプロイできるようになりました。
Azure に関数プロジェクトをデプロイする
Azure 内に関数アプリを作成することに成功したら、func azure functionapp publish コマンドを使用してローカル関数プロジェクトをデプロイする準備が整います。
ルート プロジェクト フォルダーで、次の
func azure functionapp publishコマンドを実行します。func azure functionapp publish <APP_NAME>この例では、
<APP_NAME>をご自身のアプリの名前に置き換えてください。 デプロイが成功すると、次の出力のような結果 (簡潔にするために切り詰められています) が表示されます。... Getting site publishing info... Creating archive for current directory... Performing remote build for functions project. ... Deployment successful. Remote build succeeded! Syncing triggers... Functions in msdocs-azurefunctions-qs: HttpExample - [httpTrigger] Invoke url: https://msdocs-azurefunctions-qs.azurewebsites.net/api/httpexampleローカル ターミナルまたはコマンド プロンプトで、次のコマンドを実行して、アクセス キーを含む URL エンドポイント値を取得します。
func azure functionapp list-functions <APP_NAME> --show-keysこの例では、
<APP_NAME>をアプリの名前に置き換えます。関数エンドポイントの呼び出しに使用する、返されたエンドポイント URL とキーをコピーします。
pom.xml ファイルを更新する
Azure で関数アプリを正常に作成したら、Maven が新しいアプリにデプロイできるように、pom.xml ファイルを更新します。 それ以外の場合、Maven はデプロイ時に Azure リソースの新しいセットを作成します。
Azure Cloud Shell で、次の
az functionapp showコマンドを使用して、新しいユーザー割り当てマネージド ID のデプロイ コンテナーの URL と ID を取得します。az functionapp show --name <APP_NAME> --resource-group AzureFunctionsQuickstart-rg \ --query "{userAssignedIdentityResourceId: properties.functionAppConfig.deployment.storage.authentication.userAssignedIdentityResourceId, \ containerUrl: properties.functionAppConfig.deployment.storage.value}"この例では、
<APP_NAME>を関数アプリの名前に置き換えます。プロジェクトのルート ディレクトリで、テキスト エディターで pom.xml ファイルを開き、
properties要素を見つけて、次の特定のプロパティ値を更新します。プロパティ名 Value java.versionなど、ローカルで確認したのと同じ 17を使用します。azure.functions.maven.plugin.version1.37.1azure.functions.java.library.version3.1.0functionAppNameAzure の関数アプリの名前。 configurationのazure-functions-maven-pluginセクションを見つけて、次の XML フラグメントに置き換えます。<configuration> <appName>${functionAppName}</appName> <resourceGroup>AzureFunctionsQuickstart-rg</resourceGroup> <pricingTier>Flex Consumption</pricingTier> <region>....</region> <runtime> <os>linux</os> <javaVersion>${java.version}</javaVersion> </runtime> <deploymentStorageAccount>...</deploymentStorageAccount> <deploymentStorageResourceGroup>AzureFunctionsQuickstart-rg</deploymentStorageResourceGroup> <deploymentStorageContainer>...</deploymentStorageContainer> <storageAuthenticationMethod>UserAssignedIdentity</storageAuthenticationMethod> <userAssignedIdentityResourceId>...</userAssignedIdentityResourceId> <appSettings> <property> <name>FUNCTIONS_EXTENSION_VERSION</name> <value>~4</value> </property> </appSettings> </configuration>新しい
configuration要素で、省略記号 (...) の値を次のように置き換えます。Configuration Value regioneastusなど、既存の関数アプリのリージョン コード。deploymentStorageAccountご利用のストレージ アカウントの名前。 deploymentStorageContainer展開共有の名前。これは、取得した \値のcontainerUrlの後に付けられます。userAssignedIdentityResourceId取得したマネージド ID の完全修飾リソース ID。 変更をpom.xml ファイルに保存します。
Maven を使用して、コード プロジェクトを既存のアプリにデプロイできるようになりました。
Azure に関数プロジェクトをデプロイする
コマンド プロンプトで、このコマンドを実行します。
mvn clean package azure-functions:deployデプロイが成功したら、次の Core Tools コマンドを実行して、アクセス キーを含む URL エンドポイント値を取得します。
func azure functionapp list-functions <APP_NAME> --show-keysこの例では、
<APP_NAME>をアプリの名前に置き換えます。関数エンドポイントの呼び出しに使用する、返されたエンドポイント URL とキーをコピーします。
Azure 上の関数を呼び出す
関数は HTTP トリガーを使用し、GET 要求をサポートしているため、関数レベルのアクセス キーを使用して URL への HTTP 要求を行って呼び出します。 ブラウザーで GET 要求を実行するのが最も簡単です。
コピーした URL とアクセス キーをブラウザーのアドレス バーに貼り付けます。
エンドポイント URL は次の例のようになります。
https://contoso-app.azurewebsites.net/api/httpexample?code=aabbccdd...
この場合、エンドポイント URL に対して GET 要求を行うときに、クエリ文字列にアクセス キーを指定する必要もあります。 ランダム クライアントからのアクセスを制限するには、アクセス キーを使用することをお勧めします。 HTTP クライアントを使用して POST 要求を行う場合は、代わりに x-functions-key ヘッダーにアクセス キーを指定する必要があります。
この URL にアクセスすると、この関数をローカルで実行したときと同様の出力がブラウザーに表示されるはずです。
リソースをクリーンアップする
次の手順に進み、Azure Storage キューの出力バインドを追加する場合は、既に行ったことに基づいて構築するので、すべてのリソースを所定の位置に保持します。
それ以外の場合は、追加コストの発生を避けるために、次のコマンドを使用して、リソース グループとそこに含まれるすべてのリソースを削除してください。
az group delete --name AzureFunctionsQuickstart-rg