관리 ID를 사용하여 Azure Container Registry에서 Azure Container Instances에 배포

ACR(Azure Container Registry)은 프라이빗 Docker 컨테이너 이미지를 저장하는 데 사용되는 Azure 기반의 관리형 컨테이너 레지스트리 서비스입니다. 이 문서에서는 Azure Container Instances를 사용하여 컨테이너 그룹에 배포할 때 Azure 컨테이너 레지스트리에 저장된 컨테이너 이미지를 풀하는 방법에 대해 설명합니다. 레지스트리 액세스를 구성하는 한 가지 방법은 Microsoft Entra 관리 ID를 만드는 것입니다.

ACR(Azure Container Registry)에 대한 액세스를 프라이빗 엔드포인트를 사용하여 제한할 때 가상 네트워크에 배포된 Azure Container Instances가 관리 ID를 사용하여 프라이빗 엔드포인트를 통해 컨테이너 레지스트리에 액세스할 수 있습니다.

필수 조건

Azure 컨테이너 레지스트리: 하나 이상의 이미지가 있는 프리미엄 SKU Azure 컨테이너 레지스트리가 필요합니다. 레지스트리를 만들어야 하는 경우 Azure CLI를 사용하여 컨테이너 레지스트리 만들기를 참조하세요. 레지스트리의 idloginServer를 기록해 두세요.

Azure CLI: 이 문서의 명령줄 예제는 Azure CLI를 사용하며 Bash 셸용으로 형식이 지정됩니다. 로컬로 Azure CLI를 설치하거나 Azure Cloud Shell을 사용할 수 있습니다.

제한 사항

레지스트리 인증 구성

컨테이너 레지스트리에 신뢰할 수 있는 서비스가 활성화되어 있어야 합니다. 신뢰할 수 있는 서비스를 사용하도록 설정하는 방법에 대한 지침을 찾으려면 신뢰할 수 있는 서비스가 네트워크 제한 컨테이너 레지스트리에 안전하게 액세스하도록 허용을 참조하세요.

ID 만들기

az identity create 명령을 사용하여 구독에서 ID를 만듭니다. 이전에 사용한 것과 동일한 리소스 그룹을 사용하여 컨테이너 레지스트리 또는 다른 리소스 그룹을 만들 수 있습니다.

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

다음 단계에서 ID를 구성하려면 az identity show 명령을 사용하여 ID의 리소스 ID 및 서비스 주체 ID를 변수에 저장합니다.

이후 단계에서 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 액세스 권한을 부여하려면 서비스 주체 ID도 필요합니다. 값을 표시하려면 다음을 수행합니다.

echo $SPID

서비스 주체 ID는 다음과 같은 형식입니다.

xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxxx

ID에 역할 할당 부여

ID가 컨테이너 레지스트리에 액세스하려면 역할 할당을 부여해야 합니다. 다음 명령을 사용하여 방금 만든 ID에 acrpull 역할을 부여하고 이전에 얻은 레지스트리의 ID와 서비스 주체를 제공해야 합니다.

az role assignment create --assignee $SPID --scope <registry-id> --role acrpull

ARM(Azure Resource Manager) 템플릿을 사용하여 배포

먼저 다음 JSON을 azuredeploy.json이라는 새 파일에 복사합니다. Azure Cloud Shell에서 Visual Studio Code를 사용하여 작업 디렉터리에 파일을 만들 수 있습니다.

code azuredeploy.json

컨테이너 그룹 정의에 imageRegistryCredentials 속성을 포함하여 ARM 템플릿에서 Azure Container Registry 속성을 지정할 수 있습니다. 예를 들어 다음과 같이 레지스트리 자격 증명을 직접 지정할 수 있습니다.

참고 항목

이는 포괄적인 ARM 템플릿이 아니라 전체 템플릿의 resources 섹션이 어떤 모습인지를 나타내는 예입니다.

{
    "type": "Microsoft.ContainerInstance/containerGroups",
    "apiVersion": "2021-09-01",
    "name": "myContainerGroup",
    "location": "norwayeast",
    "identity": {
      "type": "UserAssigned",
      "userAssignedIdentities": {
        "/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxxx/resourcegroups/myResourceGroup/providers/Microsoft.ManagedIdentity/userAssignedIdentities/myACRId": {}
        }
    },
    "properties": {
      "containers": [
        {
          "name": "mycontainer",
          "properties": {
            "image": "myacr.azurecr.io/hello-world:latest",
            "ports": [
              {
                "port": 80,
                "protocol": "TCP"
              }
            ],
            "resources": {
              "requests": {
                "cpu": 1,
                "memoryInGB": 1
              }
            }
        }
        }
      ],
      "imageRegistryCredentials": [
        {
            "server":"myacr.azurecr.io",
            "identity":"/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxxx/resourcegroups/myResourceGroup/providers/Microsoft.ManagedIdentity/userAssignedIdentities/myACRId"
        }
      ],
      "ipAddress": {
        "ports": [
          {
            "port": 80,
            "protocol": "TCP"
          }
        ],
        "type": "public"
      },
      "osType": "Linux"
    }
  }

템플릿 배포

다음 명령을 사용하여 Resource Manager 템플릿을 배포합니다.

az deployment group create --resource-group myResourceGroup --template-file azuredeploy.json

Azure CLI를 사용하여 배포

관리 ID를 사용하여 Azure CLI를 통해 이미지 끌어오기를 인증하는 컨테이너 그룹을 배포하려면 다음 명령을 사용하여 <dns-label>이 전역적으로 고유한지 확인합니다.

az container create --name my-containergroup --resource-group myResourceGroup --image <loginServer>/hello-world:v1 --acr-identity $USERID --assign-identity $USERID --ports 80 --dns-name-label <dns-label>

Azure CLI를 사용하여 가상 네트워크에 배포

관리 ID를 사용하여 가상 네트워크에 컨테이너 그룹을 배포하여 Azure CLI를 통해 프라이빗 엔드포인트 뒤에서 실행되는 ACR에서 끌어온 이미지를 인증하려면 다음 명령을 사용합니다.

az container create --name my-containergroup --resource-group myResourceGroup --image <loginServer>/hello-world:v1 --acr-identity $USERID --assign-identity $USERID --vnet "/subscriptions/$SUBSCRIPTION_ID/resourceGroups/"/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxxx/resourceGroups/myVNetResourceGroup/providers/ --subnet mySubnetName

가상 네트워크에 배포하는 방법에 대한 자세한 내용은 Azure 가상 네트워크에 컨테이너 인스턴스 배포를 참조하세요.

YAML 및 Azure CLI를 사용하여 가상 네트워크에 다중 컨테이너 그룹 배포

관리 ID를 사용하여 가상 네트워크에 다중 컨테이너 그룹을 배포하여 Azure CLI를 통해 프라이빗 엔드포인트 뒤에서 실행되는 ACR에서 끌어온 이미지를 인증하려면 YAML 파일에서 컨테이너 그룹 구성을 지정할 수 있습니다. 그런 후 YAML 파일을 매개 변수로 명령에 전달합니다.

apiVersion: '2021-10-01'
location: eastus
type: Microsoft.ContainerInstance/containerGroups
identity: 
  type: UserAssigned
  userAssignedIdentities: {
    '/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxxx/resourcegroups/myResourceGroup/providers/Microsoft.ManagedIdentity/userAssignedIdentities/myACRId': {}
    }
properties:
  osType: Linux
  imageRegistryCredentials:
  - server: myacr.azurecr.io
    identity: '/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxxx/resourcegroups/myResourceGroup/providers/Microsoft.ManagedIdentity/userAssignedIdentities/myACRId'
  subnetIds:
  - id: '/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxxx/resourceGroups/myVNetResourceGroup/providers/Microsoft.Network/virtualNetworks/myVNetName/subnets/mySubnetName'
    name: mySubnetName
  containers:
  - name: myContainer-1
    properties:
      resources:
        requests:
          cpu: '.4'
          memoryInGb: '1'
      environmentVariables:
        - name: CONTAINER
          value: 1
      image: 'myacr.azurecr.io/myimage:latest'
  - name: myContainer-2
    properties:
      resources:
        requests:
          cpu: '.4'
          memoryInGb: '1'
      environmentVariables:
        - name: CONTAINER
          value: 2
      image: 'myacr.azurecr.io/myimage:latest'
az container create --name my-containergroup --resource-group myResourceGroup --file my-YAML-file.yaml

다중 컨테이너 그룹에 배포하는 방법에 대한 자세한 내용은 다중 컨테이너 그룹 배포를 참조하세요.

리소스 정리

Azure 구독에서 모든 리소스를 제거하려면 리소스 그룹을 삭제합니다.

az group delete --name myResourceGroup

다음 단계