Criei um aplicativo de Função do Azure. Nele, tenho uma função HTTPTrigger "Sync" que funciona muito bem e pode ser chamada com sucesso localmente por (HTTP://localhost/api/sync) ou pelo Azure usando sua URL do Azure ( https://xxx.azurewebsites.net/api/sync ).
Eu queria poder continuar chamando essa função via http, mas também queria acioná-la para ser executada uma vez por hora, então criei uma função TimerTrigger "ScheduledSync" com o único propósito de chamar a função "Sync" via HTTPRequestMessage.
O ScheduledSync funciona muito bem chamando e executando localmente a função HTTP acionada com sucesso, mas depois que ela é publicada no Azure, a solicitação HTTP para https://xxx.azurewebsites.net/api/sync falha.
Nada do que tentei funcionou, recebendo um erro 403 não autorizado nos logs da função ScheduledSync. Eu estava passando a chave da função, mas depois removi a autenticação completamente, mas é como se o Azure não permitisse que uma função se chamasse usando a URL completa do Azure, e o localhost também não funciona no Azure. Consigo chamar remotamente a mesma URL de sincronização do Azure do PostMan que o ScheduledSync está chamando, sem autenticação ou chave, e ele funciona com sucesso.
Tentei refatorar com base nesta pergunta e resposta, mas não pareceu fazer diferença.
[Function("Sync")]
public async Task<HttpResponseData> Run(
[HttpTrigger(AuthorizationLevel.Function, "post")] HttpRequestData req,
FunctionContext _,
CancellationToken cancellationToken)
{
... //sync code
[Function("ScheduledSync")]
public async Task RunAsync([TimerTrigger("0 0 * * * *")] TimerInfo timerInfo, CancellationToken cancellationToken)
{
...
try
{
using var request = new HttpRequestMessage(HttpMethod.Post, uri);
var response = await _httpClient.SendAsync(request, cancellationToken);
... // logging and error handling code
Log de funções:
2025-04-28T22:46:00Z [Information] Executing 'Functions.ScheduledSync' (Reason='Timer fired at 2025-04-28T22:46:00.0027402+00:00', Id=895d3ab8-b00e-40b0-837d-a77892b125c6)
2025-04-28T22:46:00Z [Information] Trigger Details: ScheduleStatus: {"Last":"2025-04-28T22:45:00+00:00","Next":"2025-04-28T22:46:00+00:00","LastUpdated":"2025-04-28T22:45:00+00:00"}
2025-04-28T22:46:00Z [Information] Start processing HTTP request POST https://xxx.azurewebsites.net/api/Sync
2025-04-28T22:46:00Z [Information] Sending HTTP request POST https://xxx.azurewebsites.net/api/Sync
2025-04-28T22:46:00Z [Information] Received HTTP response headers after 46.0215ms - 403
2025-04-28T22:46:00Z [Information] End processing HTTP request after 46.2548ms - 403
2025-04-28T22:46:00Z [Error] Scheduled Sync call failed with status Forbidden: <!DOCTYPE HTML>
<HTML>
....
<h1 id="unavailable">Error 403 - Forbidden</h1>
<p id="tryAgain">The web app you have attempted to reach has blocked your access
</p>
...
</HTML>
Agradecemos antecipadamente por qualquer ajuda que você nos fornecer.
O Azure possui muitas "regra de segurança" que impedem padrões. Uma delas é o que chamamos de Restrições de Acesso. Geralmente, o padrão é "Sem Acesso" ou algo similar. Você precisará criar uma regra para permitir que sua função acesse a outra função desejada. Você pode fazer isso de algumas maneiras, inclusive por IP.
Veja aqui para mais informações: https://learn.microsoft.com/en-us/azure/app-service/app-service-ip-restrictions?tabs=azurecli