Azure マネージド ID を使用して Azure コンテナー レジストリに対して認証する

レジストリの資格情報を提供したり管理したりすることなく、別の Azure リソースから Azure コンテナー レジストリに対して認証するには、Azure リソースのマネージド ID を使用します。 たとえば、パブリック レジストリを使用するように簡単にコンテナー レジストリからコンテナー イメージにアクセスするには、Linux VM 上でユーザー割り当てまたはシステム割り当てマネージド ID を設定します。 または、マネージド ID を使用して、ポッドのデプロイのために Azure Container Registry からコンテナー イメージをプルするように、Azure Kubernetes Service クラスターを設定します。

この記事では、マネージド ID および次の操作を行う方法について詳細に説明します。

  • Azure VM 上でユーザー割り当てまたはシステム割り当て ID を有効にする
  • ID に Azure コンテナー レジストリへのアクセス権を付与する
  • マネージド ID を使用してレジストリにアクセスし、コンテナー イメージをプルする

Azure リソースを作成するために、この記事では Azure CLI バージョン 2.0.55 以降を実行する必要があります。 バージョンを確認するには、az --version を実行します。 インストールまたはアップグレードする必要がある場合は、Azure CLI のインストールに関するページを参照してください。

コンテナー レジストリを設定し、そこにコンテナー イメージをプッシュするには、Docker もローカルにインストールされている必要があります。 Docker では、macOSWindows、または Linux システムで Docker を簡単に構成できるパッケージが提供されています。

マネージド ID を使用する理由

Azure リソースのマネージド ID 機能に慣れていない場合は、こちらの概要を参照してください。

マネージド ID を使用して、選択した Azure リソースを設定した後、他のセキュリティ プリンシパルと同様に、その ID に別のリソースへの必要なアクセス権を付与します。 たとえば、マネージド ID に、Azure 内のプライベート レジストリに対するプル、プッシュとプル、またはその他のアクセス許可を持つロールを割り当てます。 (レジストリ ロールの完全な一覧については、「Azure Container Registry のロールとアクセス許可」を参照してください。)ID には 1 つ以上のリソースへのアクセス権を付与できます。

次に、ID を使用して、コード内の資格情報なしで、Microsoft Entra 認証をサポートする任意のサービスに対して認証します。 シナリオに応じて、マネージド ID を使用して認証する方法を選択します。 その ID を使用して仮想マシンから Azure コンテナー レジストリにアクセスするには、Azure Resource Manager に対して認証します。

コンテナー レジストリの作成

まだ Azure コンテナー レジストリがない場合は、レジストリを作成し、そこにサンプル コンテナー イメージをプッシュします。 手順については、「クイック スタート: Azure CLI を使用したプライベート コンテナー レジストリの作成」を参照してください。

この記事では、レジストリ内に aci-helloworld:v1 コンテナー イメージが格納されていることを前提にしています。 これらの例では、myContainerRegistry のレジストリ名を使用します。 後の手順で、独自のレジストリおよびイメージ名に置き換えてください。

Docker 対応 VM を作成する

Docker 対応 Ubuntu 仮想マシンを作成します。 また、その仮想マシンに Azure CLI もインストールする必要があります。 既に Azure 仮想マシンがある場合は、仮想マシンを作成するこの手順を省略します。

az vm create を使用して、既定の Ubuntu Azure 仮想マシンをデプロイします。 次の例では、myResourceGroup という名前の既存のリソース グループ内に myDockerVM という名前の VM を作成します。

az vm create \
    --resource-group myResourceGroup \
    --name myDockerVM \
    --image Ubuntu2204 \
    --admin-username azureuser \
    --generate-ssh-keys

VM が作成されるまで、数分間かかります。 コマンドが完了したら、Azure CLI によって表示された publicIpAddress をメモします。 このアドレスは、VM への SSH 接続を作成するために使用します。

VM に Docker をインストールする

VM が実行されたら、VM への SSH 接続を作成します。 publicIpAddress を VM のパブリック IP アドレスに置き換えます。

ssh azureuser@publicIpAddress

次のコマンドを実行して、VM に Docker をインストールします。

sudo apt update
sudo apt install docker.io -y

インストールの後、次のコマンドを実行して、VM 上で Docker が正しく実行されていることを確認します。

sudo docker run -it mcr.microsoft.com/hello-world
Hello from Docker!
This message shows that your installation appears to be working correctly.
[...]

Azure CLI のインストール

Ubuntu 仮想マシンに Azure CLI をインストールするには、「apt での Azure CLI のインストール」の手順に従います。 この記事の場合は、バージョン 2.0.55 以降をインストールするようにしてください。

SSH セッションを終了します。

例 1:ユーザー割り当て ID でアクセスする

ID の作成

az identity create コマンドを使用して、サブスクリプション内に ID を作成します。 前にコンテナー レジストリまたは仮想マシンを作成するために使用したものと同じリソース グループ、または別のリソース グループを使用できます。

az identity create --resource-group myResourceGroup --name myACRId

後の手順で ID を構成するために、az identity show コマンドを使用して、ID のリソース ID とサービス プリンシパル ID を変数に格納します。

# Get resource ID of the user-assigned identity
userID=$(az identity show --resource-group myResourceGroup --name myACRId --query id --output tsv)

# Get service principal ID of the user-assigned identity
spID=$(az identity show --resource-group myResourceGroup --name myACRId --query principalId --output tsv)

後の手順で仮想マシンから CLI にサインインするときに ID のユーザー ID が必要になるため、この値を表示します。

echo $userID

この ID の形式は次のとおりです。

/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxxx/resourcegroups/myResourceGroup/providers/Microsoft.ManagedIdentity/userAssignedIdentities/myACRId

ID で VM を構成する

次の az vm identity assign コマンドは、ユーザー割り当て ID で Docker VM を構成します。

az vm identity assign --resource-group myResourceGroup --name myDockerVM --identities $userID

ID にコンテナー レジストリへのアクセス権を付与する

ここでは、コンテナー レジストリにアクセスするように ID を構成します。 まず az acr show コマンドを使用して、レジストリのリソース ID を取得します。

resourceID=$(az acr show --resource-group myResourceGroup --name myContainerRegistry --query id --output tsv)

az role assignment create コマンドを使用して、ID に AcrPull ロールを割り当てます。 このロールは、レジストリにプル アクセス許可を提供します。 プルとプッシュの両方のアクセス許可を提供するには、AcrPush ロールを割り当てます。

az role assignment create --assignee $spID --scope $resourceID --role acrpull

ID を使用してレジストリにアクセスする

ID で構成されている Docker 仮想マシンに SSH で接続します。 VM にインストールされている Azure CLI を使用して、次の Azure CLI コマンドを実行します。

まず、VM 上に構成した ID を使用して、az login で Azure CLI に対して認証します。 <userID> については、前の手順で取得した ID のユーザー ID に置き換えます。

az login --identity --username <userID>

次に、az acr login でレジストリに対して認証します。 このコマンドを使用すると、CLI は az login の実行時に作成された Active Directory トークンを使用して、ユーザー セッションをコンテナー レジストリに対してシームレスに認証します。 (VM の設定によっては、このコマンドと docker コマンドを sudo で実行することが必要になる場合があります。)

az acr login --name myContainerRegistry

Login succeeded メッセージが表示されます。 それにより、資格情報を指定せずに docker コマンドを実行できます。 たとえば、aci-helloworld:v1 イメージをプルするには、レジストリのログイン サーバー名を指定して docker pull を実行します。 ログイン サーバー名は、コンテナー レジストリ名 (すべて小文字) とその後の .azurecr.io で構成されます (mycontainerregistry.azurecr.io など)。

docker pull mycontainerregistry.azurecr.io/aci-helloworld:v1

例 2:システム割り当て ID でアクセスする

システム管理 ID で VM を構成する

次の az vm identity assign コマンドは、システム割り当て ID で Docker VM を構成します。

az vm identity assign --resource-group myResourceGroup --name myDockerVM

変数を、後の手順で使用する VM の ID の principalId (サービス プリンシパル ID) の値に設定するには、az vm show コマンドを使用します。

spID=$(az vm show --resource-group myResourceGroup --name myDockerVM --query identity.principalId --out tsv)

ID にコンテナー レジストリへのアクセス権を付与する

ここでは、コンテナー レジストリにアクセスするように ID を構成します。 まず az acr show コマンドを使用して、レジストリのリソース ID を取得します。

resourceID=$(az acr show --resource-group myResourceGroup --name myContainerRegistry --query id --output tsv)

az role assignment create コマンドを使用して、ID に AcrPull ロールを割り当てます。 このロールは、レジストリにプル アクセス許可を提供します。 プルとプッシュの両方のアクセス許可を提供するには、AcrPush ロールを割り当てます。

az role assignment create --assignee $spID --scope $resourceID --role acrpull

ID を使用してレジストリにアクセスする

ID で構成されている Docker 仮想マシンに SSH で接続します。 VM にインストールされている Azure CLI を使用して、次の Azure CLI コマンドを実行します。

まず、VM 上のシステム割り当て ID を使用して、az login で Azure CLI を認証します。

az login --identity

次に、az acr login でレジストリに対して認証します。 このコマンドを使用すると、CLI は az login の実行時に作成された Active Directory トークンを使用して、ユーザー セッションをコンテナー レジストリに対してシームレスに認証します。 (VM の設定によっては、このコマンドと docker コマンドを sudo で実行することが必要になる場合があります。)

az acr login --name myContainerRegistry

Login succeeded メッセージが表示されます。 それにより、資格情報を指定せずに docker コマンドを実行できます。 たとえば、aci-helloworld:v1 イメージをプルするには、レジストリのログイン サーバー名を指定して docker pull を実行します。 ログイン サーバー名は、コンテナー レジストリ名 (すべて小文字) とその後の .azurecr.io で構成されます (mycontainerregistry.azurecr.io など)。

docker pull mycontainerregistry.azurecr.io/aci-helloworld:v1

次のステップ

この記事では、Azure Container Registry でのマネージド ID の使用および次の操作を行う方法について学習しました。

  • Azure VM でユーザー割り当てまたはシステム割り当て ID を有効にする
  • ID に Azure コンテナー レジストリへのアクセス権を付与する
  • マネージド ID を使用してレジストリにアクセスし、コンテナー イメージをプルする