次の方法で共有


サービス プリンシパルを使用して Azure Container Registry から Azure Container Instances にデプロイする方法について説明します

Azure Container Registry は、プライベート Docker コンテナー イメージを格納するために使用される、Azure ベースの管理されたコンテナー レジストリ サービスです。 この記事では、Azure Container Instances にデプロイするときに、Azure Container Registry に格納されているコンテナー イメージをプルする方法について説明します。 レジストリ アクセスを構成する 1 つの方法は、Microsoft Entra サービス プリンシパルとパスワードを作成し、ログイン資格情報を Azure キー コンテナーに格納することです。

前提条件

Azure Container Registry: この記事の手順を完了するには、Azure Container Registry と、そのレジストリ内の少なくとも 1 つのコンテナー イメージが必要です。 レジストリが必要な場合は、「Azure CLI を使用したコンテナー レジストリの作成」を参照してください。

Azure CLI:この記事のコマンド ラインの例は Azure CLI を使用し、Bash シェル用にフォーマットされています。 ローカルに Azure CLI をインストールするほかに、Azure Cloud Shell を使用することもできます。

制限事項

レジストリの認証を構成する

"ヘッドレス" サービスとアプリケーションへのアクセスを提供する運用シナリオでは、サービス プリンシパルを使用して、レジストリ アクセスを構成することをお勧めします。 サービス プリンシパルを使用すると、コンテナー イメージに Azure ロールベースのアクセス制御 (Azure RBAC) を提供できます。 たとえば、レジストリに対するプルのみのアクセス権を持つサービス プリンシパルを設定できます。

Azure Container Registry は、追加の認証オプションを提供します。

次のセクションでは、Azure キー コンテナーとサービス プリンシパルを作成し、サービス プリンシパルの資格情報をコンテナーに格納します。

キー コンテナーの作成

Azure キー コンテナーにコンテナーがない場合、次のコマンドを使用して Azure CLI で 1 つ作成します。

RES_GROUP 変数をキー コンテナーが作成される既存のリソース グループの名前で、また ACR_NAME をコンテナー レジストリの名前で更新します。 簡潔にするために、この記事のコマンドでは、レジストリ、キー コンテナー、コンテナー インスタンスがすべて同じリソース グループ内に作成されることを前提としています。

AKV_NAME で新しいキー コンテナーの名前を指定します。 コンテナー名は、3 ~ 24 文字の英数字で、Azure 内で一意である必要があります。名前の先頭には英字、末尾には英字または数字を使用する必要があります。また、ハイフンを連続させることはできません。

RES_GROUP=myresourcegroup # Resource Group name
ACR_NAME=myregistry       # Azure Container Registry registry name
AKV_NAME=mykeyvault       # Azure Key Vault vault name

az keyvault create -g $RES_GROUP -n $AKV_NAME

サービス プリンシパルを作成し、資格情報を格納する

今度は、サービス プリンシパルを作成し、その資格情報をキー コンテナーに格納します。

次のコマンドでは、az ad sp create-for-rbac を使用してサービス プリンシパルを作成し、az keyvault secret set を使用してコンテナーにサービス プリンシパルのパスワードを格納します。 作成時には、サービス プリンシパルの appId を必ずメモしておいてください。

# Create service principal
az ad sp create-for-rbac \
  --name http://$ACR_NAME-pull \
  --scopes $(az acr show --name $ACR_NAME --query id --output tsv) \
  --role acrpull

SP_ID=xxxx # Replace with your service principal's appId

# Store the registry *password* in the vault
az keyvault secret set \
  --vault-name $AKV_NAME \
  --name $ACR_NAME-pull-pwd \
  --value $(az ad sp show --id $SP_ID --query password --output tsv)

上記のコマンドの --role 引数により、acrpull ロールを持つサービス プリンシパルが構成されます。これにより、レジストリに対するプルのみのアクセス権が付与されます。 プッシュ アクセス権とプル アクセス権の両方を付与するには、--role 引数を acrpush に変更します。

次にサービス プリンシパルの appId をコンテナーに格納します。appId は、認証のために Azure Container Registry に渡すユーザー名です。

# Store service principal ID in vault (the registry *username*)
az keyvault secret set \
    --vault-name $AKV_NAME \
    --name $ACR_NAME-pull-usr \
    --value $(az ad sp show --id $SP_ID --query appId --output tsv)

Azure キー コンテナーを作成し、そこに 2 つのシークレットを格納します。

  • $ACR_NAME-pull-usr:サービス プリンシパル ID。コンテナー レジストリのユーザー名として使用します。
  • $ACR_NAME-pull-pwd:サービス プリンシパルのパスワード。コンテナー レジストリのパスワードとして使用します。

これらのシークレットは、アプリケーションおよびサービスがレジストリからイメージをプルしたときの名前で参照できます。

Azure CLI でコンテナーをデプロイする

これでサービス プリンシパルの資格情報を Azure キー コンテナー シークレットに格納し、格納した資格情報をアプリケーションとサービスで使用してプライベート レジストリにアクセスできます。

まず、az acr show コマンドを使用して、レジストリのログイン サーバー名を取得します。 ログイン サーバー名はすべて小文字であり、myregistry.azurecr.io のようになります。

ACR_LOGIN_SERVER=$(az acr show --name $ACR_NAME --resource-group $RES_GROUP --query "loginServer" --output tsv)

次の az container create コマンドを実行して、コンテナー インスタンスをデプロイします。 このコマンドは、Azure キー コンテナーに格納されたサービス プリンシパルの資格情報を使用して、コンテナー レジストリに対する認証を行います。事前に aci-helloworld イメージをレジストリにプッシュしていることが前提です。 レジストリにある別のイメージを使用する場合、--image の値を更新します。

az container create \
    --name aci-demo \
    --resource-group $RES_GROUP \
    --image $ACR_LOGIN_SERVER/aci-helloworld:v1 \
    --registry-login-server $ACR_LOGIN_SERVER \
    --registry-username $(az keyvault secret show --vault-name $AKV_NAME -n $ACR_NAME-pull-usr --query value -o tsv) \
    --registry-password $(az keyvault secret show --vault-name $AKV_NAME -n $ACR_NAME-pull-pwd --query value -o tsv) \
    --dns-name-label aci-demo-$RANDOM \
    --query ipAddress.fqdn

前のコマンドが、コンテナーの DNS 名のラベルに乱数を追加するため、--dns-name-label の値は Azure 内で一意でなければなりません。 コマンドの出力には、次のようにコンテナーの完全修飾ドメイン名 (FQDN) が表示されます。

"aci-demo-25007.eastus.azurecontainer.io"

コンテナーが正常に開始されると、ブラウザーでその FQDN に移動して、アプリケーションが正常に実行されていることを確認できます。

Azure Resource Manager テンプレートを使用したデプロイ

imageRegistryCredentials プロパティをコンテナー グループに含めることで、Azure Resource Manager テンプレート内に Azure Container Registry のプロパティを指定できます。 たとえば、レジストリの資格情報を直接指定できます。

[...]
"imageRegistryCredentials": [
  {
    "server": "imageRegistryLoginServer",
    "username": "imageRegistryUsername",
    "password": "imageRegistryPassword"
  }
]
[...]

コンテナー グループ設定の詳細については、Resource Manager テンプレート リファレンスを参照してください。

Resource Manager テンプレートでの Azure キー コンテナーシークレットの参照については、「デプロイ時に Azure キー コンテナーを使用して、セキュリティで保護されたパラメーター値を渡す」を参照してください。

Azure Portal でのデプロイ

Azure Container Registry にコンテナー イメージを保持している場合は、Azure portal を使用して Azure Container Instances 内にコンテナーを簡単に作成できます。 Azure portal を使用してコンテナー レジストリからコンテナー インスタンスをデプロイするときは、レジストリの管理者アカウントを有効にする必要があります。 管理者アカウントは、主にテストのために、1 人のユーザーがレジストリにアクセスすることを目的としています。

  1. Azure ポータルで、自分のコンテナー レジストリに移動します。

  2. 管理者アカウントが有効であることを確認するには、 [アクセス キー] を選択し、 [管理者ユーザー] の下で [有効化] を選択します。

  3. [リポジトリ] を選択し、次にデプロイ元のリポジトリを選択して、デプロイするコンテナー イメージのタグを右クリックし、 [実行インスタンス] を選択します。

  4. コンテナーの名前とリソース グループの名前を入力します。 必要に応じて既定の値を変更することもできます。

    Create menu for Azure Container Instances

  5. デプロイが完了したら、通知ウィンドウからコンテナー グループに移動して、その IP アドレスとその他のプロパティを確認できます。

    Details view for Azure Container Instances container group

次のステップ

Azure Container Registry の認証について詳しくは、「Azure Container Registry による認証」をご覧ください。