Доступ к функции Azure v1 запрещен для очереди хранения в облаке - PullRequest
0 голосов
/ 16 января 2019

У меня есть функция 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 он продолжает блокировать их. Таким образом, временное решение состояло в том, чтобы отключить его, что на самом деле не является решением, так что вопрос все еще не решен

1 Ответ

0 голосов
/ 16 января 2019

Попробуйте настроить брандмауэр хранилища с Функциональные IP-адреса приложения * , чтобы сделать вывод:

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

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

  3. Если наши функции выполняются в специальном плане обслуживания приложений (например, «Основной», «Стандартный» и т. Д.), Добавьте possibleOutboundIPAddresses, если мы хотим масштабировать план для других уровней ценообразования.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...