快速入門:使用 Azure Developer CLI 建立函式並將其部署至 Azure Functions
在本快速入門中,您會使用 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
刪除您的資源群組,而不需要您確認。
此命令不會影響您的本機程式碼專案。