# はじめに
Azure Arcとは、オンプレミスや他社クラウド上のサーバーをAzureサービスに統合し一元管理するためのサービスです。
いくつか提供されている機能があるのですが、その中から「マネージドIDを利用してAzureリソースに対し認証を行う」というものを試してみました。
環境
今回はOCI上の仮想マシンをAzureに接続してみます。
OSはUbuntu、バージョンは20.04 Minimal、ビルドは2021.12.03-0のものを利用します。
Azure Arcの準備
公式のドキュメントを参照しながらやっていきます。
Azure Arcを利用するためにAzureリソースプロバイダーの登録が必要となります。
Cloud ShellかAzure CLIが利用可能な端末から、以下のコマンドを実行します。
$ az account set --subscription "<利用するサブスクリプション名>"
$ az provider register --namespace 'Microsoft.HybridCompute'
Registering is still on-going. You can monitor using 'az provider show -n Microsoft.HybridCompute'
$ az provider register --namespace 'Microsoft.GuestConfiguration'
Registering is still on-going. You can monitor using 'az provider show -n Microsoft.GuestConfiguration'
実行後、登録が完了したかを確認します。
$ az provider list -o table| grep Microsoft.HybridCompute
Microsoft.HybridCompute RegistrationRequired Registered
$ az provider list -o table| grep Microsoft.GuestConfiguration
Microsoft.GuestConfiguration RegistrationRequired Registered
両方とも上記のように「Registered」となっていればOKです。
Azure Arcエージェント インストールスクリプトの生成
まずはサーバが配置されるリソースグループを準備します。
今回は「AzureArc」という空のリソースグループを作成しました。
リソースグループの「+作成」ボタンをクリックし、「Azure Arc」で検索、「サーバー - Azure Arc」を選択します。
「作成」をクリック
今回はサーバー1台のみを接続するため、「単一サーバーの追加」の「スクリプトの生成」をクリックします。
ここからフローに沿ってインストール用スクリプトを生成していきます。
上記画面に記載のあるように、Azureに対しデータを送信するため、該当サーバーにはAzure宛のアウトバウンド通信が必要となります。
私は試せてないですが、プロキシサーバー経由やExpressRouteやVPN経由での接続もできるようなので、そこまで厳しい要件でもないかと思います。
次のページでは、サブスクリプション・リソースグループ・リージョン・OS種別を選択します。
今回のサーバーは直接インターネット向けのアウトバウンドを許可しているため、ネットワーク接続の項目は「パブリック エンドポイント」を選択します。
タグの設定はお好みで…。デフォルトで4つのタグ名が入力されていますが、特に必須というわけではないようです。
最後のページにエージェントインストール用のスクリプトが表示されます。
ダウンロード、もしくは表示内容をコピーしてインストール対象のサーバ上へ転送します。
サーバーにAzure Arcエージェントを導入する
前項で作成したスクリプトを、インストール対象のサーバ上で実行します。
$ sudo bash OnboardingScript.sh
--2022-01-07 16:27:30-- https://aka.ms/azcmagent
〜略〜
INFO[0001] All endpoints are available... continue onboarding
To sign in, use a web browser to open the page https://microsoft.com/devicelogin and enter the code XXXXXXXXX to authenticate.
上記のメッセージが表示されたら、お手元の端末のブラウザで「https://microsoft.com/devicelogin」を開き、表示されているコードを入力し登録を進めます。
その後、以下のメッセージが表示されたらインストール終了です。
INFO[0156] Successfully Onboarded Resource to Azure VM Id=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
オンボードされたサーバーを表示するには、https://portal.azure.com/#blade/HubsExtension/BrowseResource/resourceType/Microsoft.HybridCompute%2Fmachines に移動します
Azureポータルを見ると、サーバーのリソースが追加されています。(ちゃんとOCI上のサーバーだと認識されていますね)
マネージドIDの利用準備
Azure Arc対応サーバーでマネージドIDを利用するには、ユーザーが「himds」グループに所属している必要があります。以下のコマンドでグループに追加します。
$ sudo gpasswd -a $USER himds
また、多くのAzure SDKでは環境変数の有無でマネージドIDの利用可否を判断しています。以下のように
- IDENTITY_ENDPOINT
- IMDS_ENDPOINT
の2つの環境変数を追加しておきます。
echo "export IDENTITY_ENDPOINT=http://localhost:40342/metadata/identity/oauth2/token" >> .bashrc
echo "export IMDS_ENDPOINT=http://localhost:40342" >> .bashrc
グループ設定と環境変数の読み込みのために、一度ログアウトして再度ログインします。
マネージドIDの利用テスト
今回はBlobストレージへのファイルアップロードでマネージドIDを試してみます。
まずはストレージアカウントを作成し、
左ペインの「アクセス制御(IAM)」を開き、上部の「追加」→「ロールの割り当ての追加」を選択、
「ストレージ BLOB データ共同作成者」を選択し次へ、
アクセスの割り当て先で「マネージドID」を選択し、「メンバーを選択する」から今回の対象サーバーを選択します。
レビュー画面で問題なければ追加を行い、以下のようにIAMの一覧に追加されていればOKです。
アップロード先のコンテナーも作成しておきます。「arcupload」という名前で作成しました。
続いては対象サーバー上の作業です。
以下のようなアップロード用のテストファイルを準備し、
upload from arc-test
それをアップロードするためのコードをPythonで準備しました。
from azure.identity import DefaultAzureCredential
from azure.storage.blob import BlobServiceClient
token_credential = DefaultAzureCredential()
blob_service_client = BlobServiceClient(
account_url="https://<ストレージアカウント名>.blob.core.windows.net",
credential=token_credential
)
blob_client = blob_service_client.get_blob_client(container='arcupload', blob='test.txt')
with open("test.txt", "rb") as data:
blob_client.upload_blob(data)
必要なAzure SDKをインストールします。
$ sudo apt install python3-pip
$ sudo pip3 install azure-identity azure-storage-blob
準備が整ったら、以下のように実行します。
$ python3 upload_blob.py
エラーなく完了すればOKです。
ポータルからBlobを見てみると、
ちゃんとアップロードできています!
おわりに
上記のとおり、コードにも環境変数にも固有の認証情報は持たせずにBlobのアップロードが実現できます。
Azure外のサーバーであってもマネージドIDの仕組みで認証可能というのは便利だと思います。