Criar uma função no Linux com um contentor personalizadoCreate a function on Linux using a custom container

Neste tutorial, cria e implementa o seu código para Azure Functions como um recipiente personalizado do Docker utilizando uma imagem base linux.In this tutorial, you create and deploy your code to Azure Functions as a custom Docker container using a Linux base image. Normalmente usa uma imagem personalizada quando as suas funções requerem uma versão específica do idioma ou têm uma dependência ou configuração específica que não é fornecida pela imagem incorporada.You typically use a custom image when your functions require a specific language version or have a specific dependency or configuration that isn't provided by the built-in image.

Também pode utilizar um recipiente de Serviço de Aplicações Azure padrão, conforme descrito no Criar a sua primeira função hospedada no Linux.You can also use a default Azure App Service container as described on Create your first function hosted on Linux. As imagens base suportadas para funções Azure encontram-se nas imagens base do Azure Functions repo.Supported base images for Azure Functions are found in the Azure Functions base images repo.

Neste tutorial, ficará a saber como:In this tutorial, you learn how to:

  • Crie uma aplicação de função e dockerfile utilizando as Ferramentas Principais de Funções Azure.Create a function app and Dockerfile using the Azure Functions Core Tools.
  • Criar uma imagem personalizada com o Docker.Build a custom image using Docker.
  • Publicar uma imagem personalizada num registo de contentor.Publish a custom image to a container registry.
  • Criar recursos de apoio em Azure para a aplicação de funçãoCreate supporting resources in Azure for the function app
  • Implementar uma aplicação de funções a partir do Docker Hub.Deploy a function app from Docker Hub.
  • Adicionar as definições de aplicação à aplicação de funções.Add application settings to the function app.
  • Ativar a implantação contínua.Enable continuous deployment.
  • Ativar as ligações SSH ao recipiente.Enable SSH connections to the container.
  • Adicione uma ligação de saída de armazenamento de fila.Add a Queue storage output binding.

Pode seguir este tutorial em qualquer computador que execute Windows, macOS ou Linux.You can follow this tutorial on any computer running Windows, macOS, or Linux. Completar o tutorial incorrerá em custos de alguns dólares americanos na sua conta Azure.Completing the tutorial will incur costs of a few US dollars in your Azure account.

Configure o seu ambiente localConfigure your local environment

Antes de começar, deve ter o seguinte:Before you begin, you must have the following:

  • Node.js, Versões LTS ativas e de manutenção (8.11.1 e 10.14.1 recomendado).Node.js, Active LTS and Maintenance LTS versions (8.11.1 and 10.14.1 recommended).
  • O Kit de Desenvolvimento java,versão 8.The Java Developer Kit, version 8.

    Importante

    • O suporte de funções para Java 11 está atualmente em pré-visualização, e o arquétipo Maven cria uma implementação Java 8 por padrão.Functions support for Java 11 is currently in preview, and the Maven archetype creates a Java 8 deployment by default. Se pretender executar a sua aplicação de função em Java 11, tem de atualizar manualmente o ficheiro pom.xml com os valores de Java 11.If you want to instead run your function app on Java 11, you must manually update the pom.xml file with Java 11 values. Para saber mais, consulte as versões Java.To learn more, see Java versions.
    • A JAVA_HOME variável ambiente deve ser definida para a localização de instalação da versão correta do JDK para completar este arranque rápido.The JAVA_HOME environment variable must be set to the install location of the correct version of the JDK to complete this quickstart.
  • Apache Maven,versão 3.0 ou superior.Apache Maven, version 3.0 or above.

Verificação pré-requisitoPrerequisite check

  • Numa janela de terminal ou comando, corra func --version para verificar se as Ferramentas Centrais de Funções Azure são a versão 2.7.1846 ou posterior.In a terminal or command window, run func --version to check that the Azure Functions Core Tools are version 2.7.1846 or later.

  • Corra az --version para verificar se a versão Azure CLI é 2.0.76 ou mais tarde.Run az --version to check that the Azure CLI version is 2.0.76 or later.

  • Corra az login para iniciar seduca no Azure e verifique uma subscrição ativa.Run az login to sign in to Azure and verify an active subscription.

  • Executar python --version (Linux/MacOS) ou py --version (Windows) para verificar os relatórios da sua versão Python 3.8.x, 3.7.x ou 3.6.x.Run python --version (Linux/MacOS) or py --version (Windows) to check your Python version reports 3.8.x, 3.7.x or 3.6.x.
  • Corre docker login para assinar com o Docker.Run docker login to sign in to Docker. Este comando falha se o Docker não estiver a funcionar, caso em que começa o Docker e recandidam o comando.This command fails if Docker isn't running, in which case start docker and retry the command.

Criar e ativar um ambiente virtualCreate and activate a virtual environment

Numa pasta adequada, executar os seguintes comandos para criar e ativar um ambiente virtual chamado .venv .In a suitable folder, run the following commands to create and activate a virtual environment named .venv. Certifique-se de que utiliza Python 3.8, 3.7 ou 3.6, que são suportados por Funções Azure.Be sure to use Python 3.8, 3.7 or 3.6, which are supported by Azure Functions.

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

Se python não instalou o pacote venv na sua distribuição Linux, execute o seguinte comando:If Python didn't install the venv package on your Linux distribution, run the following command:

sudo apt-get install python3-venv

Você dirige todos os comandos subsequentes neste ambiente virtual ativado.You run all subsequent commands in this activated virtual environment.

Criar e testar o projeto de funções locaisCreate and test the local functions project

Numa solicitação de terminal ou comando, executar o seguinte comando para o seu idioma escolhido para criar um projeto de aplicação de função numa pasta chamada LocalFunctionsProject .In a terminal or command prompt, run the following command for your chosen language to create a function app project in a folder named LocalFunctionsProject.

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

Numa pasta vazia, execute o seguinte comando para gerar o projeto das Funções a partir de um arquétipo do Maven.In an empty folder, run the following command to generate the Functions project from a Maven archetype.

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

O -DjavaVersion parâmetro indica ao tempo de execução funções qual versão de Java a utilizar.The -DjavaVersion parameter tells the Functions runtime which version of Java to use. Utilize -DjavaVersion=11 se quiser que as suas funções funcionem em Java 11, que está em pré-visualização.Use -DjavaVersion=11 if you want to your functions to run on Java 11, which is in preview. Quando não -DjavaVersion especifica, Maven falha em Java 8.When you don't specify -DjavaVersion, Maven defaults to Java 8. Para mais informações, consulte as versões Java.For more information, see Java versions.

A Maven pede-lhe valores necessários para terminar a geração do projeto na implantação.Maven asks you for values needed to finish generating the project on deployment.
Fornecer os seguintes valores quando solicitado:Provide the following values when prompted:

PromptPrompt ValorValue DescriçãoDescription
groupIdgroupId com.fabrikam Um valor que identifica exclusivamente o seu projeto em todos os projetos, seguindo as regras de nomeação de pacotes para a Java.A value that uniquely identifies your project across all projects, following the package naming rules for Java.
artefactoIdartifactId fabrikam-functions Um valor que é o nome do jarro, sem um número de versão.A value that is the name of the jar, without a version number.
Versãoversion 1.0-SNAPSHOT Escolha o valor predefinido.Choose the default value.
pacotepackage com.fabrikam.functions Um valor que é o pacote Java para o código de função gerado.A value that is the Java package for the generated function code. Utilize a predefinição.Use the default.

Digite Y ou prima Enter para confirmar.Type Y or press Enter to confirm.

A Maven cria os ficheiros do projeto numa nova pasta com o nome de artifactId, que neste exemplo é fabrikam-functions .Maven creates the project files in a new folder with a name of artifactId, which in this example is fabrikam-functions.

A --docker opção gera um Dockerfile para o projeto, que define um recipiente personalizado adequado para uso com Funções Azure e o tempo de execução selecionado.The --docker option generates a Dockerfile for the project, which defines a suitable custom container for use with Azure Functions and the selected runtime.

Navegue na pasta do projeto:Navigate into the project folder:

cd LocalFunctionsProject
cd fabrikam-functions

Adicione uma função ao seu projeto utilizando o seguinte comando, onde o --name argumento é o nome único da sua função e o argumento especifica o gatilho da --template função.Add a function to your project by using the following command, where the --name argument is the unique name of your function and the --template argument specifies the function's trigger. func new criar uma sub-dobradeira que corresponda ao nome da função que contém um ficheiro de código adequado à língua escolhida do projeto e um ficheiro de configuração denominado function.jsem.func new create a subfolder matching the function name that contains a code file appropriate to the project's chosen language and a configuration file named function.json.

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

Para testar a função localmente, inicie o hospedeiro local Azure Functions na raiz da pasta do projeto:To test the function locally, start the local Azure Functions runtime host in the root of the project folder:

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

Assim que vir o HttpExample ponto final aparecer na saída, navegue para http://localhost:7071/api/HttpExample?name=Functions .Once you see the HttpExample endpoint appear in the output, navigate to http://localhost:7071/api/HttpExample?name=Functions. O navegador deve apresentar uma mensagem de "olá" que ecoa de Functions volta, o valor fornecido ao name parâmetro de consulta.The browser should display a "hello" message that echoes back Functions, the value supplied to the name query parameter.

Use ctrl - C para parar o hospedeiro.Use Ctrl-C to stop the host.

Construa a imagem do recipiente e teste localmenteBuild the container image and test locally

(Opcional) Examine o Dockerfile na raiz da pasta do projeto.(Optional) Examine the Dockerfile in the root of the project folder. O Dockerfile descreve o ambiente necessário para executar a aplicação de função no Linux.The Dockerfile describes the required environment to run the function app on Linux. A lista completa de imagens base suportadas para funções Azure pode ser encontrada na página de imagem base do Azure Functions.The complete list of supported base images for Azure Functions can be found in the Azure Functions base image page.

Na pasta do projeto raiz, executar o estivador constroem comando, e fornecer um azurefunctionsimage nome, e tag, v1.0.0 .In the root project folder, run the docker build command, and provide a name, azurefunctionsimage, and tag, v1.0.0. Substitua <DOCKER_ID> pelo ID da sua conta do Docker Hub.Replace <DOCKER_ID> with your Docker Hub account ID. Este comando cria a imagem do Docker para o contentor.This command builds the Docker image for the container.

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

Quando o comando terminar, pode executar o novo recipiente localmente.When the command completes, you can run the new container locally.

Para testar a construção, coloque a imagem num recipiente local utilizando o comando de execução do estivador, substituindo novamente <DOCKER_ID o seu Estivador de Identificação e adicionando o argumento das portas: -p 8080:80To test the build, run the image in a local container using the docker run command, replacing again <DOCKER_ID with your Docker ID and adding the ports argument, -p 8080:80:

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

Uma vez que a imagem esteja a ser em execução num recipiente local, abra um browser para http://localhost:8080 , que deve exibir a imagem do espaço reservado abaixo mostrada.Once the image is running in a local container, open a browser to http://localhost:8080, which should display the placeholder image shown below. A imagem aparece neste ponto porque a sua função está a funcionar no contentor local, como faria em Azure, o que significa que está protegida por uma chave de acesso, tal como definida em function.js com a "authLevel": "function" propriedade.The image appears at this point because your function is running in the local container, as it would in Azure, which means that it's protected by an access key as defined in function.json with the "authLevel": "function" property. O contentor ainda não foi publicado numa aplicação de função em Azure, no entanto, por isso a chave ainda não está disponível.The container hasn't yet been published to a function app in Azure, however, so the key isn't yet available. Se quiser testar contra o contentor local, pare o estivador, altere a propriedade de autorização para "authLevel": "anonymous" reconstruir a imagem e reinicie o estivador.If you want to test against the local container, stop docker, change the authorization property to "authLevel": "anonymous", rebuild the image, and restart docker. Em seguida, reinicie "authLevel": "function" function.js.Then reset "authLevel": "function" in function.json. Para mais informações, consulte as teclas de autorização.For more information, see authorization keys.

Imagem de espaço reservado indicando que o recipiente está funcionando localmente

Uma vez que a imagem esteja a correr num recipiente local, http://localhost:8080/api/HttpExample?name=Functions procure, que deve exibir a mesma mensagem de "olá" da anterior.Once the image is running in a local container, browse to http://localhost:8080/api/HttpExample?name=Functions, which should display the same "hello" message as before. Como o arquétipo Maven gera uma função http desencadeada que utiliza uma autorização anónima, ainda pode chamar a função mesmo que esteja a funcionar no recipiente.Because the Maven archetype generates an HTTP triggered function that uses anonymous authorization, you can still call the function even though it's running in the container.

Depois de verificar a aplicação de função no recipiente, pare o estivador com o Ctrl + C.After you've verified the function app in the container, stop docker with Ctrl+C.

Empurre a imagem para Docker HubPush the image to Docker Hub

Docker Hub é um registo de contentores que acolhe imagens e fornece serviços de imagem e contentores.Docker Hub is a container registry that hosts images and provides image and container services. Para partilhar a sua imagem, que inclui a implantação para Azure, deve empurrá-la para um registo.To share your image, which includes deploying to Azure, you must push it to a registry.

  1. Se ainda não assinou contrato com o Docker, faça-o com o comando de login do docker, substituindo <docker_id> o seu Estivador.If you haven't already signed in to Docker, do so with the docker login command, replacing <docker_id> with your Docker ID. Este comando solicita-lhe o seu nome de utilizador e senha.This command prompts you for your username and password. Uma mensagem "Login Com sucesso" confirma que está inscrito.A "Login Succeeded" message confirms that you're signed in.

    docker login
    
  2. Depois de ter assinado, empurre a imagem para Docker Hub usando o comando de push docker, substituindo novamente <docker_id> com o seu Estivador ID.After you've signed in, push the image to Docker Hub by using the docker push command, again replacing <docker_id> with your Docker ID.

    docker push <docker_id>/azurefunctionsimage:v1.0.0
    
  3. Dependendo da velocidade da sua rede, empurrar a imagem pela primeira vez pode demorar alguns minutos (empurrar as alterações subsequentes é muito mais rápido).Depending on your network speed, pushing the image the first time might take a few minutes (pushing subsequent changes is much faster). Enquanto espera, pode seguir para a próxima secção e criar recursos Azure em outro terminal.While you're waiting, you can proceed to the next section and create Azure resources in another terminal.

Crie recursos Azure de suporte para a sua funçãoCreate supporting Azure resources for your function

Para implementar o seu código de função para Azure, precisa de criar três recursos:To deploy your function code to Azure, you need to create three resources:

  • Um grupo de recursos, que é um recipiente lógico para recursos relacionados.A resource group, which is a logical container for related resources.
  • Uma conta de Armazenamento Azure, que mantém informações estatais e outras sobre os seus projetos.An Azure Storage account, which maintains state and other information about your projects.
  • Uma aplicação de funções Azure, que fornece o ambiente para executar o seu código de função.An Azure functions app, which provides the environment for executing your function code. Uma aplicação de função mapeia para o seu projeto de função local e permite-lhe agrupar funções como uma unidade lógica para uma gestão, implementação e partilha mais fácil de recursos.A function app maps to your local function project and lets you group functions as a logical unit for easier management, deployment, and sharing of resources.

Utiliza comandos Azure CLI para criar estes itens.You use Azure CLI commands to create these items. Cada comando fornece saída JSON após a conclusão.Each command provides JSON output upon completion.

  1. Inscreva-se no Azure com o comando de login az:Sign in to Azure with the az login command:

    az login
    
  2. Crie um grupo de recursos com o comando az group create.Create a resource group with the az group create command. O exemplo a seguir cria um grupo de recursos nomeado AzureFunctionsContainers-rg na westeurope região.The following example creates a resource group named AzureFunctionsContainers-rg in the westeurope region. (Geralmente cria o seu grupo de recursos e recursos numa região próxima de si, utilizando uma região disponível a partir do az account list-locations comando.)(You generally create your resource group and resources in a region near you, using an available region from the az account list-locations command.)

    az group create --name AzureFunctionsContainers-rg --location westeurope
    

    Nota

    Não é possível hospedar aplicações Linux e Windows no mesmo grupo de recursos.You can't host Linux and Windows apps in the same resource group. Se tiver um grupo de recursos existente nomeado AzureFunctionsContainers-rg com uma aplicação de função Windows ou uma aplicação web, deve utilizar um grupo de recursos diferente.If you have an existing resource group named AzureFunctionsContainers-rg with a Windows function app or web app, you must use a different resource group.

  3. Crie uma conta de armazenamento para fins gerais no seu grupo de recursos e região utilizando a conta de armazenamento az criar comando.Create a general-purpose storage account in your resource group and region by using the az storage account create command. No exemplo seguinte, <storage_name> substitua-o por um nome globalmente único, adequado a si.In the following example, replace <storage_name> with a globally unique name appropriate to you. Os nomes devem conter apenas três a 24 caracteres e letras minúsculas.Names must contain three to 24 characters numbers and lowercase letters only. Standard_LRS especifica uma conta típica de fins gerais.Standard_LRS specifies a typical general-purpose account.

    az storage account create --name <storage_name> --location westeurope --resource-group AzureFunctionsContainers-rg --sku Standard_LRS
    

    A conta de armazenamento incorre apenas alguns cêntimos usd para este tutorial.The storage account incurs only a few USD cents for this tutorial.

  4. Utilize o comando para criar um plano Premium para funções Azure nomeado myPremiumPlan no nível de preços Elástico Premium 1 --sku EP1 (), na região da Europa Ocidental ( -location westeurope ou use uma região adequada perto de si), e num recipiente Linux --is-linux ( ).Use the command to create a Premium plan for Azure Functions named myPremiumPlan in the Elastic Premium 1 pricing tier (--sku EP1), in the West Europe region (-location westeurope, or use a suitable region near you), and in a Linux container (--is-linux).

    az functionapp plan create --resource-group AzureFunctionsContainers-rg --name myPremiumPlan --location westeurope --number-of-workers 1 --sku EP1 --is-linux
    

    O alojamento Linux para funções personalizadas é suportado em planos dedicados (App Service) e planos Premium.Linux hosting for custom functions containers are supported on Dedicated (App Service) plans and Premium plans. Utilizamos aqui o plano Premium, que pode escalar conforme necessário.We use the Premium plan here, which can scale as needed. Para saber mais sobre o alojamento, veja Azure Functions hosting plans comparison (Comparação dos planos de alojamento das Funções do Azure).To learn more about hosting, see Azure Functions hosting plans comparison. Para calcular os custos,consulte a página de preços das funções .To calculate costs, see the Functions pricing page.

    O comando também fornece uma instância Azure Application Insights associada no mesmo grupo de recursos, com a qual pode monitorizar a sua aplicação de função e visualizar registos.The command also provisions an associated Azure Application Insights instance in the same resource group, with which you can monitor your function app and view logs. Para obter mais informações, consulte as Funções Do Monitor Azure.For more information, see Monitor Azure Functions. O caso não incorre em custos até que o ative.The instance incurs no costs until you activate it.

Criar e configurar uma aplicação de função no Azure com a imagemCreate and configure a function app on Azure with the image

Uma aplicação de função no Azure gere a execução das suas funções no seu plano de hospedagem.A function app on Azure manages the execution of your functions in your hosting plan. Nesta secção, utiliza os recursos Azure da secção anterior para criar uma aplicação de função a partir de uma imagem no Docker Hub e configurá-la com uma cadeia de ligação ao Azure Storage.In this section, you use the Azure resources from the previous section to create a function app from an image on Docker Hub and configure it with a connection string to Azure Storage.

  1. Crie a aplicação Funções utilizando o comando az functionapp.Create the Functions app using the az functionapp create command. No exemplo seguinte, <storage_name> substitua-o pelo nome utilizado na secção anterior para a conta de armazenamento.In the following example, replace <storage_name> with the name you used in the previous section for the storage account. Substitua também <app_name> um nome globalmente único, adequado a si, e <docker_id> pelo seu Docker ID.Also replace <app_name> with a globally unique name appropriate to you, and <docker_id> with your Docker ID.

    az functionapp create --name <app_name> --storage-account <storage_name> --resource-group AzureFunctionsContainers-rg --plan myPremiumPlan --runtime <functions runtime stack> --deployment-container-image-name <docker_id>/azurefunctionsimage:v1.0.0
    

    O parâmetro de designação-imagem-contentor especifica a imagem a utilizar para a aplicação de função.The deployment-container-image-name parameter specifies the image to use for the function app. Pode utilizar o comando de demonstração do recipiente de config do az functionapp para visualizar informações sobre a imagem utilizada para a implantação.You can use the az functionapp config container show command to view information about the image used for deployment. Também pode utilizar o comando conjunto de conjunto de conjunto de conjuntos de config do az functionapp para implantar a partir de uma imagem diferente.You can also use the az functionapp config container set command to deploy from a different image.

  2. Recupere a cadeia de ligação para a conta de armazenamento que criou utilizando o comando de série de ligação de ligação de az, atribuindo-o a uma variável de storageConnectionString concha:Retrieve the connection string for the storage account you created by using the az storage account show-connection-string command, assigning it to a shell variable storageConnectionString:

    az storage account show-connection-string --resource-group AzureFunctionsContainers-rg --name <storage_name> --query connectionString --output tsv
    
  3. Adicione esta definição à aplicação de função utilizando o comando de configuração de configurações de appsettings az functionapp.Add this setting to the function app by using the az functionapp config appsettings set command. No seguinte comando, <app_name> substitua-o pelo nome da sua aplicação de função e substitua-a <connection_string> pela cadeia de ligação do passo anterior (uma longa cadeia codificada que começa por "DefaultEndpointProtocol="):In the following command, replace <app_name> with the name of your function app, and replace <connection_string> with the connection string from the previous step (a long encoded string that begins with "DefaultEndpointProtocol="):

    az functionapp config appsettings set --name <app_name> --resource-group AzureFunctionsContainers-rg --settings AzureWebJobsStorage=<connection_string>
    
  4. A função pode agora utilizar este fio de ligação para aceder à conta de armazenamento.The function can now use this connection string to access the storage account.

    Dica

    Na bash, pode utilizar uma variável de concha para capturar a cadeia de ligação em vez de usar a prancheta.In bash, you can use a shell variable to capture the connection string instead of using the clipboard. Primeiro, utilize o seguinte comando para criar uma variável com a cadeia de ligação:First, use the following command to create a variable with the connection string:

    storageConnectionString=$(az storage account show-connection-string --resource-group AzureFunctionsContainers-rg --name <storage_name> --query connectionString --output tsv)
    

    Em seguida, consulte a variável no segundo comando:Then refer to the variable in the second command:

    az functionapp config appsettings set --name <app_name> --resource-group AzureFunctionsContainers-rg --settings AzureWebJobsStorage=$storageConnectionString
    

Nota

Se publicar a sua imagem personalizada numa conta de contentores privados, deverá utilizar variáveis ambientais no Dockerfile para a cadeia de ligação.If you publish your custom image to a private container account, you should use environment variables in the Dockerfile for the connection string instead. Para mais informações, consulte a instrução ENV.For more information, see the ENV instruction. Também deve definir as variáveis DOCKER_REGISTRY_SERVER_USERNAME e DOCKER_REGISTRY_SERVER_PASSWORD .You should also set the variables DOCKER_REGISTRY_SERVER_USERNAME and DOCKER_REGISTRY_SERVER_PASSWORD. Para utilizar os valores, então, deve reconstruir a imagem, empurrar a imagem para o registo e, em seguida, reiniciar a aplicação de função no Azure.To use the values, then, you must rebuild the image, push the image to the registry, and then restart the function app on Azure.

Verifique as suas funções no AzureVerify your functions on Azure

Com a imagem implantada na aplicação de função no Azure, pode agora invocar a função através de pedidos HTTP.With the image deployed to the function app on Azure, you can now invoke the function through HTTP requests. Como o function.jsna definição inclui a "authLevel": "function" propriedade, primeiro deve obter a chave de acesso (também chamada de "chave de função") e incluí-la como parâmetro URL em quaisquer pedidos para o ponto final.Because the function.json definition includes the property "authLevel": "function", you must first obtain the access key (also called the "function key") and include it as a URL parameter in any requests to the endpoint.

  1. Recupere o URL de função com a tecla de acesso (função) utilizando o portal Azure, ou utilizando o CLI Azure com o az rest comando.)Retrieve the function URL with the access (function) key by using the Azure portal, or by using the Azure CLI with the az rest command.)

    1. Inscreva-se no portal Azure e, em seguida, procure e selecione App de função.Sign in to the Azure portal, then search for and select Function App.

    2. Selecione a função que pretende verificar.Select the function you want to verify.

    3. No painel de navegação esquerdo, selecione Funçõese, em seguida, selecione a função que pretende verificar.In the left navigation panel, select Functions, and then select the function you want to verify.

      Escolha a sua função no portal Azure

    4. Selecione Obter Url de função.Select Get Function Url.

      Obtenha o URL de função do portal Azure

    5. Na janela pop-up, selecione predefinição (tecla de função) e, em seguida, copie o URL para a área de transferência.In the pop-up window, select default (function key) and then copy the URL to the clipboard. A chave é a sequência de caracteres que se ?code= seguem.The key is the string of characters following ?code=.

      Escolha a chave de acesso à função predefinida

    Nota

    Como a sua aplicação de função é implantada como um recipiente, não pode escoar alterações ao seu código de função no portal.Because your function app is deployed as a container, you can't make changes to your function code in the portal. Em vez disso, deve atualizar o projeto na imagem local, empurrar a imagem para o registo novamente e, em seguida, reenfectar para Azure.You must instead update the project in the local image, push the image to the registry again, and then redeploy to Azure. Pode configurar uma implantação contínua numa secção posterior.You can set up continuous deployment in a later section.

  2. Cole o URL de função na barra de endereços do seu navegador, adicionando o parâmetro &name=Azure ao final deste URL.Paste the function URL into your browser's address bar, adding the parameter &name=Azure to the end of this URL. Texto como "Olá, Azure" deve aparecer no navegador.Text like "Hello, Azure" should appear in the browser.

    Resposta da função no browser.

  3. Para testar a autorização, retire o code= parâmetro do URL e verifique se não obtém qualquer resposta da função.To test authorization, remove the code= parameter from the URL and verify that you get no response from the function.

Permitir a implantação contínua para AzureEnable continuous deployment to Azure

Pode ativar as Funções Azure para atualizar automaticamente a sua implementação de uma imagem sempre que atualizar a imagem no registo.You can enable Azure Functions to automatically update your deployment of an image whenever you update the image in the registry.

  1. Ativar a implementação contínua utilizando o comando config do contentor config de implementação do az functionapp, <app_name> substituindo-o pelo nome da sua aplicação de função:Enable continuous deployment by using az functionapp deployment container config command, replacing <app_name> with the name of your function app:

    az functionapp deployment container config --enable-cd --query CI_CD_URL --output tsv --name <app_name> --resource-group AzureFunctionsContainers-rg
    

    Este comando permite a implementação contínua e devolve o URL webhook de implementação.This command enables continuous deployment and returns the deployment webhook URL. (Pode recuperar este URL em qualquer momento posterior, utilizando o comando de exibição de show-cd-url do contentor de funções az.)(You can retrieve this URL at any later time by using the az functionapp deployment container show-cd-url command.)

  2. Copie o URL webhook de implementação para a área de transferência.Copy the deployment webhook URL to the clipboard.

  3. Abra o Docker Hub,inscreva-se e selecione repositórios na barra de navegação.Open Docker Hub, sign in, and select Repositories on the nav bar. Localizar e selecionar a imagem, selecionar o separador Webhooks, especificar um nome Webhook, colar o url no URL webhooke, em seguida, selecionar Criar:Locate and select image, select the Webhooks tab, specify a Webhook name, paste your URL in Webhook URL, and then select Create:

    Adicione o webhook no seu repo DockerHub

  4. Com o conjunto webhook, a Azure Functions reimplantia a sua imagem sempre que a atualiza no Docker Hub.With the webhook set, Azure Functions redeploys your image whenever you update it in Docker Hub.

Ativar ligações SSHEnable SSH connections

O SSH permite a comunicação segura entre um contentor e um cliente.SSH enables secure communication between a container and a client. Com o SSH ativado, pode ligar-se ao seu recipiente utilizando Ferramentas Avançadas de Serviço de Aplicação (Kudu).With SSH enabled, you can connect to your container using App Service Advanced Tools (Kudu). Para facilitar a ligação ao seu recipiente utilizando o SSH, o Azure Functions fornece uma imagem base que tem SSH já ativada.To make it easy to connect to your container using SSH, Azure Functions provides a base image that has SSH already enabled. Só precisas de editar o teu Dockerfile, depois reconstruir e redistribuir a imagem.You need only edit your Dockerfile, then rebuild and redeploy the image. Em seguida, pode ligar-se ao recipiente através das Ferramentas Avançadas (Kudu)You can then connect to the container through the Advanced Tools (Kudu)

  1. No seu Dockerfile, apencha a cadeia -appservice à imagem base na sua FROM instrução:In your Dockerfile, append the string -appservice to the base image in your FROM instruction:

    FROM mcr.microsoft.com/azure-functions/dotnet:3.0-appservice
    
    FROM mcr.microsoft.com/azure-functions/node:2.0-appservice
    
    FROM mcr.microsoft.com/azure-functions/powershell:2.0-appservice
    
    FROM mcr.microsoft.com/azure-functions/python:2.0-python3.7-appservice
    
    FROM mcr.microsoft.com/azure-functions/node:2.0-appservice
    
  2. Reconstrua a imagem utilizando novamente o docker build comando, <docker_id> substituindo-a pelo seu Estivador ID:Rebuild the image by using the docker build command again, replacing <docker_id> with your Docker ID:

    docker build --tag <docker_id>/azurefunctionsimage:v1.0.0 .
    
  3. Empurre a imagem atualizada para o Docker Hub, que deve demorar consideravelmente menos tempo do que o primeiro impulso apenas os segmentos atualizados da imagem precisam de ser carregados.Push the updated image to Docker Hub, which should take considerably less time than the first push only the updated segments of the image need to be uploaded.

    docker push <docker_id>/azurefunctionsimage:v1.0.0
    
  4. As Funções Azure reimplantia automaticamente a imagem para a aplicação de funções; o processo ocorre em menos de um minuto.Azure Functions automatically redeploys the image to your functions app; the process takes place in less than a minute.

  5. Num browser, https://<app_name>.scm.azurewebsites.net/ abra, substituindo <app_name> pelo seu nome único.In a browser, open https://<app_name>.scm.azurewebsites.net/, replacing <app_name> with your unique name. Este URL é o ponto final das Ferramentas Avançadas (Kudu) para o seu recipiente de aplicações de função.This URL is the Advanced Tools (Kudu) endpoint for your function app container.

  6. Inscreva-se na sua conta Azure e, em seguida, selecione o SSH para estabelecer uma ligação com o recipiente.Sign in to your Azure account, and then select the SSH to establish a connection with the container. A ligação pode demorar alguns momentos se o Azure ainda estiver a atualizar a imagem do recipiente.Connecting may take a few moments if Azure is still updating the container image.

  7. Depois de ter sido estabelecida uma ligação com o seu recipiente, executa o top comando para visualizar os processos atualmente em execução.After a connection is established with your container, run the top command to view the currently running processes.

    Comando de topo do Linux em execução numa sessão de SSH

Escreva para uma fila de armazenamento AzureWrite to an Azure Storage queue

As Funções Azure permitem-lhe ligar as suas funções a outros serviços e recursos da Azure sem ter de escrever o seu próprio código de integração.Azure Functions lets you connect your functions to other Azure services and resources without having to write your own integration code. Estas ligações, que representam tanto a entrada como a saída, são declaradas dentro da definição de função.These bindings, which represent both input and output, are declared within the function definition. Os dados de enlaces são fornecidos à função como parâmetros.Data from bindings is provided to the function as parameters. Um gatilho é um tipo especial de encadernação de entrada.A trigger is a special type of input binding. Embora uma função tenha apenas um gatilho, pode ter múltiplas ligações de entrada e saída.Although a function has only one trigger, it can have multiple input and output bindings. Para saber mais, consulte Azure Functions triggers e conceitos de encadernação.To learn more, see Azure Functions triggers and bindings concepts.

Esta secção mostra-lhe como integrar a sua função com uma fila de Armazenamento Azure.This section shows you how to integrate your function with an Azure Storage queue. A vinculação de saída que adiciona a esta função escreve dados de um pedido HTTP para uma mensagem na fila.The output binding that you add to this function writes data from an HTTP request to a message in the queue.

Recupere a cadeia de conexão Azure StorageRetrieve the Azure Storage connection string

Anteriormente, criou uma conta de Armazenamento Azure para ser utilizada pela aplicação de função.Earlier, you created an Azure Storage account for use by the function app. O fio de ligação desta conta é armazenado de forma segura nas definições de aplicações em Azure.The connection string for this account is stored securely in app settings in Azure. Ao descarregar a definição para o local.settings.jsno ficheiro, pode utilizar essa ligação escrever para uma fila de Armazenamento na mesma conta quando executar a função localmente.By downloading the setting into the local.settings.json file, you can use that connection write to a Storage queue in the same account when running the function locally.

  1. A partir da raiz do projeto, executar o seguinte comando, substituindo <app_name> pelo nome da sua aplicação de função do quickstart anterior.From the root of the project, run the following command, replacing <app_name> with the name of your function app from the previous quickstart. Este comando substituirá os valores existentes no ficheiro.This command will overwrite any existing values in the file.

    func azure functionapp fetch-app-settings <app_name>
    
  2. Abra local.settings.js e localize o valor denominado AzureWebJobsStorage , que é a cadeia de ligação da conta de armazenamento.Open local.settings.json and locate the value named AzureWebJobsStorage, which is the Storage account connection string. Utilize o nome AzureWebJobsStorage e a cadeia de ligação noutras secções deste artigo.You use the name AzureWebJobsStorage and the connection string in other sections of this article.

Importante

Como local.settings.jscontém segredos descarregados do Azure, exclua sempre este ficheiro do controlo de origem.Because local.settings.json contains secrets downloaded from Azure, always exclude this file from source control. O ficheiro .gitignore criado com um projeto de funções locais exclui o ficheiro por predefinição.The .gitignore file created with a local functions project excludes the file by default.

Registar as extensões de enlaceRegister binding extensions

Com exceção dos gatilhos HTTP e timer, as ligações são implementadas como pacotes de extensão.With the exception of HTTP and timer triggers, bindings are implemented as extension packages. Executar o seguinte comando de pacote de dotnet na janela Terminal para adicionar o pacote de extensão de Armazenamento ao seu projeto.Run the following dotnet add package command in the Terminal window to add the Storage extension package to your project.

dotnet add package Microsoft.Azure.WebJobs.Extensions.Storage --version 3.0.4

Agora, pode adicionar a ligação de saída de armazenamento ao seu projeto.Now, you can add the storage output binding to your project.

Adicione uma definição de ligação de saída à funçãoAdd an output binding definition to the function

Embora uma função possa ter apenas um gatilho, pode ter múltiplas ligações de entrada e saída, que permitem ligar-se a outros serviços e recursos Azure sem escrever código de integração personalizado.Although a function can have only one trigger, it can have multiple input and output bindings, which let you connect to other Azure services and resources without writing custom integration code.

Declara estas encadernações no function.jsarquivado na sua pasta de funções.You declare these bindings in the function.json file in your function folder. A partir do início rápido anterior, o seu function.jsficheiro na pasta HttpExample contém duas encadernações na bindings coleção:From the previous quickstart, your function.json file in the HttpExample folder contains two bindings in the bindings collection:

"bindings": [
    {
        "authLevel": "function",
        "type": "httpTrigger",
        "direction": "in",
        "name": "req",
        "methods": [
            "get",
            "post"
        ]
    },
    {
        "type": "http",
        "direction": "out",
        "name": "res"
    }
]
"scriptFile": "__init__.py",
"bindings": [
    {
        "authLevel": "function",
        "type": "httpTrigger",
        "direction": "in",
        "name": "req",
        "methods": [
            "get",
            "post"
        ]
    },
    {
        "type": "http",
        "direction": "out",
        "name": "$return"
    }
"bindings": [
  {
    "authLevel": "function",
    "type": "httpTrigger",
    "direction": "in",
    "name": "Request",
    "methods": [
      "get",
      "post"
    ]
  },
  {
    "type": "http",
    "direction": "out",
    "name": "Response"
  }
]

Cada encadernação tem pelo menos um tipo, uma direção e um nome.Each binding has at least a type, a direction, and a name. No exemplo acima, a primeira ligação é de tipo httpTrigger com a direção in .In the example above, the first binding is of type httpTrigger with the direction in. Para a in direção, name especifica o nome de um parâmetro de entrada que é enviado para a função quando invocado pelo gatilho.For the in direction, name specifies the name of an input parameter that's sent to the function when invoked by the trigger.

A segunda encadernação da coleção é res nomeada.The second binding in the collection is named res. Esta http ligação é uma ligação de saída out () que é usada para escrever a resposta HTTP.This http binding is an output binding (out) that is used to write the HTTP response.

Para escrever para uma fila de armazenamento Azure a partir desta função, adicione uma out ligação do tipo queue com o nome , como mostrado no código msg abaixo:To write to an Azure Storage queue from this function, add an out binding of type queue with the name msg, as shown in the code below:

    {
      "authLevel": "function",
      "type": "httpTrigger",
      "direction": "in",
      "name": "req",
      "methods": [
        "get",
        "post"
      ]
    },
    {
      "type": "http",
      "direction": "out",
      "name": "res"
    },
    {
      "type": "queue",
      "direction": "out",
      "name": "msg",
      "queueName": "outqueue",
      "connection": "AzureWebJobsStorage"
    }
  ]
}

A segunda ligação na coleção é de tipo http com a out direção, caso em que o especial indica que esta name $return ligação utiliza o valor de retorno da função em vez de fornecer um parâmetro de entrada.The second binding in the collection is of type http with the direction out, in which case the special name of $return indicates that this binding uses the function's return value rather than providing an input parameter.

Para escrever para uma fila de armazenamento Azure a partir desta função, adicione uma out ligação do tipo queue com o nome , como mostrado no código msg abaixo:To write to an Azure Storage queue from this function, add an out binding of type queue with the name msg, as shown in the code below:

"bindings": [
  {
    "authLevel": "anonymous",
    "type": "httpTrigger",
    "direction": "in",
    "name": "req",
    "methods": [
      "get",
      "post"
    ]
  },
  {
    "type": "http",
    "direction": "out",
    "name": "$return"
  },
  {
    "type": "queue",
    "direction": "out",
    "name": "msg",
    "queueName": "outqueue",
    "connection": "AzureWebJobsStorage"
  }
]

A segunda encadernação da coleção é res nomeada.The second binding in the collection is named res. Esta http ligação é uma ligação de saída out () que é usada para escrever a resposta HTTP.This http binding is an output binding (out) that is used to write the HTTP response.

Para escrever para uma fila de armazenamento Azure a partir desta função, adicione uma out ligação do tipo queue com o nome , como mostrado no código msg abaixo:To write to an Azure Storage queue from this function, add an out binding of type queue with the name msg, as shown in the code below:

    {
      "authLevel": "function",
      "type": "httpTrigger",
      "direction": "in",
      "name": "Request",
      "methods": [
        "get",
        "post"
      ]
    },
    {
      "type": "http",
      "direction": "out",
      "name": "Response"
    },
    {
      "type": "queue",
      "direction": "out",
      "name": "msg",
      "queueName": "outqueue",
      "connection": "AzureWebJobsStorage"
    }
  ]
}

Neste caso, msg é dado à função como argumento de saída.In this case, msg is given to the function as an output argument. Para um queue tipo, deve também especificar o nome da fila queueName e fornecer o nome da ligação Azure Storage (a partir de local.settings.jsem) em connection .For a queue type, you must also specify the name of the queue in queueName and provide the name of the Azure Storage connection (from local.settings.json) in connection.

Num projeto de biblioteca de classes C', as ligações são definidas como atributos de ligação no método de função.In a C# class library project, the bindings are defined as binding attributes on the function method. A function.jsno ficheiro exigido por Funções é então gerada automaticamente com base nestes atributos.The function.json file required by Functions is then auto-generated based on these attributes.

Abra o ficheiro HttpExample.cs do projeto e adicione o seguinte parâmetro à definição do Run método:Open the HttpExample.cs project file and add the following parameter to the Run method definition:

[Queue("outqueue"),StorageAccount("AzureWebJobsStorage")] ICollector<string> msg,

O msg parâmetro é um ICollector<T> tipo, que representa uma coleção de mensagens que são escritas para uma ligação de saída quando a função termina.The msg parameter is an ICollector<T> type, which represents a collection of messages that are written to an output binding when the function completes. Neste caso, a saída é uma fila de armazenamento chamada outqueue .In this case, the output is a storage queue named outqueue. O fio de ligação da conta de armazenamento é definido pela StorageAccountAttribute .The connection string for the Storage account is set by the StorageAccountAttribute. Este atributo indica a definição que contém a cadeia de ligação da conta de armazenamento e pode ser aplicada ao nível da classe, método ou parâmetro.This attribute indicates the setting that contains the Storage account connection string and can be applied at the class, method, or parameter level. Neste caso, pode omitir StorageAccountAttribute porque já está a utilizar a conta de armazenamento predefinida.In this case, you could omit StorageAccountAttribute because you are already using the default storage account.

A definição do método Run deve agora parecer-se com o seguinte:The Run method definition should now look like the following:

[FunctionName("HttpExample")]
public static async Task<IActionResult> Run(
    [HttpTrigger(AuthorizationLevel.Anonymous, "get", "post", Route = null)] HttpRequest req, 
    [Queue("outqueue"),StorageAccount("AzureWebJobsStorage")] ICollector<string> msg, 
    ILogger log)

Num projeto java, as ligações são definidas como anotações vinculativas no método de função.In a Java project, the bindings are defined as binding annotations on the function method. O function.jsem ficheiro é então autogerado com base nestas anotações.The function.json file is then autogenerated based on these annotations.

Navegue até à localização do seu código de função em src/main/java, abra o ficheiro do projeto Function.java e adicione o seguinte parâmetro à definição do run método:Browse to the location of your function code under src/main/java, open the Function.java project file, and add the following parameter to the run method definition:

@QueueOutput(name = "msg", queueName = "outqueue", connection = "AzureWebJobsStorage") OutputBinding<String> msg

O msg parâmetro é um OutputBinding<T> tipo, que representa uma coleção de cordas que são escritas como mensagens para uma ligação de saída quando a função termina.The msg parameter is an OutputBinding<T> type, which represents a collection of strings that are written as messages to an output binding when the function completes. Neste caso, a saída é uma fila de armazenamento chamada outqueue .In this case, the output is a storage queue named outqueue. O fio de ligação da conta de armazenamento é definido pelo connection método.The connection string for the Storage account is set by the connection method. Em vez da própria cadeia de ligação, passa-se a definição de aplicação que contém a cadeia de ligação da conta de armazenamento.Rather than the connection string itself, you pass the application setting that contains the Storage account connection string.

A run definição do método deve agora parecer o seguinte exemplo:The run method definition should now look like the following example:

@FunctionName("HttpTrigger-Java")
public HttpResponseMessage run(
        @HttpTrigger(name = "req", methods = {HttpMethod.GET, HttpMethod.POST}, authLevel = AuthorizationLevel.FUNCTION)  
        HttpRequestMessage<Optional<String>> request, 
        @QueueOutput(name = "msg", queueName = "outqueue", connection = "AzureWebJobsStorage") 
        OutputBinding<String> msg, final ExecutionContext context) {
    ...
}

Adicione código para utilizar a ligação de saídaAdd code to use the output binding

Com a ligação da fila definida, pode agora atualizar a sua função para receber o msg parâmetro de saída e escrever mensagens para a fila.With the queue binding defined, you can now update your function to receive the msg output parameter and write messages to the queue.

Atualizar HttpExample \ _ _ init _ _ .py para corresponder ao seguinte código, adicionando o msg parâmetro à definição de função e sob a msg.set(name) if name: declaração.Update HttpExample\__init__.py to match the following code, adding the msg parameter to the function definition and msg.set(name) under the if name: statement.

import logging

import azure.functions as func


def main(req: func.HttpRequest, msg: func.Out[func.QueueMessage]) -> str:

    name = req.params.get('name')
    if not name:
        try:
            req_body = req.get_json()
        except ValueError:
            pass
        else:
            name = req_body.get('name')

    if name:
        msg.set(name)
        return func.HttpResponse(f"Hello {name}!")
    else:
        return func.HttpResponse(
            "Please pass a name on the query string or in the request body",
            status_code=400
        )

O msg parâmetro é um exemplo do azure.functions.InputStream class .The msg parameter is an instance of the azure.functions.InputStream class. O seu set método escreve uma mensagem de corda para a fila, neste caso o nome passou para a função na cadeia de consulta URL.Its set method writes a string message to the queue, in this case the name passed to the function in the URL query string.

Adicione código que utiliza o msg objeto de ligação de saída context.bindings para criar uma mensagem de fila.Add code that uses the msg output binding object on context.bindings to create a queue message. Adicione este código antes da context.res declaração.Add this code before the context.res statement.

context.bindings.msg = (req.query.name || req.body.name);

Neste ponto, a sua função deve ser a seguinte:At this point, your function should look as follows:

module.exports = async function (context, req) {
    context.log('JavaScript HTTP trigger function processed a request.');

    if (req.query.name || (req.body && req.body.name)) {
        // Add a message to the Storage queue,
        // which is the name passed to the function.
        context.bindings.msg = (req.query.name || req.body.name);
        context.res = {
            // status: 200, /* Defaults to 200 */
            body: "Hello " + (req.query.name || req.body.name)
        };
    }
    else {
        context.res = {
            status: 400,
            body: "Please pass a name on the query string or in the request body"
        };
    }
};

Adicione código que utiliza o msg objeto de ligação de saída context.bindings para criar uma mensagem de fila.Add code that uses the msg output binding object on context.bindings to create a queue message. Adicione este código antes da context.res declaração.Add this code before the context.res statement.

context.bindings.msg = name;

Neste ponto, a sua função deve ser a seguinte:At this point, your function should look as follows:

import { AzureFunction, Context, HttpRequest } from "@azure/functions"

const httpTrigger: AzureFunction = async function (context: Context, req: HttpRequest): Promise<void> {
    context.log('HTTP trigger function processed a request.');
    const name = (req.query.name || (req.body && req.body.name));

    if (name) {
        // Add a message to the storage queue, 
        // which is the name passed to the function.
        context.bindings.msg = name; 
        // Send a "hello" response.
        context.res = {
            // status: 200, /* Defaults to 200 */
            body: "Hello " + (req.query.name || req.body.name)
        };
    }
    else {
        context.res = {
            status: 400,
            body: "Please pass a name on the query string or in the request body"
        };
    }
};

export default httpTrigger;

Adicione código que utiliza o Push-OutputBinding cmdlet para escrever texto na fila utilizando a msg ligação de saída.Add code that uses the Push-OutputBinding cmdlet to write text to the queue using the msg output binding. Adicione este código antes de definir o estado OK na if declaração.Add this code before you set the OK status in the if statement.

$outputMsg = $name
Push-OutputBinding -name msg -Value $outputMsg

Neste ponto, a sua função deve ser a seguinte:At this point, your function should look as follows:

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 or the body of the request.
$name = $Request.Query.Name
if (-not $name) {
    $name = $Request.Body.Name
}

if ($name) {
    # Write the $name value to the queue, 
    # which is the name passed to the function.
    $outputMsg = $name
    Push-OutputBinding -name msg -Value $outputMsg

    $status = [HttpStatusCode]::OK
    $body = "Hello $name"
}
else {
    $status = [HttpStatusCode]::BadRequest
    $body = "Please pass a name on the query string or in the request body."
}

# Associate values to output bindings by calling 'Push-OutputBinding'.
Push-OutputBinding -Name Response -Value ([HttpResponseContext]@{
    StatusCode = $status
    Body = $body
})

Adicione código que utiliza o msg objeto de ligação de saída para criar uma mensagem de fila.Add code that uses the msg output binding object to create a queue message. Adicione este código antes do método voltar.Add this code before the method returns.

if (!string.IsNullOrEmpty(name))
{
    // Add a message to the output collection.
    msg.Add(string.Format("Name passed to the function: {0}", name));
}

Neste ponto, a sua função deve ser a seguinte:At this point, your function should look as follows:

[FunctionName("HttpExample")]
public static async Task<IActionResult> Run(
    [HttpTrigger(AuthorizationLevel.Anonymous, "get", "post", Route = null)] HttpRequest req, 
    [Queue("outqueue"),StorageAccount("AzureWebJobsStorage")] ICollector<string> msg, 
    ILogger log)
{
    log.LogInformation("C# HTTP trigger function processed a request.");

    string name = req.Query["name"];

    string requestBody = await new StreamReader(req.Body).ReadToEndAsync();
    dynamic data = JsonConvert.DeserializeObject(requestBody);
    name = name ?? data?.name;

    if (!string.IsNullOrEmpty(name))
    {
        // Add a message to the output collection.
        msg.Add(string.Format("Name passed to the function: {0}", name));
    }
    return name != null
        ? (ActionResult)new OkObjectResult($"Hello, {name}")
        : new BadRequestObjectResult("Please pass a name on the query string or in the request body");
}

Agora, pode utilizar o novo msg parâmetro para escrever para a ligação de saída a partir do seu código de função.Now, you can use the new msg parameter to write to the output binding from your function code. Adicione a seguinte linha de código antes da resposta de sucesso para adicionar o valor da name ligação de msg saída.Add the following line of code before the success response to add the value of name to the msg output binding.

msg.setValue(name);

Quando utiliza uma ligação de saída, não precisa de utilizar o código SDK de armazenamento Azure para autenticação, obter uma referência de fila ou escrever dados.When you use an output binding, you don't have to use the Azure Storage SDK code for authentication, getting a queue reference, or writing data. O tempo de funcionamento e a ligação de saída de fila das funções fazem essas tarefas para si.The Functions runtime and queue output binding do those tasks for you.

O seu run método deve agora parecer o seguinte exemplo:Your run method should now look like the following example:

public HttpResponseMessage run(
        @HttpTrigger(name = "req", methods = {HttpMethod.GET, HttpMethod.POST}, authLevel = AuthorizationLevel.ANONYMOUS) 
        HttpRequestMessage<Optional<String>> request, 
        @QueueOutput(name = "msg", queueName = "outqueue", 
        connection = "AzureWebJobsStorage") OutputBinding<String> msg, 
        final ExecutionContext context) {
    context.getLogger().info("Java HTTP trigger processed a request.");

    // Parse query parameter
    String query = request.getQueryParameters().get("name");
    String name = request.getBody().orElse(query);

    if (name == null) {
        return request.createResponseBuilder(HttpStatus.BAD_REQUEST)
        .body("Please pass a name on the query string or in the request body").build();
    } else {
        // Write the name to the message queue. 
        msg.setValue(name);

        return request.createResponseBuilder(HttpStatus.OK).body("Hello, " + name).build();
    }
}

Atualizar os testesUpdate the tests

Como o arquétipo também cria um conjunto de testes, é necessário atualizar estes testes para lidar com o novo msg parâmetro na assinatura do run método.Because the archetype also creates a set of tests, you need to update these tests to handle the new msg parameter in the run method signature.

Navegue na localização do seu código de teste sob src/test/java, abra o ficheiro do projeto Function.java e substitua a linha de código //Invoke pelo seguinte código.Browse to the location of your test code under src/test/java, open the Function.java project file, and replace the line of code under //Invoke with the following code.

@SuppressWarnings("unchecked")
final OutputBinding<String> msg = (OutputBinding<String>)mock(OutputBinding.class);
final HttpResponseMessage ret = new Function().run(req, msg, context);

Atualizar a imagem no registoUpdate the image in the registry

  1. Na pasta raiz, volte a correr docker build e desta vez atualize a versão na etiqueta para v1.0.1 .In the root folder, run docker build again, and this time update the version in the tag to v1.0.1. Como antes, <docker_id> substitua-o pela sua conta Docker Hub:As before, replace <docker_id> with your Docker Hub account ID:

    docker build --tag <docker_id>/azurefunctionsimage:v1.0.1 .
    
  2. Empurre a imagem atualizada de volta para o repositório docker push com:Push the updated image back to the repository with docker push:

    docker push <docker_id>/azurefunctionsimage:v1.0.1
    
  3. Como configuraste a entrega contínua, atualizando a imagem no registo novamente atualiza automaticamente a sua aplicação de função em Azure.Because you configured continuous delivery, updating the image in the registry again automatically updates your function app in Azure.

Veja a mensagem na fila de armazenamento do AzureView the message in the Azure Storage queue

Num browser, utilize o mesmo URL de antes para invocar a sua função.In a browser, use the same URL as before to invoke your function. O navegador deve apresentar a mesma resposta de antes, porque não modificou essa parte do código de função.The browser should display the same response as before, because you didn't modify that part of the function code. O código adicionado, no entanto, escreveu uma mensagem usando o name parâmetro URL para a fila de outqueue armazenamento.The added code, however, wrote a message using the name URL parameter to the outqueue storage queue.

Pode ver a fila no portal Azure ou no Microsoft Azure Storage Explorer.You can view the queue in the Azure portal or in the Microsoft Azure Storage Explorer. Também pode ver a fila no CLI Azure, conforme descrito nos seguintes passos:You can also view the queue in the Azure CLI, as described in the following steps:

  1. Abra alocal.setting.jsdo projeto de função * no* ficheiro e copie o valor da cadeia de ligação.Open the function project's local.setting.json file and copy the connection string value. Numa janela de terminal ou comando, executar o seguinte comando para criar uma variável ambiental AZURE_STORAGE_CONNECTION_STRING chamada, colando a sua cadeia de ligação específica no lugar de <MY_CONNECTION_STRING> .In a terminal or command window, run the following command to create an environment variable named AZURE_STORAGE_CONNECTION_STRING, pasting your specific connection string in place of <MY_CONNECTION_STRING>. (Esta variável ambiental significa que não precisa de fornecer a cadeia de ligação a cada comando subsequente utilizando o --connection-string argumento.)(This environment variable means you don't need to supply the connection string to each subsequent command using the --connection-string argument.)

    export AZURE_STORAGE_CONNECTION_STRING="<MY_CONNECTION_STRING>"
    
  2. (Opcional) Utilize o az storage queue list comando para visualizar as filas de armazenamento na sua conta.(Optional) Use the az storage queue list command to view the Storage queues in your account. A saída deste comando deve incluir uma fila chamada outqueue , que foi criada quando a função escreveu a sua primeira mensagem para essa fila.The output from this command should include a queue named outqueue, which was created when the function wrote its first message to that queue.

    az storage queue list --output tsv
    
  3. Utilize o az storage message get comando para ler a mensagem desta fila, que deve ser o primeiro nome que usou ao testar a função anteriormente.Use the az storage message get command to read the message from this queue, which should be the first name you used when testing the function earlier. O comando lê e remove a primeira mensagem da fila.The command reads and removes the first message from the queue.

    echo `echo $(az storage message get --queue-name outqueue -o tsv --query '[].{Message:content}') | base64 --decode`
    

    Como o corpo da mensagem está armazenado na base64 codificado,a mensagem deve ser descodificado antes de ser exibida.Because the message body is stored base64 encoded, the message must be decoded before it's displayed. Depois de az storage message get executar, a mensagem é removida da fila.After you execute az storage message get, the message is removed from the queue. Se houvesse apenas uma outqueue mensagem, não recuperará uma mensagem quando executar este comando uma segunda vez e, em vez disso, terá um erro.If there was only one message in outqueue, you won't retrieve a message when you run this command a second time and instead get an error.

Limpar os recursosClean up resources

Se quiser continuar a trabalhar com a Azure Function utilizando os recursos que criou neste tutorial, pode deixar todos esses recursos no lugar.If you want to continue working with Azure Function using the resources you created in this tutorial, you can leave all those resources in place. Como criou um Plano Premium para Funções Azure, incorrerá num ou dois USD por dia em custos contínuos.Because you created a Premium Plan for Azure Functions, you'll incur one or two USD per day in ongoing costs.

Para evitar custos contínuos, elimine o AzureFunctionsContainer-rg grupo de recursos para limpar todos os recursos desse grupo:To avoid ongoing costs, delete the AzureFunctionsContainer-rg resource group to clean up all the resources in that group:

az group delete --name AzureFunctionsContainer-rg

Passos seguintesNext steps