Nota
O acesso a esta página requer autorização. Pode tentar iniciar sessão ou alterar os diretórios.
O acesso a esta página requer autorização. Pode tentar alterar os diretórios.
Neste artigo, vai integrar uma fila do Azure Storage com a conta do Azure Functions e a conta de armazenamento que criou no artigo de início rápido anterior. Você consegue essa integração usando uma associação de saída que grava dados de uma solicitação HTTP em uma mensagem na fila. A conclusão deste artigo não implica custos adicionais além dos poucos centavos de dólar do início rápido anterior. Para saber mais sobre ligações, veja disparadores e conceitos de ligações do Azure Functions.
Configure seu ambiente local
Antes de começar, deve completar o artigo, Quickstart: Crie um Azure Functions project a partir da linha de comandos. Se já limpaste os recursos no final desse artigo, repete os passos para recriar a aplicação de funções e os recursos relacionados no Azure.
Antes de começar, deve completar o artigo, Quickstart: Crie um Azure Functions project a partir da linha de comandos. Se já limpaste os recursos no final desse artigo, repete os passos para recriar a aplicação de funções e os recursos relacionados no Azure.
Antes de começar, deve completar o artigo, Quickstart: Crie um Azure Functions project a partir da linha de comandos. Se já limpaste os recursos no final desse artigo, repete os passos para recriar a aplicação de funções e os recursos relacionados no Azure.
Antes de começar, deve completar o artigo, Quickstart: Crie um Azure Functions project a partir da linha de comandos. Se já limpaste os recursos no final desse artigo, repete os passos para recriar a aplicação de funções e os recursos relacionados no Azure.
Antes de começar, deve completar o artigo, Quickstart: Crie um Azure Functions project a partir da linha de comandos. Se já limpaste os recursos no final desse artigo, repete os passos para recriar a aplicação de funções e os recursos relacionados no Azure.
Antes de começar, deve completar o artigo, Quickstart: Crie um Azure Functions project a partir da linha de comandos. Se já limpaste os recursos no final desse artigo, repete os passos para recriar a aplicação de funções e os recursos relacionados no Azure.
Recupera a cadeia de conexão do Azure Storage
Importante
Este artigo mostra atualmente como se ligar à sua conta Azure Storage usando a connection string, que contém uma chave secreta partilhada. Usar uma connection string facilita a verificação das atualizações de dados na conta de storage. Para garantir a melhor segurança, deve usar identidades geridas ao conectar-se à sua conta de armazenamento. Para obter mais informações, consulte Conexões no Guia do desenvolvedor.
Anteriormente, criaste uma conta no Azure Storage para uso da aplicação funcional. A connection string desta conta está armazenada de forma segura nas definições da aplicação no Azure. Ao descarregar as configurações para o ficheiro local.settings.json, pode usar a ligação para escrever numa fila de armazenamento na mesma conta enquanto executa a função localmente.
A partir da raiz do projeto, execute o comando seguinte, substituindo
<APP_NAME>pelo nome da sua aplicação de funções do estágio anterior. Este comando substitui quaisquer valores existentes no arquivo.func azure functionapp fetch-app-settings <APP_NAME>Abra o ficheiro local.settings.json e localize o valor chamado
AzureWebJobsStorage, que é a cadeia de ligação da conta de armazenamento. Usa o nomeAzureWebJobsStoragee a cadeia de conexão em outras secções deste artigo.
Importante
Como o ficheiro local.settings.json contém segredos descarregados de Azure, exclua sempre este ficheiro do controlo de versão. O ficheiro .gitignore criado com um projeto de funções locais exclui o ficheiro por defeito.
Registar extensões de associação
Exceto para gatilhos HTTP e timer, as ligações são implementadas como pacotes de extensão. Execute o seguinte comando dotnet add package na janela do Terminal para adicionar o pacote de extensão Storage ao seu project.
dotnet add package Microsoft.Azure.Functions.Worker.Extensions.Storage.Queues --prerelease
Agora, podes adicionar a vinculação de saída de armazenamento ao teu projeto.
Adicionar uma definição de vinculação de saída à função
Embora uma função possa ter apenas um trigger, pode ter múltiplas ligações de entrada e saída, o que permite conectar-se a outros serviços e recursos do Azure sem escrever código de integração personalizado.
Ao usar o modelo de programação Node.js v4, os atributos de ligação são definidos diretamente no arquivo ./src/functions/HttpExample.js . A partir do início rápido anterior, seu arquivo já contém uma ligação HTTP definida pelo app.http método.
const { app } = require('@azure/functions');
app.http('httpTrigger', {
methods: ['GET', 'POST'],
authLevel: 'anonymous',
handler: async (request, context) => {
try {
context.log(`Http function processed request for url "${request.url}"`);
const name = request.query.get('name') || (await request.text());
context.log(`Name: ${name}`);
if (!name) {
return { status: 404, body: 'Not Found' };
}
return { body: `Hello, ${name}!` };
} catch (error) {
context.log(`Error: ${error}`);
return { status: 500, body: 'Internal Server Error' };
}
},
});
Ao usar o modelo de programação Node.js v4, os atributos de ligação são definidos diretamente no arquivo ./src/functions/HttpExample.js . A partir do início rápido anterior, seu arquivo já contém uma ligação HTTP definida pelo app.http método.
import {
app,
HttpRequest,
HttpResponseInit,
InvocationContext,
} from '@azure/functions';
export async function httpTrigger1(
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('httpTrigger1', {
methods: ['GET', 'POST'],
authLevel: 'anonymous',
handler: httpTrigger1,
});
Você declara essas associações no arquivo function.json na sua pasta de funções. A partir do arranque rápido anterior, o seu arquivo function.json na pasta HttpExample contém duas associações na bindings coleção de configurações:
Ao usar o modelo de programação Python v2, os atributos de ligação são definidos diretamente no arquivo function_app.py como decoradores. A partir do início rápido anterior, seu arquivo de function_app.py já contém uma ligação baseada em decorador:
import azure.functions as func
import logging
app = func.FunctionApp()
@app.function_name(name="HttpTrigger1")
@app.route(route="hello", auth_level=func.AuthLevel.ANONYMOUS)
O route decorador adiciona a ligação HttpTrigger e HttpOutput à função, o que permite que sua função seja acionada quando as solicitações http atingem a rota especificada.
Para escrever numa fila de Azure Storage a partir desta função, adicione o decorador queue_output ao seu código de função:
@app.queue_output(arg_name="msg", queue_name="outqueue", connection="AzureWebJobsStorage")
No decorador, arg_name identifica o parâmetro de ligação referenciado no seu código, queue_name é o nome da fila onde a ligação escreve, e connection é o nome de uma configuração de aplicação que contém a cadeia de ligação para a conta de armazenamento. Em inícios rápidos, utiliza-se a mesma conta de armazenamento do aplicativo de funções, que se encontra na definição AzureWebJobsStorage (do ficheiro local.settings.json). Quando o queue_name não existe, a ligação cria-o na primeira utilização.
"bindings": [
{
"authLevel": "function",
"type": "httpTrigger",
"direction": "in",
"name": "Request",
"methods": [
"get",
"post"
]
},
{
"type": "http",
"direction": "out",
"name": "Response"
}
]
Para escrever numa fila do Azure Storage:
Adicionar uma
extraOutputspropriedade à configuração de vinculação{ methods: ['GET', 'POST'], extraOutputs: [sendToQueue], // add output binding to HTTP trigger authLevel: 'anonymous', handler: () => {} }Adicionar uma
output.storageQueuefunção acima daapp.httpchamadaconst sendToQueue: StorageQueueOutput = output.storageQueue({ queueName: 'outqueue', connection: 'AzureWebJobsStorage', });
A segunda ligação na coleção é denominada res. Essa http associação é uma ligação de saída (out) que é usada para gravar a resposta HTTP.
Para escrever numa fila de Azure Storage a partir desta função, adicione uma ligação out do tipo queue com o nome msg, conforme mostrado no código abaixo:
{
"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"
}
]
}
Para um tipo queue, deve especificar o nome da fila em queueName e fornecer o nome da ligação Azure Storage (do ficheiro local.settings.json) em connection.
Num project C#, as ligações são definidas como atributos de ligação no método da função. As definições específicas dependem se seu aplicativo é executado em processo (biblioteca de classes C#) ou em um processo de trabalho isolado.
Abra o ficheiro HttpExample.cs project e adicione a seguinte classe MultiResponse:
public class MultiResponse
{
[QueueOutput("outqueue", Connection = "AzureWebJobsStorage")]
public string[] Messages { get; set; }
public IActionResult HttpResponse { get; set; }
}
A classe MultiResponse permite-lhe escrever numa fila de storage chamada outqueue e numa mensagem HTTP de sucesso. Várias mensagens podem ser enviadas para a fila porque o QueueOutput atributo é aplicado a uma matriz de cadeia de caracteres.
A propriedade Connection define a cadeia de conexão para a conta de armazenamento. Neste caso, podes omitir Connection porque já estás a usar a conta storage padrão.
Num projeto Java, as ligações são definidas como anotações de ligação no método de função. O arquivo function.json é gerado automaticamente com base nessas anotações.
Navegue até à localização do seu código de função em src/main/java, abra o ficheiro Function.java project e adicione o seguinte parâmetro à definição do método run:
@QueueOutput(name = "msg", queueName = "outqueue", connection = "AzureWebJobsStorage") OutputBinding<String> msg
O parâmetro msg é um tipo OutputBinding<T>, que representa uma coleção de cadeias. Essas cadeias de caracteres são gravadas como mensagens para uma ligação de saída quando a função é concluída. Neste caso, a saída é uma fila de armazenamento chamada outqueue. O connection string para a conta Storage é definido pelo método connection. Passa a definição de aplicação que contém a cadeia de conexão da conta de armazenamento, em vez de passar a própria cadeia de conexão.
A run definição do método agora deve se parecer com o exemplo a seguir:
@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) {
...
}
Para mais informações sobre os detalhes dos bindings, consulte os conceitos de triggers e bindings do Azure Functions e a configuração de saída da fila.
Adicionar código para usar a vinculação de saída
Com a vinculação de fila definida, agora você pode atualizar sua função para receber o msg parâmetro de saída e gravar mensagens na fila.
Atualize HttpExample\function_app.py para corresponder ao código a seguir, adicione o msg parâmetro à definição da função e msg.set(name) sob a if name: instrução:
import azure.functions as func
import logging
app = func.FunctionApp(http_auth_level=func.AuthLevel.ANONYMOUS)
@app.route(route="HttpExample")
@app.queue_output(arg_name="msg", queue_name="outqueue", connection="AzureWebJobsStorage")
def HttpExample(req: func.HttpRequest, msg: func.Out [func.QueueMessage]) -> func.HttpResponse:
logging.info('Python HTTP trigger function processed a request.')
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}. This HTTP triggered function executed successfully.")
else:
return func.HttpResponse(
"This HTTP triggered function executed successfully. Pass a name in the query string or in the request body for a personalized response.",
status_code=200
)
O parâmetro msg é uma instância do azure.functions.Out class. O set método grava uma mensagem de texto na fila. Nesse caso, é o name passado para a função na string de consulta do URL.
Adicione código que utilize o objeto de vinculação de saída em context.extraOutputs para criar uma mensagem de fila. Adicione este código antes da instrução return.
context.extraOutputs.set(sendToQueue, [msg]);
Neste ponto, sua função pode ter a seguinte aparência:
const { app, output } = require('@azure/functions');
const sendToQueue = output.storageQueue({
queueName: 'outqueue',
connection: 'AzureWebJobsStorage',
});
app.http('HttpExample', {
methods: ['GET', 'POST'],
authLevel: 'anonymous',
extraOutputs: [sendToQueue],
handler: async (request, context) => {
try {
context.log(`Http function processed request for url "${request.url}"`);
const name = request.query.get('name') || (await request.text());
context.log(`Name: ${name}`);
if (name) {
const msg = `Name passed to the function ${name}`;
context.extraOutputs.set(sendToQueue, [msg]);
return { body: msg };
} else {
context.log('Missing required data');
return { status: 404, body: 'Missing required data' };
}
} catch (error) {
context.log(`Error: ${error}`);
return { status: 500, body: 'Internal Server Error' };
}
},
});
Adicione código que utilize o objeto de vinculação de saída em context.extraOutputs para criar uma mensagem de fila. Adicione este código antes da instrução return.
context.extraOutputs.set(sendToQueue, [msg]);
Neste ponto, sua função pode ter a seguinte aparência:
import {
app,
output,
HttpRequest,
HttpResponseInit,
InvocationContext,
StorageQueueOutput,
} from '@azure/functions';
const sendToQueue: StorageQueueOutput = output.storageQueue({
queueName: 'outqueue',
connection: 'AzureWebJobsStorage',
});
export async function HttpExample(
request: HttpRequest,
context: InvocationContext,
): Promise<HttpResponseInit> {
try {
context.log(`Http function processed request for url "${request.url}"`);
const name = request.query.get('name') || (await request.text());
context.log(`Name: ${name}`);
if (name) {
const msg = `Name passed to the function ${name}`;
context.extraOutputs.set(sendToQueue, [msg]);
return { body: msg };
} else {
context.log('Missing required data');
return { status: 404, body: 'Missing required data' };
}
} catch (error) {
context.log(`Error: ${error}`);
return { status: 500, body: 'Internal Server Error' };
}
}
app.http('HttpExample', {
methods: ['GET', 'POST'],
authLevel: 'anonymous',
handler: HttpExample,
});
Adicione código que usa o Push-OutputBinding cmdlet para gravar texto na fila usando a msg associação de saída. Adicione este código antes de definir o status OK na if instrução.
$outputMsg = $name
Push-OutputBinding -name msg -Value $outputMsg
Neste ponto, sua função deve ter a seguinte aparência:
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
})
Substitua o método existente Run pelo seguinte código:
[Function("HttpExample")]
public MultiResponse Run([HttpTrigger(AuthorizationLevel.Function, "get", "post")] HttpRequest req)
{
_logger.LogInformation("C# HTTP trigger function processed a request.");
var message = "Welcome to Azure Functions!";
// Return a response to both HTTP trigger and storage output binding.
return new MultiResponse()
{
// Write a single message.
Messages = new string[] { message },
HttpResponse = new OkObjectResult(message)
};
}
Agora, pode usar o novo parâmetro msg para gravar na vinculação de saída do seu código de função. Adicione a seguinte linha de código antes da resposta de sucesso para adicionar o valor de name à ligação de saída de msg.
msg.setValue(name);
Quando usas uma ligação de saída, não precisas de usar o código do SDK do Azure Storage para autenticação, obter uma referência de fila ou escrever dados. O tempo de execução do Functions e a vinculação de saída da fila fazem essas tarefas por você.
O seu run método deve agora parecer-se com o exemplo a seguir:
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 testes
Como o arquétipo também cria um conjunto de testes, você precisa atualizar esses testes para manipular o novo msg parâmetro na assinatura do run método.
Navegue até à localização do seu código de teste em src/test/java, abra o ficheiro Function.java project e substitua a linha de código em //Invoke pelo seguinte código:
@SuppressWarnings("unchecked")
final OutputBinding<String> msg = (OutputBinding<String>)mock(OutputBinding.class);
final HttpResponseMessage ret = new Function().run(req, msg, context);
Observe que você não precisa escrever nenhum código para autenticação, obter uma referência de fila ou gravar dados. Todas estas tarefas de integração são convenientemente geridas no tempo de execução do Azure Functions e na associação de saída da fila.
Executar a função localmente
Executa a tua função iniciando o host local Azure Functions runtime a partir da pasta LocalFunctionProj.
func startNo final da saída, as seguintes linhas devem aparecer:
Nota
Se o HttpExample não aparecer como mostrado acima, provavelmente iniciou o host a partir de fora da pasta raiz do projecto. Nesse caso, usa Ctrl+C para parar o host, vai à pasta raiz do project e executa novamente o comando anterior.
Copie o endereço URL da sua função HTTP desta saída para um navegador e anexe a cadeia de consulta de caracteres
?name=<YOUR_NAME>, tornando o URL completo comohttp://localhost:7071/api/HttpExample?name=Functions. O navegador deve exibir uma mensagem de resposta que ecoe o valor da cadeia de caracteres de consulta. O terminal onde iniciaste o teu projeto também mostra a saída de registo à medida que fazes pedidos.Quando terminar, pressione Ctrl + C e digite
ypara parar o host de funções.
Veja a mensagem na fila do Azure Storage
Pode ver a fila no Azure portal ou no Microsoft Azure Storage Explorer. Também pode visualizar a fila na Azure CLI, conforme descrito nos passos seguintes:
Abre o ficheiro local.setting.json do projeto da função e copia o valor da cadeia de conexão. Num terminal ou janela de comandos, execute o comando seguinte para criar uma variável de ambiente chamada
AZURE_STORAGE_CONNECTION_STRING, e cole o seu connection string específico em vez de<MY_CONNECTION_STRING>. (Esta variável de ambiente significa que não precisa de fornecer o connection string a cada comando subsequente usando o argumento--connection-string.)export AZURE_STORAGE_CONNECTION_STRING="<MY_CONNECTION_STRING>"(Opcional) Use o comando
az storage queue listpara visualizar as filas de Storage na sua conta. A saída desse comando deve incluir uma fila chamadaoutqueue, que foi criada quando a função escreveu sua primeira mensagem para essa fila.az storage queue list --output tsvUse o comando
az storage message getpara ler a mensagem desta fila, que deve ser o valor que forneceu ao testar a função anteriormente. O comando lê e remove a primeira mensagem da fila.echo `echo $(az storage message get --queue-name outqueue -o tsv --query '[].{Message:content}') | base64 --decode`Como o corpo da mensagem é armazenado base64 codificado, a mensagem tem de ser decodificada antes de ser exibida. Depois de executar
az storage message get, a mensagem é removida da fila. Se houver apenas uma mensagem emoutqueue, não receberá outra mensagem quando executar este comando uma segunda vez e, ao invés disso, receberá um erro.
Reimplemente o projeto para o Azure
Depois de verificares localmente que a função escreveu uma mensagem para a fila do Azure Storage, podes reimplantar o teu projeto para atualizar o endpoint que corre no Azure.
Na pasta LocalFunctionsProj, use o comando func azure functionapp publish para redistribuir o project, substituindo<APP_NAME> pelo nome da sua aplicação.
func azure functionapp publish <APP_NAME>
Na pasta do projeto local, use o seguinte comando Maven para republicar o seu projeto.
mvn azure-functions:deploy
Verificar no Azure
Como no início rápido anterior, use um navegador ou CURL para testar a função reimplantada.
Examine novamente a fila Storage, conforme descrito na secção anterior, para verificar se contém a nova mensagem escrita na fila.
Limpar recursos
Depois de terminar, use o seguinte comando para excluir o grupo de recursos e todos os recursos contidos para evitar incorrer em custos adicionais.
az group delete --name AzureFunctionsQuickstart-rg
Próximos passos
Atualizaste a tua função ativada por HTTP para escrever dados numa fila de armazenamento. Agora pode aprender mais sobre o desenvolvimento de Funções a partir da linha de comandos usando o Core Tools e o Azure CLI: