Azure SDK for Javaを使ってAzure Storage Blobにアクセスする(2)

はじめに

先週から書いているAzure SDK for Javaを使ってAzure Storage Blobにアクセスする方法の続きです。今回は、接続文字列ではなくAzure ADを使った認証方法について記します。

前回の記事はこちらを。

Azure SDK for Javaを使ってAzure Storage Blobにアクセスする - miyohide's blog

Azure ADを使った認証

Azure ADを使った認証を実装するには、以下の手順を踏む必要がありました。

  1. サービスプリンシパルを作成して、環境変数AZURE_CLIENT_IDAZURE_TENANT_IDAZURE_CLIENT_SECRETを取得する
  2. Azure Storage Blobに対して適切な権限を付与する
  3. プログラムを修正する

詳細は以下の手順に記されています...が、分かりにくかったので自分の経験を踏まえて補足していきます。

docs.microsoft.com

1. サービスプリンシパルを作成する

サービスプリンシパルを作成するのにaz ad sp create-for-rbacコマンドを使っても良いのですが、なんとなく怖かったのでまずはポータルで作成してみることにします。マイクロソフトのドキュメントには以下のドキュメントがあります。

docs.microsoft.com

これだけだとちょっと分かりにくかったので、SISO Tech.LABの以下のブログ記事と合わせて勉強しました。

tech-lab.sios.jp

サービスプリンシパルを作成したら、アプリケーション(クライアント)IDはAZURE_CLIENT_IDとして、ディレクトリ(テナント)IDはAZURE_TENANT_IDとして、クライアントシークレットはAZURE_CLIENT_SECRET`として環境変数に設定しておきます。

2. Azure Storage Blobに対して適切な権限を設定する

個人的に一番ハマったのがここです。権限として、以下のドキュメントにも書かれているように次のロールが割り当てられている必要があります。

・ストレージ BLOB データ閲覧者、ストレージ BLOB データ共同作成者などのデータ アクセス ロール ・少なくとも Azure Resource Manager 閲覧者ロール

docs.microsoft.com

マスク化していますが、こんな感じで割り当てました。

f:id:miyohide:20220403183453j:plain

3. プログラムを修正する

プログラムの修正は、

  1. com.azure:azure-identityを依存ライブラリとして追加する
  2. BlobServiceClientの作成時にcredentialメソッドを使う

の二つを実施しました。

まず、build.gradlecom.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_IDAZURE_TENANT_IDAZURE_CLIENT_SECRETを使っていい感じに作ってくれるっぽい
  • endpointメソッドを使って接続先を指定する
    • connectionStringに接続先が含まれていたが、connectionStringを使わなくなったため、endpointメソッドを使ってAzure Storage Blobの接続先を指定する

ここまで設定することで無事Azure ADを使った認証を行うことができました。