在本快速入門中,您會使用 Azure Developer 命令列工具來建立回應 HTTP 要求的函式。 在本機測試程式碼之後,您會將其部署到您在 Azure Functions 的彈性使用量方案中執行的新無伺服器函數應用程式。
專案來源會使用 Azure Developer CLI (AZD) 簡化將程式碼部署至 Azure 的作業。 此部署遵循目前安全且可調整的 Azure Functions 部署最佳做法。
根據預設,彈性使用量方案會遵循隨用隨付計費模型,這表示完成本快速入門會在 Azure 帳戶中產生幾美分或更少成本。
必要條件
具有有效訂用帳戶的 Azure 帳戶。 免費建立帳戶。
-
JAVA 17 開發人員套件
- 如果您使用另一個支援的 JAVA 版本,則必須更新專案的 pom.xml 檔案。
-
JAVA_HOME
環境變數必須設定為正確 JDK 版本的安裝位置。
- Apache Maven 3.8.x
-
安全 HTTP 測試工具,用於將具有 JSON 承載的要求傳送至函式端點。 本文使用
curl
。
初始化專案
您可以使用 azd init
命令,從範本建立本機 Azure Functions 程式碼專案。
在您的本機終端機或命令提示字元中,於空白資料夾中執行此
azd init
命令:azd init --template functions-quickstart-dotnet-azd -e flexquickstart-dotnet
此命令會從範本存放庫提取專案檔,並初始化目前資料夾中的專案。
-e
旗標會設定目前環境的名稱。 在azd
中,環境可用來維護應用程式的唯一部署內容,且您可以定義一個以上的部署內容。 它也用於您在 Azure 中建立的資源群組名稱。執行此命令以瀏覽至
http
應用程式資料夾:cd http
在包含此 JSON 資料的
http
資料夾中,建立名為 local.settings.json 的檔案:{ "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
在包含此 JSON 資料的
http
資料夾中,建立名為 local.settings.json 的檔案:{ "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 中建立的資源群組名稱。在包含此 JSON 資料的根資料夾中,建立名為 local.settings.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
在包含此 JSON 資料的
src
資料夾中,建立名為 local.settings.json 的檔案:{ "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 中建立的資源群組名稱。在包含此 JSON 資料的根資料夾中,建立名為 local.settings.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 中建立的資源群組名稱。在包含此 JSON 資料的根資料夾中,建立名為 local.settings.json 的檔案:
{ "IsEncrypted": false, "Values": { "AzureWebJobsStorage": "UseDevelopmentStorage=true", "FUNCTIONS_WORKER_RUNTIME": "python" } }
在本機執行時,需要此檔案。
建立並啟用虛擬環境
在根資料夾中,執行下列命令來建立並啟用名為 .venv
的虛擬環境:
python3 -m venv .venv
source .venv/bin/activate
如果 Python 未在您的 Linux 發行版本上安裝 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 承載資料。 您可以在test.http
專案檔中找到這兩個 HTTP 要求的範例。當您完成時,請在終端機視窗中按 Ctrl+C 以停止
func.exe
主機程序。
- 執行
deactivate
以關閉虛擬環境。
檢閱程式碼 (選用)
您可以檢閱定義兩個 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
命令,在彈性使用量方案中建立函數應用程式,以及其他必要的 Azure 資源。
注意
此專案包含一組 Bicep 檔案,讓 azd
用來建立符合最佳做法之彈性使用量方案的安全部署。
JAVA 應用程式目前不支援 azd up
和 azd deploy
命令。
在專案的根資料夾中,執行此命令以建立所需的 Azure 資源:
azd provision
根資料夾包含
azd
所需的azure.yaml
定義檔。如果您尚未登入,系統會要求您向 Azure 帳戶進行驗證。
出現提示時,請提供這些必要的部署參數:
參數 描述 Azure 訂用帳戶 建立您資源所在位置的訂用帳戶。 Azure 位置 要在其中建立包含新 Azure 資源之資源群組所在的 Azure 區域。 只會顯示目前支援彈性使用量方案的區域。 azd provision
命令會透過 Bicep 組態檔使用您對這些提示的回應,以建立和設定這些必要的 Azure 資源:- 彈性使用量方案和函數應用程式
- Azure 儲存體 (必要) 和 Application Insights (建議)
- 存取帳戶的原則和角色
- 使用受控識別的服務對服務連線 (而不是預存的連接字串)
- 用來安全地執行函數應用程式和其他 Azure 資源的虛擬網路
命令成功完成之後,您可以將專案程式碼部署至 Azure 中的這個新函數應用程式。
部署至 Azure
您可以使用 Core Tools 封裝程式碼,並從 target
輸出資料夾將其部署至 Azure。
瀏覽至
target
輸出資料夾中對等的應用程式資料夾:cd http/target/azure-functions/contoso-functions
此資料夾應該有 host.json 檔案,指出它是已編譯 JAVA 函數應用程式的根目錄。
執行下列命令,使用 Core Tools 將編譯的 JAVA 程式碼專案部署到 Azure 中的新函數應用程式資源:
azd env get-value
命令會從本機環境取得函數應用程式名稱,這是使用func azure functionapp publish
進行部署時的必要項目。 發行成功完成之後,您會看到 Azure 中 HTTP 觸發程序端點的連結。
部署至 Azure
此專案已設定為使用 azd up
命令,將此專案部署至 Azure 之彈性使用量方案中的新函數應用程式。
提示
此專案包含一組 Bicep 檔案,讓 azd
用來建立符合最佳做法之彈性使用量方案的安全部署。
執行此命令,讓
azd
在 Azure 中建立必要的 Azure 資源,並將程式碼專案部署至新的函數應用程式:azd up
根資料夾包含
azd
所需的azure.yaml
定義檔。如果您尚未登入,系統會要求您向 Azure 帳戶進行驗證。
出現提示時,請提供這些必要的部署參數:
參數 描述 Azure 訂用帳戶 建立您資源所在位置的訂用帳戶。 Azure 位置 要在其中建立包含新 Azure 資源之資源群組所在的 Azure 區域。 只會顯示目前支援彈性使用量方案的區域。 azd up
命令會透過 Bicep 組態檔使用您對這些提示的回應,以完成這些部署工作:建立和設定這些必要的 Azure 資源 (相當於
azd provision
):- 彈性使用量方案和函數應用程式
- Azure 儲存體 (必要) 和 Application Insights (建議)
- 存取帳戶的原則和角色
- 使用受控識別的服務對服務連線 (而不是預存的連接字串)
- 用來安全地執行函數應用程式和其他 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
命令會從本機環境取得函數應用程式名稱。 使用--show-keys
選項搭配func azure functionapp list-functions
表示針對每個端點的傳回的 Invoke URL: 值都包含函式層級存取金鑰。如同先前,使用 HTTP 測試工具來驗證在 Azure 中執行之函數應用程式中的這些 URL。
重新部署程式碼
您可以視需要多次執行 azd up
命令以佈建 Azure 資源,並將程式碼更新部署至函數應用程式。
注意
最新的部署套件一律會覆寫已部署的程式碼檔案。
您對 azd
提示的初始回應,以及 azd
所產生的任何環境變數都會儲存在本機的具名環境中。 使用 azd env get-values
命令來檢閱您環境中建立 Azure 資源時所使用的所有變數。
清除資源
當您使用函數應用程式和相關資源時,您可以使用此命令從 Azure 刪除函數應用程式及其相關資源,並避免產生任何進一步的成本:
azd down --no-prompt
注意
--no-prompt
選項會指示 azd
刪除您的資源群組,而不需要您確認。
此命令不會影響您的本機程式碼專案。