web-dev-qa-db-ja.com

AzureFunctionからAzureファイルストレージにアクセスする

Azure関数内で実行される.exeによって使用されるファイルをAzureFile Storageから取得しようとしていますが、UNC資格情報を渡せないようです。

私のアプリは、Azure SQLデータベースからUNCファイルパスを取得し、そのUNCパス(Azure File Storage内)に移動してファイルの内容をインポートしようとします。 WindowsエクスプローラーでPCからファイルの場所に移動できますが、資格情報の入力を求められます。

アプリを実行する前に「NetUse」コマンドを使用しようとしましたが、認証されていないようです。

Net Use \\<storage account>.file.core.windows.net\<directory>\ /u:<username> <access key>

MyApp.exe 

Azure関数ログエラー:

Unhandled Exception: System.UnauthorizedAccessException: Access to the path '<file path>' is denied.

可能であれば、C#アプリを変更せずに、Azure関数で認証を行います(現時点ではバッチ関数であり、タイマーベースになります)。

6
BamBamBeano

基盤となるインフラストラクチャにアクセスできないため、Azure File Service ShareAzure Functionにマウントすることはできないと思います( WebApps と同じ取引)。

できることは、Azure Storage SDKのラッパーであるAzure Storage REST APIを利用し、それをアプリケーションで使用して、ファイルサービス共有内のファイルと対話することです。

6
Gaurav Mantri

SMB(445/TCP))は使用できません。関数はAppServiceサンドボックス内で実行されます。

差出人 https://github.com/projectkudu/kudu/wiki/Azure-Web-App-sandbox#restricted-outgoing-ports

制限された発信ポート

アドレスに関係なく、アプリケーションはポート445、137、138、および139を使用してどこにも接続できません。つまり、非プライベートIPアドレスまたは仮想ネットワークのアドレスに接続している場合でも、ポート445、137、138、および139への接続は許可されません。

Azure Storage SDKを使用 Azureファイルエンドポイントと通信するには:

using Microsoft.Azure;  // Namespace for CloudConfigurationManager
using Microsoft.WindowsAzure.Storage;
using Microsoft.WindowsAzure.Storage.File;

// Parse the connection string and return a reference to the storage account.
CloudStorageAccount storageAccount = CloudStorageAccount.Parse(
    CloudConfigurationManager.GetSetting("StorageConnectionString"));

// Create a CloudFileClient object for credentialed access to File storage.
CloudFileClient fileClient = storageAccount.CreateCloudFileClient();

// Get a reference to the file share we created previously.
CloudFileShare share = fileClient.GetShareReference("logs");

// Ensure that the share exists.
if (share.Exists())
{
    // Get a reference to the root directory for the share.
    CloudFileDirectory rootDir = share.GetRootDirectoryReference();

    // Get a reference to the directory we created previously.
    CloudFileDirectory sampleDir = rootDir.GetDirectoryReference("CustomLogs");

    // Ensure that the directory exists.
    if (sampleDir.Exists())
    {
        // Get a reference to the file we created previously.
        CloudFile file = sampleDir.GetFileReference("Log1.txt");

        // Ensure that the file exists.
        if (file.Exists())
        {
            // Write the contents of the file to the console window.
            Console.WriteLine(file.DownloadTextAsync().Result);
        }
    }
}

サンプルはCloudConfigurationManagerを使用します-このような単純なシナリオには少し多すぎると思います。代わりにこれを行います:

using System.Configuration;

// "StorConnStr" is the Storage account Connection String
// defined for your Function in the Azure Portal
string connstr = ConfigurationManager.ConnectionStrings["StorConnStr"].ConnectionString;
1
evilSnobu