はじめに
こんにちは、ACS事業部の吉川です。
Igniteは終わってしまいましたが、発表されたアップデート内容を少しづつご紹介していければと思っています。
ということで、以下の記事でも少し触れた Azure Container Apps の Dapr に関するアップデートのうち、マネージドID対応 についてご紹介します。
Dapr?
Daprとは何か?という方もいると思いますので簡単にご紹介します。
DaprはMicrosoft主導でOSSとして開発されている分散アプリケーション用ランタイムです。
多様なクラウドサービスやソフトウェアに対し、抽象化されたインターフェースを提供してくれるものです。
本ブログでも過去にDaprをテーマとした記事がいくつか投稿されています。合わせてご参照いただけますと幸いです。
DaprはAzure Container Appsと統合されており、簡単に利用することができるようになっています。
マネージドID対応すると何がうれしいの?
Azure Container AppsのDaprがマネージドIDに対応した、というのが今回紹介したい内容です。
これまではDaprから接続する先のサービスに対する認証情報を、設定として記述する必要がありました。
マネージドIDに対応したことで、接続先がAzure AD認証に対応したAzureサービスであれば認証情報を記載する必要がなくなります。
サービスプリンシパルを作ったり管理したりという点から解放されるのが大きなメリットですね。
実際に試してみる
いくつかリソースを作成し、マネージドIDでの接続を確認してみましょう。
まずはAzure Container Appsのリソースを作成していきましょう。
# リソース名/リージョンの定義 rgName=rg-sample location=japaneast caeName=cae-sample acaName=aca-managedid # リソースグループ作成 az group create -l $location -n $rgName # Container Apps環境作成 az containerapp env create -n $caeName -g $rgName -l $location # Container App作成 az containerapp create -n $acaName -g $rgName \ --environment $caeName --system-assigned \ --enable-dapr --dapr-app-id sampleapp \ --image nginx:latest
接続先のリソースたち
Daprが対応している接続先リソースについては以下のページにまとめられています。
利用用途ごとにコンポーネントブロックとして分類されています。
ブロックの種別ごとに、2つピックアップしてご紹介します。
State stores - Azure Blob Storage
State storeは状態の保存/永続化に利用するブロックです。
Azureサービスとしては
- Azure Blob Storage
- Azure CosmosDB(SQL API)
- Azure SQL Server
- Azure Table Storage
の4種に対応していますが、今回はBlob Storageを例とします。
saName=testfordaprmanagedid containerName=daprcontainer # ストレージアカウント作成 az storage account create -n $saName -g $rgName -l $location # Blobコンテナー作成 az storage container create -n $containerName --account-name $saName
BlobコンテナーのIAM設定で、Container AppのマネージドIDに対し ストレージ BLOB データ共同作成者
ロールを割り当てます。
Container App用のDapr設定は以下のように記述します。
パラメーターとしてストレージアカウントの名前とBlobコンテナーの名前しか記述しておらず、ストレージアカウントに対する認証の情報を記載していない ことに注目してください。
componentType: state.azure.blobstorage version: v1 metadata: - name: accountName value: "testfordaprmanagedid" - name: containerName value: "daprcontainer"
これをContainer Apps環境にセットします。
az containerapp env dapr-component set -n $caeName -g $rgName \ --dapr-component-name blob --yaml blob.yaml
Container Appのコンテナ内で以下のコマンドを実行して動作を確認してみましょう。
curl -X POST http://localhost:${DAPR_HTTP_PORT}/v1.0/state/blob \ -H "Content-Type: application/json" \ -d '[ { "key": "test", "value": "Test for Azure Blob storage" } ]'
設定が問題なくできていれば、上記リクエストの key
の値をファイル名としたBlobが作られています。
中の値の取得についても以下のとおり。
curl http://localhost:${DAPR_HTTP_PORT}/v1.0/state/blob/test
"Test for Azure Blob storage"
Daprに対しID/パスワードのような認証情報を持たせることなく、IAMロールの設定のみでBlobにアクセスできたことが確認できました。
Secret stores - Azure Key Vault
続いて紹介するのは Secret stores です。
秘匿情報をシークレットストアから呼び出して利用するためのブロックで、Azureサービスとしては Azure Key Vault に対応しています。
ちなみに、Azure Container AppsでのSecret storesブロック対応もIgniteに合わせてGAしたばかりの新機能です。
kvName=keyvaultfordapr # Key Vault作成 az keyvault create -n $kvName -g $rgName -l $location
Key Vaultのアクセスポリシーで、Container AppのマネージドIDに シークレット
の 取得
権限を付与します。
Container Appから読み出すシークレットも登録しておきましょう。
ここでは testSecret
という名前で This is Test Value!
という値をセットしました。
az keyvault secret set --vault-name $kvName --name testSecret --value 'This is Test Value!'
Container App用のDapr設定は以下のとおりです。
ストレージアカウントのときと同様、Key Vaultに対する認証の情報は記載しておらず、Key Vaultの名前のみを設定しています。
componentType: secretstores.azure.keyvault version: v1 metadata: - name: vaultName value: keyvaultfordapr
Container Apps環境にセットします。
az containerapp env dapr-component set -n $caeName -g $rgName \ --dapr-component-name azurekeyvault --yaml azurekeyvault.yaml
Container Appのコンテナ内で以下のコマンドを実行することで、Key Vault内のシークレットの値を読み出すことができます。
curl http://localhost:${DAPR_HTTP_PORT}/v1.0/secrets/azurekeyvault/testSecret
{"testSecret":"This is Test Value!"}
明示的に認証情報をDaprに渡すことなく、Key Vaultにアクセスできることが確認できました。
おわりに
Azure Container AppsのDaprがマネージドIDに対応したことで、サービスプリンシパルを作成したり、シークレットの管理をする必要がなくなりました。
便利に使える機能がGAしましたので、積極的に活用していきたいですね。