はじめに
先週から書いているAzure SDK for Javaを使ってAzure Storage Blobにアクセスする方法の続きです。今回は、接続文字列ではなくAzure ADを使った認証方法について記します。
前回の記事はこちらを。
Azure SDK for Javaを使ってAzure Storage Blobにアクセスする - miyohide's blog
Azure ADを使った認証
Azure ADを使った認証を実装するには、以下の手順を踏む必要がありました。
- サービスプリンシパルを作成して、環境変数
AZURE_CLIENT_ID
、AZURE_TENANT_ID
、AZURE_CLIENT_SECRET
を取得する - Azure Storage Blobに対して適切な権限を付与する
- プログラムを修正する
詳細は以下の手順に記されています...が、分かりにくかったので自分の経験を踏まえて補足していきます。
1. サービスプリンシパルを作成する
サービスプリンシパルを作成するのにaz ad sp create-for-rbac
コマンドを使っても良いのですが、なんとなく怖かったのでまずはポータルで作成してみることにします。マイクロソフトのドキュメントには以下のドキュメントがあります。
これだけだとちょっと分かりにくかったので、SISO Tech.LABの以下のブログ記事と合わせて勉強しました。
サービスプリンシパルを作成したら、アプリケーション(クライアント)IDはAZURE_CLIENT_ID
として、ディレクトリ(テナント)IDはAZURE_TENANT_IDとして、クライアントシークレットは
AZURE_CLIENT_SECRET`として環境変数に設定しておきます。
2. Azure Storage Blobに対して適切な権限を設定する
個人的に一番ハマったのがここです。権限として、以下のドキュメントにも書かれているように次のロールが割り当てられている必要があります。
・ストレージ BLOB データ閲覧者、ストレージ BLOB データ共同作成者などのデータ アクセス ロール ・少なくとも Azure Resource Manager 閲覧者ロール
マスク化していますが、こんな感じで割り当てました。
3. プログラムを修正する
プログラムの修正は、
com.azure:azure-identity
を依存ライブラリとして追加するBlobServiceClient
の作成時にcredential
メソッドを使う
の二つを実施しました。
まず、build.gradle
にcom.azure:azure-identity
を追加します。こんな感じです。
dependencies { implementation platform('com.azure:azure-sdk-bom:1.2.0') implementation 'com.azure:azure-storage-blob' implementation 'com.azure:azure-identity' implementation 'ch.qos.logback:logback-classic:1.2.11' testImplementation 'org.junit.jupiter:junit-jupiter-api:5.8.2' testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.8.2' }
次にBlobServiceClient
の作成です。これまでは以下のように実装していました。
BlobServiceClient blobServiceClient = new BlobServiceClientBuilder()
.connectionString(connectionString)
.buildClient();
これを次のように実装します。
BlobServiceClient blobServiceClient = new BlobServiceClientBuilder() .endpoint(storageAccountURL) .credential(new DefaultAzureCredentialBuilder().build()) .buildClient();
ポイントは以下2点です。
- connectionStringメソッドの代わりにcredentialメソッドを使う
- 認証に必要なデータはDefaultAzureCredentialBuilderメソッドが環境変数
AZURE_CLIENT_ID
、AZURE_TENANT_ID
、AZURE_CLIENT_SECRET
を使っていい感じに作ってくれるっぽい
- 認証に必要なデータはDefaultAzureCredentialBuilderメソッドが環境変数
- endpointメソッドを使って接続先を指定する
- connectionStringに接続先が含まれていたが、connectionStringを使わなくなったため、endpointメソッドを使ってAzure Storage Blobの接続先を指定する
ここまで設定することで無事Azure ADを使った認証を行うことができました。