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


person Mark Zoeltsch    schedule 16.01.2019    source источник
comment
У меня это не работает с функцией v2 в той же ситуации, с той же проблемой. Это раздражительно.   -  person blas3nik    schedule 01.09.2020


Ответы (1)


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

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

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

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

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

person Jerry Liu    schedule 16.01.2019