クイック スタート: Azure Developer CLI を使用して関数を作成して Azure Functions にデプロイする
このクイック スタートでは、Azure Developer コマンド ライン ツールを使用して、HTTP 要求に応答する関数を作成します。 コードをローカルでテストした後、Azure Functions の Flex 従量課金プランで実行して作成した新しいサーバーレス関数アプリにデプロイします。
プロジェクト ソースでは、Azure へのコードのデプロイを簡略化するために Azure Developer CLI (azd) が使用されます。 このデプロイは、セキュリティで保護されたスケーラブルな Azure Functions デプロイの最新のベスト プラクティスに従います。
重要
Flex 従量課金プランは現在、プレビュー段階です。
既定では、Flex 従量課金プランは、"従量課金制" 課金モデルに従います。つまり、このクイック スタートを完了すると、Azure アカウントで数 USD セント以下の少量のコストが発生します。
前提条件
アクティブなサブスクリプションが含まれる Azure アカウント。 無料でアカウントを作成できます。
- Java 17 Developer Kit
- 別のサポートされているバージョンの Java を使用する場合は、プロジェクトの pom.xml ファイルを更新する必要があります。
JAVA_HOME
環境変数を、適切なバージョンの JDK のインストール場所に設定する必要があります。
- Apache Maven 3.8.x
- JSON ペイロードを含む要求を関数エンドポイントに送信するための 安全な HTTP テスト ツール。 この記事では、
curl
を使用します。
プロジェクトを初期化する
azd init
コマンドを使用して、テンプレートからローカルの Azure Functions コード プロジェクトを作成できます。
ローカル ターミナルまたはコマンド プロンプトで、空のフォルダーで次の
azd init
コマンドを実行します。azd init --template functions-quickstart-dotnet-azd -e flexquickstart-dotnet
このコマンドにより、テンプレート リポジトリからプロジェクト ファイルがプルされ、現在のフォルダー内のプロジェクトが初期化されます。
-e
フラグでは、現在の環境の名前が設定されます。azd
では、環境はアプリの一意のデプロイ コンテキストを維持するために使用され、複数を定義できます。 これは、Azure で作成するリソース グループの名前でも使用されます。次のコマンドを実行して、
http
アプリ フォルダーに移動します。cd http
local.settings.json という名前のファイルを、次の JSON データを含む
http
フォルダーに作成します。{ "IsEncrypted": false, "Values": { "AzureWebJobsStorage": "UseDevelopmentStorage=true", "FUNCTIONS_WORKER_RUNTIME": "dotnet-isolated" } }
このファイルは、ローカルで実行する場合に必要です。
ローカル ターミナルまたはコマンド プロンプトで、空のフォルダーで次の
azd init
コマンドを実行します。azd init --template azure-functions-java-flex-consumption-azd -e flexquickstart-java
このコマンドにより、テンプレート リポジトリからプロジェクト ファイルがプルされ、現在のフォルダー内のプロジェクトが初期化されます。
-e
フラグでは、現在の環境の名前が設定されます。azd
では、環境はアプリの一意のデプロイ コンテキストを維持するために使用され、複数を定義できます。 これは、Azure で作成するリソース グループの名前でも使用されます。次のコマンドを実行して、
http
アプリ フォルダーに移動します。cd http
local.settings.json という名前のファイルを、次の JSON データを含む
http
フォルダーに作成します。{ "IsEncrypted": false, "Values": { "AzureWebJobsStorage": "UseDevelopmentStorage=true", "FUNCTIONS_WORKER_RUNTIME": "java" } }
このファイルは、ローカルで実行する場合に必要です。
ローカル ターミナルまたはコマンド プロンプトで、空のフォルダーで次の
azd init
コマンドを実行します。azd init --template functions-quickstart-javascript-azd -e flexquickstart-js
このコマンドにより、テンプレート リポジトリからプロジェクト ファイルがプルされ、ルート フォルダー内のプロジェクトが初期化されます。
-e
フラグでは、現在の環境の名前が設定されます。azd
では、環境はアプリの一意のデプロイ コンテキストを維持するために使用され、複数を定義できます。 これは、Azure で作成するリソース グループの名前でも使用されます。local.settings.json という名前のファイルを、次の JSON データを含むルート フォルダーに作成します。
{ "IsEncrypted": false, "Values": { "AzureWebJobsStorage": "UseDevelopmentStorage=true", "FUNCTIONS_WORKER_RUNTIME": "node" } }
このファイルは、ローカルで実行する場合に必要です。
ローカル ターミナルまたはコマンド プロンプトで、空のフォルダーで次の
azd init
コマンドを実行します。azd init --template functions-quickstart-powershell-azd -e flexquickstart-ps
このコマンドにより、テンプレート リポジトリからプロジェクト ファイルがプルされ、ルート フォルダー内のプロジェクトが初期化されます。
-e
フラグでは、現在の環境の名前が設定されます。azd
では、環境はアプリの一意のデプロイ コンテキストを維持するために使用され、複数を定義できます。 これは、Azure で作成するリソース グループの名前でも使用されます。次のコマンドを実行して、
src
アプリ フォルダーに移動します。cd src
local.settings.json という名前のファイルを、次の JSON データを含む
src
フォルダーに作成します。{ "IsEncrypted": false, "Values": { "AzureWebJobsStorage": "UseDevelopmentStorage=true", "FUNCTIONS_WORKER_RUNTIME": "powershell", "FUNCTIONS_WORKER_RUNTIME_VERSION": "7.2" } }
このファイルは、ローカルで実行する場合に必要です。
ローカル ターミナルまたはコマンド プロンプトで、空のフォルダーで次の
azd init
コマンドを実行します。azd init --template functions-quickstart-typescript-azd -e flexquickstart-ts
このコマンドにより、テンプレート リポジトリからプロジェクト ファイルがプルされ、ルート フォルダー内のプロジェクトが初期化されます。
-e
フラグでは、現在の環境の名前が設定されます。azd
では、環境はアプリの一意のデプロイ コンテキストを維持するために使用され、複数を定義できます。 これは、Azure で作成するリソース グループの名前でも使用されます。local.settings.json という名前のファイルを、次の JSON データを含むルート フォルダーに作成します。
{ "IsEncrypted": false, "Values": { "AzureWebJobsStorage": "UseDevelopmentStorage=true", "FUNCTIONS_WORKER_RUNTIME": "node" } }
このファイルは、ローカルで実行する場合に必要です。
ローカル ターミナルまたはコマンド プロンプトで、空のフォルダーで次の
azd init
コマンドを実行します。azd init --template functions-quickstart-python-http-azd -e flexquickstart-py
このコマンドにより、テンプレート リポジトリからプロジェクト ファイルがプルされ、ルート フォルダー内のプロジェクトが初期化されます。
-e
フラグでは、現在の環境の名前が設定されます。azd
では、環境はアプリの一意のデプロイ コンテキストを維持するために使用され、複数を定義できます。 これは、Azure で作成するリソース グループの名前でも使用されます。local.settings.json という名前のファイルを、次の JSON データを含むルート フォルダーに作成します。
{ "IsEncrypted": false, "Values": { "AzureWebJobsStorage": "UseDevelopmentStorage=true", "FUNCTIONS_WORKER_RUNTIME": "python" } }
このファイルは、ローカルで実行する場合に必要です。
仮想環境を作成してアクティブにする
ルート フォルダーで、次のコマンドを実行して、.venv
という名前の仮想環境を作成してアクティブにします。
python3 -m venv .venv
source .venv/bin/activate
お使いの Linux ディストリビューションに Python の venv パッケージがインストールされていなかった場合は、次のコマンドを実行します。
sudo apt-get install python3-venv
ローカル環境で実行する
ターミナルまたはコマンド プロンプトでアプリ フォルダーから次のコマンドを実行します。
func start
mvn clean package mvn azure-functions:run
npm install func start
npm install npm start
Functions ホストがローカル プロジェクト フォルダーで起動すると、HTTP によってトリガーされる関数の URL エンドポイントがターミナル出力に書き込まれます。
ブラウザーで、
httpget
エンドポイントに移動します。これは、次の URL のようになるはずです。新しいターミナルまたはコマンド プロンプト ウィンドウから、次の
curl
コマンドを実行して、JSON ペイロードを含む POST 要求をhttppost
エンドポイントに送信します。curl -i http://localhost:7071/api/httppost -H "Content-Type: text/json" -d @testdata.json
curl -i http://localhost:7071/api/httppost -H "Content-Type: text/json" -d "@src/functions/testdata.json"
このコマンドにより、
testdata.json
プロジェクト ファイルから JSON ペイロード データが読み取られます。 両方の HTTP 要求の例はtest.http
プロジェクト ファイルにあります。完了したら、ターミナル ウィンドウで Ctrl + C キーを押して、
func.exe
ホスト プロセスを停止します。
deactivate
を実行して仮想環境をシャットダウンします。
コードの確認 (省略可能)
2 つの HTTP トリガー関数エンドポイントを定義するコードを確認できます。
[Function("httpget")]
public IActionResult Run([HttpTrigger(AuthorizationLevel.Function, "get")]
HttpRequest req,
string name)
{
var returnValue = string.IsNullOrEmpty(name)
? "Hello, World."
: $"Hello, {name}.";
_logger.LogInformation($"C# HTTP trigger function processed a request for {returnValue}.");
return new OkObjectResult(returnValue);
}
@FunctionName("httpget")
public HttpResponseMessage run(
@HttpTrigger(
name = "req",
methods = {HttpMethod.GET},
authLevel = AuthorizationLevel.FUNCTION)
HttpRequestMessage<Optional<String>> request,
final ExecutionContext context) {
context.getLogger().info("Java HTTP trigger processed a request.");
// Parse query parameter
String name = Optional.ofNullable(request.getQueryParameters().get("name")).orElse("World");
return request.createResponseBuilder(HttpStatus.OK).body("Hello, " + name).build();
}
const { app } = require('@azure/functions');
app.http('httpget', {
methods: ['GET'],
authLevel: 'function',
handler: async (request, context) => {
context.log(`Http function processed request for url "${request.url}"`);
const name = request.query.get('name') || await request.text() || 'world';
return { body: `Hello, ${name}!` };
}
});
import { app, HttpRequest, HttpResponseInit, InvocationContext } from "@azure/functions";
export async function httpGetFunction(request: HttpRequest, context: InvocationContext): Promise<HttpResponseInit> {
context.log(`Http function processed request for url "${request.url}"`);
const name = request.query.get('name') || await request.text() || 'world';
return { body: `Hello, ${name}!` };
};
app.http('httpget', {
methods: ['GET'],
authLevel: 'function',
handler: httpGetFunction
});
この function.json
ファイルにより、httpget
関数が定義されます。
{
"bindings": [
{
"authLevel": "function",
"type": "httpTrigger",
"direction": "in",
"name": "Request",
"methods": [
"get"
],
"route": "httpget"
},
{
"type": "http",
"direction": "out",
"name": "Response"
}
]
}
この run.ps1
ファイルでは、関数コードが実装されます。
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
$name = $Request.Query.name
$body = "This HTTP triggered function executed successfully. Pass a name in the query string for a personalized response."
if ($name) {
$body = "Hello, $name. This HTTP triggered function executed successfully."
}
# Associate values to output bindings by calling 'Push-OutputBinding'.
Push-OutputBinding -Name Response -Value ([HttpResponseContext]@{
StatusCode = [HttpStatusCode]::OK
Body = $body
})
@app.route(route="httpget", methods=["GET"])
def http_get(req: func.HttpRequest) -> func.HttpResponse:
name = req.params.get("name", "World")
logging.info(f"Processing GET request. Name: {name}")
return func.HttpResponse(f"Hello, {name}!")
完全なテンプレート プロジェクトをこちらで確認できます。
完全なテンプレート プロジェクトをこちらで確認できます。
完全なテンプレート プロジェクトをこちらで確認できます。
完全なテンプレート プロジェクトをこちらで確認できます。
完全なテンプレート プロジェクトをこちらで確認できます。
完全なテンプレート プロジェクトをこちらで確認できます。
関数をローカルで検証したら、Azure に発行します。
Azure リソースを作成する
このプロジェクトは、azd provision
コマンドを使用して、Flex 従量課金プランで関数アプリを、他の必要な Azure リソースと共に作成するように構成されています。
Note
このプロジェクトには、ベスト プラクティスに従った Flex 従量課金プランへの安全なデプロイを作成するために azd
で使用される Bicep ファイルのセットが含まれています。
azd up
および azd deploy
コマンドは、現在、Java アプリではサポートされていません。
プロジェクトのルート フォルダーで、次のコマンドを実行して、必要な Azure リソースを作成します。
azd provision
ルート フォルダーには、
azd
に必要なazure.yaml
定義ファイルが含まれています。まだサインインしていない場合は、Azure アカウントで認証するように求められます。
プロンプトが表示されたら、次の必須のデプロイ パラメーターを指定します。
パラメーター 説明 Azure サブスクリプション リソースが作成されるサブスクリプション。 Azure の場所 新しい Azure リソースを含むリソース グループを作成する Azure リージョン。 現在、Flex 従量課金プランをサポートしているリージョンのみが表示されます。 azd provision
コマンドでは、Bicep 構成ファイルでこれらのプロンプトに対する応答を使用して、必要な Azure リソースを作成して構成します。- Flex 従量課金プランと関数アプリ
- Azure Storage (必須) と Application Insights (推奨)
- アカウントのアクセス ポリシーとロール
- マネージド ID を使用したサービス間接続 (格納されている接続文字列の代わり)
- 関数アプリとその他の Azure リソースの両方を安全に実行するための仮想ネットワーク
コマンドが正常に完了した後、Azure のこの新しい関数アプリにプロジェクト コードをデプロイできます。
Azure に配置する
Core Tools を使用してコードをパッケージ化し、target
出力フォルダーから Azure にデプロイできます。
target
出力フォルダー内の同等のアプリ フォルダーに移動します。cd http/target/azure-functions/contoso-functions
このフォルダーには、コンパイル済みの Java 関数アプリのルートであることを示す host.json ファイルが必要です。
Core Tools を使用して、コンパイル済みの Java コード プロジェクトを Azure の新しい関数アプリ リソースにデプロイするには、次のコマンドを実行します。
azd env get-value
コマンドでは、ローカル環境から関数アプリ名を取得します。これは、func azure functionapp publish
を使用したデプロイに必要です。 発行が正常に完了した後、Azure の HTTP トリガー エンドポイントへのリンクが表示されます。
Azure に配置する
このプロジェクトは、azd up
コマンドを使用して、Azure の Flex 従量課金プランの新しい関数アプリにこのプロジェクトをデプロイするように構成されています。
ヒント
このプロジェクトには、ベスト プラクティスに従った Flex 従量課金プランへの安全なデプロイを作成するために azd
で使用される Bicep ファイルのセットが含まれています。
次のコマンドを実行し、
azd
で必要な Azure リソースを Azure に作成し、コード プロジェクトを新しい関数アプリにデプロイします。azd up
ルート フォルダーには、
azd
に必要なazure.yaml
定義ファイルが含まれています。まだサインインしていない場合は、Azure アカウントで認証するように求められます。
プロンプトが表示されたら、次の必須のデプロイ パラメーターを指定します。
パラメーター 説明 Azure サブスクリプション リソースが作成されるサブスクリプション。 Azure の場所 新しい Azure リソースを含むリソース グループを作成する Azure リージョン。 現在、Flex 従量課金プランをサポートしているリージョンのみが表示されます。 azd up
コマンドでは、Bicep 構成ファイルでこれらのプロンプトに対する応答を使用して、次のデプロイ タスクを完了します。次の必要な Azure リソースを作成して構成します (
azd provision
と同等)。- Flex 従量課金プランと関数アプリ
- Azure Storage (必須) と Application Insights (推奨)
- アカウントのアクセス ポリシーとロール
- マネージド ID を使用したサービス間接続 (格納されている接続文字列の代わり)
- 関数アプリとその他の Azure リソースの両方を安全に実行するための仮想ネットワーク
コードをパッケージ化し、デプロイ コンテナーにデプロイします (
azd deploy
と同等)。 その後、アプリが起動し、デプロイされたパッケージで実行されます。
コマンドが正常に完了した後、作成したリソースへのリンクが表示されます。
Azure 上の関数を呼び出す
HTTP テスト ツールまたはブラウザー (GET 要求の場合) を使用して URL への HTTP 要求を行うことで、Azure で関数エンドポイントを呼び出せるようになりました。 関数が Azure で実行されると、アクセス キーの承認が適用され、要求に関数アクセス キーを指定する必要があります。
Core Tools を使用して、Azure で実行されている関数の URL エンドポイントを取得できます。
ローカル ターミナルまたはコマンド プロンプトで、次のコマンドを実行して URL エンドポイント値を取得します。
$APP_NAME = azd env get-value AZURE_FUNCTION_NAME func azure functionapp list-functions $APP_NAME --show-keys
azd env get-value
コマンドでは、ローカル環境から関数アプリ名が取得されます。func azure functionapp list-functions
で--show-keys
オプションを使用することは、返される呼び出し URL: 各エンドポイントの値に関数レベルのアクセス キーが含まれていることを意味します。前と同様に、HTTP テスト ツールを使用して、Azure で実行されている関数アプリでこれらの URL を検証します。
コードを再デプロイする
azd up
コマンドは、Azure リソースのプロビジョニングとコード更新プログラムの関数アプリへのデプロイの両方に必要な回数だけ実行できます。
Note
デプロイされたコード ファイルは常に最新のデプロイ パッケージによって上書きされます。
azd
プロンプトに対する最初の応答と、azd
によって生成された環境変数は、名前付き環境にローカルに格納されます。 azd env get-values
コマンドを使用して、Azure リソースの作成時に使用された環境内のすべての変数を確認します。
リソースをクリーンアップする
関数アプリと関連リソースの操作が完了したら、次のコマンドを使用して関数アプリとその関連リソースを Azure から削除し、それ以上のコストが発生しないようにすることができます。
azd down --no-prompt
Note
--no-prompt
オプションは、確認なしでリソース グループを削除するように azd
に指示します。
このコマンドは、ローカル コード プロジェクトには影響しません。