Azure Managed Identityを利用してAzure Data Lake Gen2にhdfsコマンドからアクセスする

# 動機

- azureのVM上から 使い慣れたhdfsクライアントコマンドを使って azure data lake gen2 にアクセスしたい。
- data lake のIDとパスワードはazureVM上に保管したくない。

# 参考サイト

https://iwasakims.github.io/trunk/hadoop-project/hadoop-azure/abfs.html
https://docs.microsoft.com/ja-jp/azure/active-directory/managed-identities-azure-resources/overview
https://stackoverflow.com/questions/54155248/for-an-azure-app-service-with-a-managed-identity-how-to-retrieve-the-client-id

# 作戦

VMの managed identityを有効にすると、あたかもユーザーと同じようにVMにロールを割り当てることができる。

# 手順

## VMの設定

### Managed Identityの設定

- ここではUbuntu18.04のVMを立てた。名前をbizvm1とした。
- identity > system assigned から Status をON にする。
![スクリーンショット 2019-09-08 23.22.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/233578/c862f937-e177-5d1b-2270-df66fcd0ac97.png)
- bizvmにsshしてログイン

### hdfsコマンドのダウンロード
vmの中に入って作業

- ここからhadoop 3.2.0(バージョン注意！！！) コマンドのバイナリをダウンロードして展開 https://hadoop.apache.org/releases.html
    - /YOUR/DOWNLOAD/PATHに展開したとする。
- Java8のインストール `sudo apt install openjdk-8-jre-headless`
- 環境変数の設定
以下を`~/.bash_profile`に付け足す

```
export PATH=$PATH:/YOUR/DOWNLOAD/PATH/hadoop-3.2.0/bin
export JAVA_HOME=/usr
export HADOOP_OPTIONAL_TOOLS=hadoop-azure
export HADOOP_HOME=/YOUR/DOWNLOAD/PATH/hadoop-3.2.0
```

特に`export HADOOP_OPTIONAL_TOOLS=hadoop-azure`を忘れると動かない。

## data lake gen2の設定

- azure data lake gen2のStorageAccountを建てる。名前をshumpeidatalakegen2とした。作るときにhieralhical name spaceをONにすること。
- storageのAccessControl > Add > Add role assignmentを選択
    - Role: Storage Blob DataOwner
    - Assign access to: virtual machine
    - Subscription: VMの入っているサブスクリプション
    - select:  さっき作ったVMの名前を入れると候補が出てくるのでクリック

![スクリーンショット 2019-09-08 23.40.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/233578/4c3d3ea4-ae4e-8229-e29f-fef7d5f7e12b.png)

## Active Directoryから設定値の取得

### TenanatIDの取得

AzureActiveDirectory > Properties > DirectoryIDを控える。これがTenantIDと呼ばれるものらしい。

![スクリーンショット 2019-09-08 23.58.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/233578/971f8187-d2b0-78b9-7788-b80a999781d2.png)


### Application IDの取得

さっき作ったVMのApplicationIDを取得する。

AzureActiveDirectory > Enterprise application > 右上のApplicationTypeをAllApplicationを選択(ここ重要！！) > さっき作ったVMの名前 > Properties > ApplicationIDを控える

![スクリーンショット 2019-09-08 23.37.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/233578/232a6c23-e04a-6575-3187-9fa262008e1c.png)

![スクリーンショット 2019-09-08 23.37.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/233578/ffd93ab7-1b33-1c01-cb46-eea9f1bba74a.png)

## hdfsコマンドの設定

ここでまたVMにログインして設定

`$HADOOP_HOME/etc/hadoop/core-site.xml`に以下を記入

```
<configuration>
<property>
  <name>fs.azure.account.auth.type</name>
  <value>OAuth</value>
  <description>
  Use OAuth authentication
  </description>
</property>
<property>
  <name>fs.azure.account.oauth.provider.type</name>
  <value>org.apache.hadoop.fs.azurebfs.oauth2.MsiTokenProvider</value>
  <description>
  Use MSI for issuing OAuth tokens
  </description>
</property>
<property>
  <name>fs.azure.account.oauth2.msi.tenant</name>
  <value>さっき控えたTenantIDの値</value>
  <description>
  Optional MSI Tenant ID
  </description>
</property>
<property>
  <name>fs.azure.account.oauth2.client.id</name>
  <value>さっき控えたApplicationID</value>
  <description>
  Optional Client ID
  </description>
</property>
</configuration>
```

これでやっと準備が整った

#HDFSコマンド実行

```
hdfs dfs -ls abfss://testfilesystem@shumpeidatalakegen2.dfs.core.windows.net/
```

できたー。長かった。