Доступ к функции Azure v1 запрещен для очереди хранения в облаке
У меня есть функция Azure v1, SDK 1.0.24, пытающаяся получить доступ к моей очереди хранения, которая отлично работает локально, и я вижу, что сообщения хранятся правильно. Но как только я публикую его в облаке, он выходит из строя с 403 запрещенными, и у меня закончились подсказки.
Я проверил строку подключения несколько раз, я проверил временные метки в запросе и ответе, которые полностью в порядке. Я пытался обновить несколько пакетов NuGet, но, в конце концов, почему они должны работать локально, а не онлайн, если они сломаны? Я не использую Application Insights. В журнале хоста я нашел эту ошибку:
2019-01-16T12: 38: 32.460 [Подробно] Хосту '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 он продолжает блокировать их. Таким образом, временное решение состояло в том, чтобы отключить его, что на самом деле не является решением, так что вопрос еще не решен
1 ответ
Попробуйте настроить межсетевой экран хранилища с исходящими IP-адресами приложения-функции, чтобы сделать вывод:
На панели "Функции" на портале Azure "Функции платформы"> "Обозреватель ресурсов".
найти
outboundIpAddresses
и добавьте их все в список IP-адресов брандмауэра.Если наши функции находятся на выделенном плане обслуживания приложения (например, Basic, Standard и т. Д.), Добавьте
possibleOutboundIPAddresses
если мы хотим масштабировать план на другие ценовые уровни.Если наши функции находятся в плане потребления, нам, возможно, придется внести в белый список центр обработки данных функциональных приложений.