かずきのBlog@hatena

日本マイクロソフトに勤めています。XAML + C#の組み合わせをメインに、たまにASP.NETやJavaなどの.NET系以外のことも書いています。掲載内容は個人の見解であり、所属する企業を代表するものではありません。

DataLakeを.NETから使う下準備

超ハマったのでメモを残しておきます。

まず、AzureADでアプリ作らないといけないんですよ、アプリ。基本的な手順は以下のページに従ってやればOKです。

azure.microsoft.com

ハマった所としては、このとき使うAzureADのディレクトリってAzureに最初から作られてるディレクトリじゃないといけないってところでした。新しくディレクトリ作ったりしてましたよ…。

アプリケーションを作ったら、クライアントIDとキーとテナントIDを取得しておきます。

以下のページにほぼしたがっていけばOKです。

azure.microsoft.com

ハマった所としては、RBACでリソースグループに対してアプリケーションにアクセス権をOwnerとして与えたのですが、それだと何故かアクセスできなくてData Lakeの画面からフォルダに対してアプリケーションにフルアクセス権限与えたら、フォルダのリストを取得できるようになりました。

とりあえずエラーが出ずに動いたコードを貼っておきます。上記サイトではTenantIdにcommonを使ってますが、私の環境ではエラーになったのでテナントIDはAzureADのアプリケーションから取得したものに差し替えました。

using Microsoft.Azure.Management.DataLake.Store;
using Microsoft.Azure.Management.DataLake.Store.Models;
using Microsoft.IdentityModel.Clients.ActiveDirectory;
using Microsoft.Rest;
using System;

namespace ConsoleApplication8
{
    class Program
    {
        private static string ClientId { get; } = "AzureADで取得したクライアントID";
        private static string Key { get; } = "AzureADで取得したキー";
        private static string TenantId { get; } = "AzureADで取得したテナントID";
        private static string SubscriptionId { get; } = "自分のサブスクリプションID";

        static void Main(string[] args)
        {
            // signin
            var authContext = new AuthenticationContext($"https://login.microsoftonline.com/{TenantId}");
            var credential = new ClientCredential(ClientId, Key);
            var authResult = authContext.AcquireToken("https://management.core.windows.net/", credential);
            var tokenCredentials = new TokenCredentials(authResult.AccessToken);

            // init
            var adlsClient = new DataLakeStoreAccountManagementClient(tokenCredentials)
            {
                SubscriptionId = SubscriptionId
            };
            var adlsFileSystemClient = new DataLakeStoreFileSystemManagementClient(tokenCredentials)
            {
                SubscriptionId = SubscriptionId
            };
            adlsClient.Account.Create("リソースグループ名", "DataLakeのアカウント名(Data LakeのURLの最初の部分)", new DataLakeStoreAccount(location: "East US 2"));

            foreach(var fs in adlsFileSystemClient.FileSystem.ListFileStatus("/", "dlsampleadls").FileStatuses.FileStatus)
            {
                Console.WriteLine($"{fs.PathSuffix}");
            }
        }
    }
}