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関数で認証を行います(現時点ではバッチ関数であり、タイマーベースになります)。
基盤となるインフラストラクチャにアクセスできないため、Azure File Service Share
をAzure Function
にマウントすることはできないと思います( WebApps
と同じ取引)。
できることは、Azure Storage SDK
のラッパーであるAzure Storage REST API
を利用し、それをアプリケーションで使用して、ファイルサービス共有内のファイルと対話することです。
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;