У меня есть функция Azure v1, SDK 1.0.24, пытающаяся получить доступ к моей очереди хранения, которая отлично работает локально, и я вижу, что сообщения хранятся правильно. Но как только я публикую его в облаке, он выходит из строя с 403 запрещенными, и у меня закончились подсказки.
Я проверил строку подключения несколько раз, я проверил временные метки в запросе и ответе, которые полностью в порядке. Я пытался обновить несколько пакетов NuGet, но, в конце концов, почему они должны работать локально, а не онлайн, если они сломаны? Я не использую Application Insights. В журнале хоста я нашел эту ошибку:
2019-01-16T12: 38: 32.460 [Verbose] Host
«44bf8a95b6652eed85464155b2b48df2» не удалось получить аренду блокировки узла:
Microsoft.WindowsAzure.Storage: удаленный сервер возвратил ошибку:
(403) Запрещено.
Я подозреваю, что в Azure есть параметр безопасности, который запрещает доступ (но я не имею никакого контроля над функциями безопасности, и администратор также не знает, что может быть проблема блокировки).
Проблема возникает с QueueTrigger, поэтому я сделал небольшую функцию с альтернативным доступом для воспроизведения проблемы:
public static class TestStorageQueue
{
[FunctionName("TestStorageQueue")]
public static async Task<HttpResponseMessage> Run(
[HttpTrigger(AuthorizationLevel.Function, "get", "post", Route = null)]HttpRequestMessage req,
TraceWriter log)
{
log.Info("START");
try
{
var response = new HttpResponseMessage(HttpStatusCode.OK);
log.Info(ConfigurationManager.ConnectionStrings["soastorage"]?.ConnectionString);
CloudStorageAccount storeAccount = CloudStorageAccount.Parse(ConfigurationManager.ConnectionStrings["soastorage"]?.ConnectionString);
CloudQueueClient queueClient = storeAccount.CreateCloudQueueClient();
CloudQueue queue = queueClient.GetQueueReference("myqueue");
log.Info("trying to get message from queue");
var cloudMessage = queue.GetMessage(); // 403 happens here
log.Info("received message item");
var message = cloudMessage?.AsBytes;
var length = message?.Length ?? 0;
response.Content = new StringContent("received message length: " + length.ToString());
return response;
}
catch(Exception ex)
{
var response = new HttpResponseMessage(HttpStatusCode.InternalServerError);
response.Content = new StringContent(ex.Message);
return response;
}
}
}
Обновление
Забавно, 2 дня искал ответ, и как только я его опубликовал, мы нашли причину. Проблема заключается в брандмауэре хранилища Azure, даже при включении в белый список всех служб MS он продолжает блокировать их. Таким образом, временное решение состояло в том, чтобы отключить его, что на самом деле не является решением, так что вопрос все еще не решен