Доступ к функции 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-адресами приложения-функции, чтобы сделать вывод:

  1. На панели "Функции" на портале Azure "Функции платформы"> "Обозреватель ресурсов".

  2. найти outboundIpAddresses и добавьте их все в список IP-адресов брандмауэра.

  3. Если наши функции находятся на выделенном плане обслуживания приложения (например, Basic, Standard и т. Д.), Добавьте possibleOutboundIPAddresses если мы хотим масштабировать план на другие ценовые уровни.

  4. Если наши функции находятся в плане потребления, нам, возможно, придется внести в белый список центр обработки данных функциональных приложений.

Другие вопросы по тегам