Не удается создать контейнеры BLOB-объектов Azure из командлета powershell - PullRequest
0 голосов
/ 29 апреля 2020

У меня есть небольшой кусочек C# кода, который прекрасно создает контейнер BLOB-объектов Azure при запуске через исполняемый файл консольного режима, но завершается неудачно, когда тот же код является частью командлета PowerShell (также в C#) ). Режим сбоя действительно странный: он создает контейнер, но затем повторяет попытки в течение нескольких минут, прежде чем произойдет ошибка. Я не понимаю.

Код, который построен в Visual Studio с использованием. NET Framework 4.8 и Azure .Storage.Blobs v12.4.1:

using System.Management.Automation;
using Azure.Storage.Blobs;
using Azure.Storage.Blobs.Models;

namespace BlobTest.Commands
{
    [Cmdlet(VerbsData.Initialize, "AzContainer")]
    public class Initialize_AzContainer : Cmdlet
    {
        protected override void ProcessRecord()
        {
            base.ProcessRecord();

            const string AzStorageAccount = "stevestorageaccount";
            const string AzAccessKey = "*****==";

            string connectionString = $"DefaultEndpointsProtocol=http" // http intentional: for wireshark
                                      + $";AccountName={AzStorageAccount}"
                                      + $";AccountKey={AzAccessKey}"
                                      + ";EndpointSuffix=core.windows.net";

            const string containerName = "my-test-container-2";

            var bsclient = new BlobServiceClient(connectionString);

            WriteVerbose($"Creating container {containerName}");
            var rc = bsclient.CreateBlobContainer(containerName, PublicAccessType.None);

            WriteVerbose($"Result = {rc}");
        }
    }
}

Это зависает в течение пары минут перед тем, как ссориться:

PS> Import-Module .\BlobTest.Commands.dll
PS> Initialize-AzContainer -Verbose
VERBOSE: Creating container my-test-container-2

[hung out for 7 minutes]

Initialize-AzContainer : Retry failed after 6 tries.
At line:1 char:1
+ Initialize-AzContainer -Verbose
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (:) [Initialize-AzContainer], AggregateException
    + FullyQualifiedErrorId : System.AggregateException,BlobTest.Commands.Initialize_AzContainer

Я намеренно использую небезопасный http при устранении неполадок, поэтому могу прослушать разговор, и Wireshark демонстрирует действительно странное поведение. // в следах - мои заметки, а не часть следа:

// MY END SENDS: this looks normal
PUT /my-test-container-2?restype=container HTTP/1.1
x-ms-version: 2019-07-07
x-ms-client-request-id: acc4991b-33ab-4764-9f20-a33edb5cc4a3
x-ms-return-client-request-id: true
User-Agent: azsdk-net-Storage.Blobs/12.4.1 (.NET Framework 4.8.4150.0; Microsoft Windows 10.0.18363 )
x-ms-date: Wed, 29 Apr 2020 17:42:27 GMT
Authorization: SharedKey <secret key info>
Host: stevestorageaccount.blob.core.windows.net
Content-Length: 0

// AZURE REPLIES: all ok!
HTTP/1.1 201 Created
Content-Length: 0
Last-Modified: Wed, 29 Apr 2020 17:42:28 GMT
ETag: "0x8D7EC64AF7BD68A"
Server: Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0
x-ms-request-id: 5ebb740e-201e-001a-354d-1e15bd000000
x-ms-client-request-id: acc4991b-33ab-4764-9f20-a33edb5cc4a3
x-ms-version: 2019-07-07
Date: Wed, 29 Apr 2020 17:42:27 GMT

// MY END TRIES AGAIN - huh?
PUT /my-test-container-2?restype=container HTTP/1.1
x-ms-version: 2019-07-07
x-ms-client-request-id: acc4991b-33ab-4764-9f20-a33edb5cc4a3
x-ms-return-client-request-id: true
User-Agent: azsdk-net-Storage.Blobs/12.4.1 (.NET Framework 4.8.4150.0; Microsoft Windows 10.0.18363 )
x-ms-date: Wed, 29 Apr 2020 17:42:29 GMT
Authorization: SharedKey <secret key info>
Host: stevestorageaccount.blob.core.windows.net
Content-Length: 0

// AZURE REPLIES: sorry already exists
HTTP/1.1 409 The specified container already exists.
Content-Length: 230
Content-Type: application/xml
Server: Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0
x-ms-request-id: 5ebb7805-201e-001a-224d-1e15bd000000
x-ms-client-request-id: acc4991b-33ab-4764-9f20-a33edb5cc4a3
x-ms-version: 2019-07-07
x-ms-error-code: ContainerAlreadyExists
Date: Wed, 29 Apr 2020 17:42:29 GMT
...<?xml version="1.0" encoding="utf-8"?>
<Error>
<Code>ContainerAlreadyExists</Code>
<Message>The specified container already exists.
RequestId:5ebb7805-201e-001a-224d-1e15bd000000
Time:2020-04-29T17:42:29.6128339Z</Message></Error>

(repeats a few times)

Тот же самый код прекрасно работает в исполняемом файле в режиме консоли и ведет себя одинаково при использовании async или обычный синхронный, как указано выше. Я пробовал различные другие комбинации, добавляя токен отмены и т. Д. c. и ничто не влияет на это.

Примечание. Я знаю, как создать контейнер с нативными командлетами Azure, но приведенное выше является частью дополнительной обработки, поэтому я пытаюсь докопаться до сути ошибки. Я не могу найти какой-то другой способ создания контейнера.

Я потратил немало часов на это и затрудняюсь понять, что происходит.

Редактировать: Я попытался перезагрузить систему, без разницы, и это все с PowerShell 5.1.18362.752 на Windows 10 со всеми последними обновлениями.

1 Ответ

1 голос
/ 30 апреля 2020

Кажется, что retry policy здесь срабатывает. Но странная вещь заключается в том, что в консольном проекте он не повторяется, если операция прошла успешно.

В качестве обходного пути в своем коде вы можете установить политику повторных попыток, пример кода приведен ниже:

[Cmdlet(VerbsData.Initialize, "AzContainer")]
public class Initialize_AzContainer : Cmdlet
{
    protected override void ProcessRecord()
    {
        base.ProcessRecord();

       //other code

       //set the retry policy here
        var options = new BlobClientOptions();
        options.Retry.MaxRetries = 0;

        var bsclient = new BlobServiceClient(connectionString, options);

        WriteVerbose($"Creating container {containerName}");

        var rc = bsclient.CreateBlobContainer(containerName, PublicAccessType.None);
        WriteVerbose($"Result = {rc}");


    }

}
...