Портал Azure: как настроить идентификатор клиента и секрет клиента

Я хочу программно запускать и останавливать экземпляр виртуальной машины. Если возможно, может ли кто-нибудь дать мне пошаговое руководство о том, как получить эти два значения:

AZURE_CLIENT_ID
AZURE_CLIENT_SECRET

Либо создание через Azure CLI, либо портал Azure Dev Ops — это нормально, я просто не могу понять, почему этот процесс не документирован или несколько интуитивно понятен.

Я не могу нигде ссылаться на процесс, чтобы сделать это.

Я видел это:

Attempted credentials:
        EnvironmentCredential: invalid tenantID. You can locate your tenantID by following the instructions listed here: https://learn.microsoft.com/partner-center/find-ids-and-domain-names
        WorkloadIdentityCredential: no token file specified. Check pod configuration or set TokenFilePath in the options
        ManagedIdentityCredential: managed identity timed out. See https://aka.ms/azsdk/go/identity/troubleshoot#dac for more information
        AzureCLICredential: Azure CLI not found on path
        AzureDeveloperCLICredential: Azure Developer CLI not found on path
exit status 1

Однако, насколько я могу судить, я предоставил правильный TenantId из своей подписки на портал Azure?

Лучшее, что я могу получить, это:

RESPONSE 403: 403 Forbidden
ERROR CODE: AuthorizationFailed
--------------------------------------------------------------------------------
{
  "error": {
    "code": "AuthorizationFailed",
    "message": "The client '...' with object id '...' does not have authorization to perform action 'Microsoft.Compute/virtualMachines/start/action' over scope '/subscriptions/.../resourceGroups/.../providers/Microsoft.Compute/virtualMachines...' or the scope is invalid. If access was recently granted, please refresh your credentials."
  }
}

Код для воспроизведения находится здесь:

package main

import (
    "context"
    "fmt"
    "log"
    "os"

    "github.com/Azure/azure-sdk-for-go/sdk/azcore"
    "github.com/Azure/azure-sdk-for-go/sdk/azidentity"
    "github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/compute/armcompute/v5"
)

func connectionAzure() (azcore.TokenCredential, error) {
    cred, err := azidentity.NewDefaultAzureCredential(nil)

    if err != nil {
        return nil, err
    }
    return cred, nil
}

func main() {
    subscriptionId := os.Getenv("AZURE_SUBSCRIPTION_ID")

    if len(subscriptionId) == 0 {
        log.Fatal("AZURE_SUBSCRIPTION_ID is not set.")
    }

    // Set your Azure resource group name and VM name
    resourceGroupName := "<RESOURCE_GROUP_NAME>"
    virtualMachineName := "<VIRTUAL_MACHINE_NAME>"

    cred, err := connectionAzure()

    if err != nil {
        log.Fatalf("cannot connect to Azure:%+v", err)
    }

    ctx := context.Background()

    client, err := armcompute.NewVirtualMachinesClient(subscriptionId, cred, nil)

    if err != nil {
        log.Fatalf("cannot create Azure Virtual Machines client:%+v", err)
    }

    poller, err := client.BeginStart(ctx, resourceGroupName, virtualMachineName, &armcompute.VirtualMachinesClientBeginStartOptions{})

    if err != nil {
        log.Fatalf("cannot start Azure Virtual Machine:%+v", err)
    }

    // Call the poller object's PollUntilDone function that will block until the poller object
    // has been updated to indicate the task has completed.
    res, err := poller.PollUntilDone(ctx, nil)

    if err != nil {
        log.Fatalf("cannot poll Azure Virtual Machine:%+v", err)
    }

    // Print the fact that the LRO completed.
    fmt.Printf("LRO done")

    // Print the response
    fmt.Printf("Response: %v\n", res)
}

Идентификаторы клиента и секреты клиента принципиально отличаются от вашего идентификатора клиента. Можете ли вы дать ссылку на источник, который запрашивает эти переменные? Вероятно, вам необходимо настроить Регистрация приложения, которая автоматически сгенерирует идентификатор клиента, а затем позволит вам сгенерировать соответствующий секрет клиента. Затем вы добавите области разрешений, которые вам нужны, к связанному управляемому удостоверению для выполнения необходимых вам задач.

esqew 04.04.2024 17:33

@esqew Итак, я успешно настроил новое приложение через раздел «Регистрация приложения» и секрет клиента. Я указал на них оба в своей среде как AZURE_CLIENT_ID и AZURE_CLIENT_SCERET, я также предоставил AZURE_TENANT_ID и AZURE_SUBSCRIPTION_ID и вижу указанную ошибку в своем вопросе, т. е. «EnvironmentCredential: недействительный tenantID. Вы можете найти свой tenantID, следуя инструкциям, перечисленным здесь : Learn.microsoft.com/partner-center/find-ids-and-domain-names‌​"

Micheal J. Roberts 04.04.2024 17:40

@MichealJ.Roberts Вам необходимо назначить роль участника или пользовательскую роль (RBAC) для регистрации приложения, чтобы она могла запускать/останавливать виртуальную машину.

AJ31 04.04.2024 17:41

@ AJ31 Хорошо, круто. Как мне это сделать?

Micheal J. Roberts 04.04.2024 17:43

Перейдите в раздел «Виртуальные машины» в соответствующей группе ресурсов, где расположены ваши виртуальные машины, затем выберите конкретную виртуальную машину, к которой вы хотите, чтобы регистрация приложения имела доступ, и нажмите «Контроль доступа (IAM)», затем добавьте назначение роли.

komluk 04.04.2024 17:46

Следуйте инструкциям в этой статье текст ссылки

AJ31 04.04.2024 17:47

Довольно сложно сказать, почему возникает такая ошибка, не видя минимально воспроизводимого примера кода, использующего эти переменные. Можно предположить, что что-то не так в том, как вы настроили их для использования в своем коде (т. е. ваш код неправильно читает ваш файл .env или другие переменные среды).

esqew 04.04.2024 17:48

@AJ31 @komluk Итак, я добавил роль «Участник виртуальной машины» к желаемому ресурсу, но все еще вижу следующую ошибку: EnvironmentCredential: invalid tenantID. Тем не менее, я НЕСКОЛЬКО раз ссылался на это между порталом и тем, что у меня есть в моей среде, и это на 100% правильно. Я рву на себе волосы.

Micheal J. Roberts 04.04.2024 17:53

@esqew Я добавил к своему вопросу подтверждение того, что мои учетные данные среды настроены правильно, я также перепроверил и подтвердил их на своем портале Azure. Я также добавил минимальный фрагмент кода для вашего обзора в свой вопрос... что-то здесь определенно не сходится, я никогда в жизни ни с чем не боролся больше...

Micheal J. Roberts 04.04.2024 18:00

Теперь, когда вы увидели саму конфигурацию переменной среды, значения вашей переменной среды заключены в кавычки; Я не знаком с действительным идентификатором арендатора, который бы их содержал. Мне кажется опечатка.

esqew 04.04.2024 18:12

Хорошо, после изменения переменной среды (опускания кавычек) я вернулся к does not have authorization to perform action 'Microsoft.Compute/virtualMachines/start/action' over scope, хотя я добавил роль участника виртуальных машин к этому ресурсу...

Micheal J. Roberts 04.04.2024 18:20

Попробуйте добавить роль участника

AJ31 04.04.2024 18:21

Я добавил роль Virtual Machines Contributor... сообщите мне, как добавить роль Contributor... Я не могу ссылаться на эту роль. Пожалуйста, будьте как можно более многословны.

Micheal J. Roberts 04.04.2024 18:23

Перейдите в VM -> Контроль доступа -> Добавить -> Добавить назначение роли -> Роли привилегированного администратора -> Участник, а затем добавьте своего пользователя.

AJ31 04.04.2024 18:27

В качестве ясности к комментарию @ AJ31 добавьте идентификатор регистрации приложения, для которого у вас есть значения Client ID и Client Secret.

esqew 04.04.2024 18:28

@ AJ31 AJ31 Я выполнил эти шаги, но все равно получаю ту же ошибку.

Micheal J. Roberts 04.04.2024 18:30

@esqew Пожалуйста, будьте как можно более подробными, я не могу найти, где добавить идентификатор регистрации приложения ... каковы шаги? (P.S. Боже, это чертовски сложно!). Быстрее просто нажать чертову кнопку «Пуск».

Micheal J. Roberts 04.04.2024 18:31

@MichealJ.Roberts Можете ли вы обновить код, добавив обновление настроек среды? options := azidentity.DefaultAzureCredentialOptions{} options.IncludeEnvironmentCredential = true cred, err := azidentity.NewDefaultAzureCredential(&options)

AJ31 04.04.2024 18:34

Иисус, Алалула, мне удалось запустить виртуальную машину программно, регистрация приложения запутана, и вам нужно ее найти. Господи, Microsoft, ты сегодня меня занозил в заднице. Абсолютная боль. Почему ничего из этого не задокументировано? ДХ-10

Micheal J. Roberts 04.04.2024 18:35
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
В предыдущей статье мы завершили установку базы данных, для тех, кто не знает.
Как установить LAMP Stack 1/2 на Azure Linux VM
Как установить LAMP Stack 1/2 на Azure Linux VM
В дополнение к нашему предыдущему сообщению о намерении Azure прекратить поддержку Azure Database для MySQL в качестве единого сервера после 16...
0
19
2 444
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Чтобы получить AZURE_CLIENT_ID и AZURE_CLIENT_SECRET, вам необходимо выполнить следующие шаги:

Создайте приложение Azure Active Directory в Microsoft Entra ID:

  • На портале Azure перейдите к MS EntraID.
  • Нажмите App registrations, а затем New registration.
  • После создания приложения запишите идентификатор приложения (клиента). Это ваш AZURE_CLIENT_ID.

Создайте секрет клиента:

  • В настройках приложения перейдите на Certificates & secrets.
  • В разделе Client secrets нажмите new client secret.

Сгенерированный секрет клиента — это ваш AZURE_CLIENT_SECRET.

Полученное вами сообщение об ошибке AuthorizationFailed указывает на то, что используемая вами регистрация приложения не имеет необходимых разрешений для выполнения действия, которое вы пытаетесь выполнить. В данном случае он пытается запустить виртуальную машину, но не имеет авторизации. Чтобы решить эту проблему, вам необходимо убедиться, что у App Registration есть соответствующие разрешения. Назначая роль участника, вы предоставляете службе регистрации приложений возможность запускать/останавливать вашу виртуальную машину.

Хорошо, вот что я сделал. Однако, как уже говорилось, я вижу эту ошибку: EnvironmentCredential: недопустимый идентификатор клиента. Вы можете найти свой идентификатор TenantID, следуя инструкциям, перечисленным здесь: Learn.microsoft.com/partner-center/find-ids-and-domain-names Я дважды проверил свой TenantId и указал на него правильную ссылку, и это так. в окружающей среде...

Micheal J. Roberts 04.04.2024 17:37

Кроме того, вы также можете найти идентификатор арендатора программным путем с помощью Azure CLI или PowerShell: az account show

komluk 04.04.2024 17:43

Итак, я только что запустил az login и вижу, что идентификатор арендатора, возвращаемый этой командой, точно такой же, как и в моей среде... идентификатор арендатора указан правильно, но я все еще не могу этого сделать. Этот процесс необходимо сломать. Я рву на себе волосы.

Micheal J. Roberts 04.04.2024 17:47

Убедитесь, что регистрация приложения имеет соответствующие разрешения для запуска/остановки вашей виртуальной машины.

komluk 04.04.2024 17:53

Я назначил правильную роль, как указано, но все еще вижу неправильную ошибку TenantId...

Micheal J. Roberts 04.04.2024 17:54

Другие вопросы по теме

Похожие вопросы

Выбор динамической группы переменных на основе триггерного репозитория
Получает ошибку в коде Azure terraform: данный сервер не поддерживает функцию частной конечной точки. пожалуйста, создайте новый сервер с поддержкой частной конечной точки
Как отправить сообщение на устройство с самоподписанным сертификатом в качестве аутентификации в Azure IoT Hub через REST API
Регистрация приложения Azure ограничивает доступ к секрету/сертификату клиента
Виртуальная машина Azure — программный запуск и остановка машины
Как создать несколько конвейеров Azure Devops, вызывая объекты из одного или нескольких файлов CSV?
Почему на моих страницах входа/регистрации Azure B2C переведена только половина слов?
Пиринг виртуальных сетей и конечные точки служб: как разрешить взаимодействие двух служб приложений Azure
Azure Log Analytics разрешает доступ только к одной конкретной таблице
Доступ к виртуальным машинам Azure из модуля в кластере Azure K8s, расположенном в другой виртуальной сети