4

BLOB を Azure ストレージにアップロードしようとする powershell モジュールがあります。実際にブロブをアップロードする最後の行まで、すべてがチェックアウトされます。

次のエラーが表示されます。

Exception calling "UploadText" with "1" argument(s): 
"The specified resource does not exist."
At line:1 char:1
    + $blob.UploadText("asdasdfsdf")
    + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (:) [], MethodInvocationException
    + FullyQualifiedErrorId : StorageClientException

3 つの引数でオーバーロードを使用してみましたが、同じ問題も存在します。

モジュールは次のとおりです。

Function Add-BlobText
{
[CmdletBinding()]
param(
      [Parameter(Mandatory = $true,Position = 0)]
      [string]
      $StorageAccount,

      [Parameter(Mandatory = $true,Position = 1)]
      [string]
      $Container,

      [Parameter(Mandatory = $true,Position = 2)]
      [string]
      $BlobName,

      [Parameter(Mandatory = $true, ValueFromPipeline = $true)]
      [string]
      $BlobText
) #end param

Add-Type -Path "C:\Assemblies\Microsoft.WindowsAzure.StorageClient.dll"

Set-AzureSubscription -SubscriptionName "MySubName"

$secondaryKey = (Get-AzureStorageKey -StorageAccountName $storageAccount).Secondary

$creds = New-Object Microsoft.WindowsAzure.StorageCredentialsAccountAndKey($StorageAccount,$secondaryKey)

$cloudStorageAccount = New-Object Microsoft.WindowsAzure.CloudStorageAccount($creds, $true)

[Microsoft.WindowsAzure.StorageClient.CloudBlobClient]$cloudBlobClient = New-Object Microsoft.WindowsAzure.StorageClient.CloudBlobClient($cloudStorageAccount.BlobEndpoint)

[Microsoft.WindowsAzure.StorageClient.CloudBlobContainer]$blobContainer = $cloudBlobClient.GetContainerReference($Container)

[Microsoft.WindowsAzure.StorageClient.CloudBlob]$blob = $blobContainer.GetBlobReference($BlobName)

$blob.UploadText($BlobText)     

} #end Function Add-BlobText

アップデート:

これをバイナリモジュールとして機能させることができました(以下)。バイナリ モジュール内では機能するのに、スクリプト モジュール内で例外がスローされる理由を誰かが理解できる場合UploadText()は、お知らせください。

[Cmdlet(VerbsCommon.Add, "BlobText")]
public class AddBlobText : PSCmdlet
{
    [Parameter(Mandatory = true, Position = 0)]
    public string StorageAccount { get; set; }

    [Parameter(Mandatory = true, Position = 1)]
    public string Container { get; set; }

    [Parameter(Mandatory = true, Position = 2)]
    public string BlobName { get; set; }

    [Parameter(Mandatory = true, ValueFromPipeline = true)]
    public string BlobText { get; set; }

    protected override void ProcessRecord()
    {
        PowerShell ps = PowerShell.Create();
        ps.AddScript("Set-AzureSubscription -SubscriptionName 'MySubName'");
        string keyScript = "( Get-AzureStorageKey -StorageAccountName " + StorageAccount + " ).Secondary";
        ps.AddScript(keyScript);
        Collection<PSObject> result = ps.Invoke();
        string secondaryKey = result[0].ToString();
        StorageCredentialsAccountAndKey credentials = new StorageCredentialsAccountAndKey(StorageAccount, secondaryKey);
        CloudStorageAccount storageAccount = new CloudStorageAccount(credentials, true);
        CloudBlobClient blobClient = storageAccount.CreateCloudBlobClient();
        CloudBlobContainer container = blobClient.GetContainerReference(Container);
        var blob = container.GetBlobReference(BlobName);
        blob.UploadText(BlobText);
    }
}
4

3 に答える 3

2

このエラーは非常にあいまいで誤解を招く可能性がありますが、AzureStorageが「混乱」する可能性がある場合があります。Sandrinoの例、具体的にはこの行を見ると、

[Microsoft.WindowsAzure.StorageClient.CloudBlob]$blob = $blobContainer.GetBlobReference($BlobName)

Sandrinoの答えがあなたの問題ではありませんが、発生した例外は、URLまたはおそらく他の紛らわしいキー文字列をAzureStorageContainersに渡すときに発生します。

残念ながら、私はPowershellの担当者ではありませんが、C#で修正した再現例を次に示します。

    public void Save(string objId, T obj)
    {
        CloudBlob blob = this.container.GetBlobReference(objId); // Problematic if a URL
        blob.Properties.ContentType = "application/json";

        var serialized = string.Empty;
        serialized = serializer.Serialize(obj);

        if (this.jsonpSupport)
        {
            serialized = this.container.Name + "Callback(" + serialized + ")";
        }
        blob.UploadText(serialized);
    }

this.containerは、http://127.0.0.1:10000 / devstoreaccount1/ sggamesまたは有効なコンテナー用に持っているものを指す有効なBLOBストレージインスタンスであると想定します。

そして、objIdはhttps://www.google.com/accounts/o8/id?id=AItOawk4Dw9sLxSc-zmdWQHdZNcyzkTcvKUkhiEのようなURLを含むキーです...そして、はい、これは発生する可能性があります。私の場合、これはAzureACSを使用するGoogle。

GetBlobReference呼び出しの後、blobインスタンスが破損し、混乱したUriを確認します-> https://www.google.com/accounts/o8/id?id=AItOawk4Dw9sLxSc-zmdWQHdZNcyzkTcvKUkhiE

残念ながら、単に$ blobContainer.CreateIfNotExist()を呼び出すソリューションはソリューションではなく、機能しません。URI構造を含むキーは、blobの保存場所を再解釈するために使用されます。

回避策(daredevの更新以外)は次のようになります。

if (Uri.IsWellFormedUriString(claim, UriKind.Absolute) && HttpUtility.ParseQueryString(claim).Count > 0)
{
    claim = HttpUtility.ParseQueryString(claim)[0];
}

上記の私のメソッド内にこのコードを追加して、Uriをクリーンアップしますが、完全なキーを維持する必要がある場合は、Base64エンコーディングURLなどの適切なメソッドを使用できます。

これが私が説明した結果を示す前後の画像です。

悪い人:

悪いURIに注意してください 悪いURIに注意してください

この不正なURIは、実際のストレージBLOBの場所を混乱させました この不正なURIは、実際のストレージBLOBの場所を混乱させました

これはdardevが持っていたのと同じ例外です これはdaredevが持っていたのと同じ例外です

いいもの:

新しいスクラブされたキー。これはURLのクエリ文字列の値にすぎないことに注意してください。 新しいスクラブされたキー。これはURLのクエリ文字列の値にすぎないことに注意してください。

AzureストレージのURIが適切に表示されるようになりました AzureストレージのURIが適切に表示されるようになりました

ユーレカ! ユーレカ!

お役に立てれば。

于 2012-11-24T22:54:10.763 に答える
2

これはおそらく、コンテナが存在しないためです。CreateIfNotExistコンテナが存在することを確認するために、コンテナを初期化した後に呼び出す必要があります。

[Microsoft.WindowsAzure.StorageClient.CloudBlobContainer]$blobContainer = $cloudBlobClient.GetContainerReference($Container)
$blobContainer.CreateIfNotExist() <-- Here
[Microsoft.WindowsAzure.StorageClient.CloudBlob]$blob = $blobContainer.GetBlobReference($BlobName)
$blob.UploadText($BlobText)
于 2012-09-26T18:55:13.433 に答える
1

これは、ファイルを Azure Blob にアップロードするために使用する PowerShell スクリプトです: Uploading to Azure Storage

$SubscriptionName = ""
$SubscriptionId = ""
$DestContainer = ""
$StorageAccountName = ""
Import-AzurePublishSettingsFile -PublishSettingsFile "<Location of the publishsettings-file>"
Set-AzureSubscription -SubscriptionId $SubscriptionId -CurrentStorageAccountName $StorageAccountName
Select-AzureSubscription -SubscriptionName $SubscriptionName
Set-AzureStorageBlobContent -File "<File you want to upload>" -Container $DestContainer
于 2015-08-10T23:57:49.520 に答える