Ошибка при подключении к службе хранилища больших двоичных объектов Azure с помощью Java (код состояния 405, UnsupportedHttpVerb)

#java #azure #azure-blob-storage

Вопрос:

Я пытаюсь подключиться к службе хранилища Blob-объектов Azure из функции Azure, но все, что она возвращает, является BlobStorageException

Я использовал этот пример: клиентская библиотека Blob-объектов хранилища Azure для Java (Создайте BLOB-сервис-клиент)

Вот мой код:

 String MY_BLOB_ENDPOINT = "https://mystorageaccount.z13.web.core.windows.net/"

String MY_BLOB_SAS_TOKEN = "?sv=2017-07-29amp;ss=bamp;srt=samp;sp=rwdcamp;se=2022-06-10T00:00:00Zamp;st=2021-06-10T00:00:00Zamp;spr=httpsamp;sig=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"

String MY_DEFAULT_CONTAINER_NAME = "test"

BlobServiceClient serviceClient = new BlobServiceClientBuilder()
    .endpoint(MY_BLOB_ENDPOINT)
    .sasToken(MY_BLOB_SAS_TOKEN)
    .buildClient();

this.containerClient = serviceClient.
    getBlobContainerClient(MY_DEFAULT_CONTAINER_NAME);

if (!this.containerClient.exists()) {
    this.containerClient.create();
}
 

Вот журналы:

 ... (omitted logs)
[2021-06-26T03:36:28.671Z] Executed 'Functions.upload' (Failed, Id=ffdff367-242e-494a-8303-e9ceeee6a2d7, Duration=5919ms)
[2021-06-26T03:36:28.671Z] System.Private.CoreLib: Exception while executing function: Functions.upload. System.Private.CoreLib: Result: Failure
[2021-06-26T03:36:28.671Z] Exception: BlobStorageException: Status code 405,
                           "<!DOCTYPE html>
                            <html>
                              <head>
                                <title>UnsupportedHttpVerb</title>
                              </head>
                              <body>
                                <h1>The resource doesn't support specified Http Verb.</h1>
                                <p>
                                  <ul>
                                    <li>HttpStatusCode: 405</li>
                                    <li>ErrorCode: UnsupportedHttpVerb</li>
                                    <li>RequestId : 05ac7acf-701e-0026-213c-6adf7e000000</li><li>TimeStamp : 2021-06-26T03:36:28.4852611Z</li>
                                  </ul>
                                </p>
                              </body>
                            </html>"
[2021-06-26T03:36:28.671Z] Stack: java.lang.IllegalStateException: Failed to initialize
[2021-06-26T03:36:28.671Z]      at org.springframework.cloud.function.adapter.azure.FunctionInvoker.<init>(FunctionInvoker.java:90)
[2021-06-26T03:36:28.671Z]      at org.springframework.cloud.function.adapter.azure.FunctionInvoker.<init>(FunctionInvoker.java:95)
... (omitted logs)
 

Зависимость От Хранилища Больших Двоичных Объектов

 <dependency>
    <groupId>com.azure</groupId>
    <artifactId>azure-storage-blob</artifactId>
    <version>12.11.1</version>
</dependency>
 

Я не знаю, почему это не работает. Есть ли какие-то дополнительные настройки, которые мне нужно настроить?.

Комментарии:

1. Это очень странно! Вы можете отредактировать свой вопрос и включить значения для MY_BLOB_ENDPOINT , MY_BLOB_SAS_TOKEN и MY_DEFAULT_CONTAINER_NAME . Пожалуйста, запутай имя учетной записи, sig часть своего маркера SAS, прежде чем делиться.

2. @Gauravman, я их изменил.

3. Спасибо. Я дал ответ. ХТХ.

Ответ №1:

Причина, по которой вы получаете эту ошибку, заключается в том, что вы используете неправильную конечную точку. Пожалуйста, попробуйте изменить:

 String MY_BLOB_ENDPOINT = "https://mystorageaccount.z13.web.core.windows.net/"
 

Для

 String MY_BLOB_ENDPOINT = "https://mystorageaccount.blob.core.windows.net/"
 

и вы не должны получить ошибку.

По сути https://mystorageaccount.z13.web.core.windows.net/ , это специальная конечная точка для доступа static website hosted in Azure Blob Storage . Эта конечная точка сопоставляется с $web контейнером больших двоичных объектов.

Для выполнения любых операций с контейнерами и большими двоичными объектами вам нужно будет использовать конечную точку большого двоичного объекта, которая должна быть похожа https://mystorageaccount.blob.core.windows.net/ .

Комментарии:

1. Так верно. Теперь он отлично работает локально, но когда я развертываю его в Azure, в Application Insights я получаю это сообщение об ошибке , связано ли это с часовым поясом функции?

2. Можете ли вы отредактировать свой вопрос и включить код для создания SAS? Кроме того, какой часовой пояс для вашей функции Azure?

3. Он находится в нулевом часовом поясе UTC, и я сгенерировал токен SAS, используя Terraform с start: 2021-06-10T00:00:00Z и expiry: 2022-06-10T00:00:00Z даты

4. Можете ли вы поделиться точным сообщением об ошибке? Я бы рекомендовал задать для этого отдельный вопрос. Спасибо.

Ответ №2:

Убедитесь, что предоставленный вами ключ SAS действителен или разрешает доступ к большим двоичным объектам в учетной записи хранения

Комментарии:

1. Я использовал Terraform для развертывания своей учетной записи хранения и создания токена SAS (по этой ссылке ) Я изменил только start / expiration даты и настройки разрешений create read , write и delete разрешены ли уникальные разрешения.