かずきのBlog@hatena

すきな言語は C# + XAML の組み合わせ。Azure Functions も好き。最近は Go 言語勉強中。日本マイクロソフトで働いていますが、ここに書いていることは個人的なメモなので会社の公式見解ではありません。

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}");
            }
        }
    }
}