Я хочу программно запускать и останавливать экземпляр виртуальной машины. Если возможно, может ли кто-нибудь дать мне пошаговое руководство о том, как получить эти два значения:
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 Итак, я успешно настроил новое приложение через раздел «Регистрация приложения» и секрет клиента. Я указал на них оба в своей среде как 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"
@MichealJ.Roberts Вам необходимо назначить роль участника или пользовательскую роль (RBAC) для регистрации приложения, чтобы она могла запускать/останавливать виртуальную машину.
@ AJ31 Хорошо, круто. Как мне это сделать?
Перейдите в раздел «Виртуальные машины» в соответствующей группе ресурсов, где расположены ваши виртуальные машины, затем выберите конкретную виртуальную машину, к которой вы хотите, чтобы регистрация приложения имела доступ, и нажмите «Контроль доступа (IAM)», затем добавьте назначение роли.
Следуйте инструкциям в этой статье текст ссылки
Довольно сложно сказать, почему возникает такая ошибка, не видя минимально воспроизводимого примера кода, использующего эти переменные. Можно предположить, что что-то не так в том, как вы настроили их для использования в своем коде (т. е. ваш код неправильно читает ваш файл .env
или другие переменные среды).
@AJ31 @komluk Итак, я добавил роль «Участник виртуальной машины» к желаемому ресурсу, но все еще вижу следующую ошибку: EnvironmentCredential: invalid tenantID.
Тем не менее, я НЕСКОЛЬКО раз ссылался на это между порталом и тем, что у меня есть в моей среде, и это на 100% правильно. Я рву на себе волосы.
@esqew Я добавил к своему вопросу подтверждение того, что мои учетные данные среды настроены правильно, я также перепроверил и подтвердил их на своем портале Azure. Я также добавил минимальный фрагмент кода для вашего обзора в свой вопрос... что-то здесь определенно не сходится, я никогда в жизни ни с чем не боролся больше...
Теперь, когда вы увидели саму конфигурацию переменной среды, значения вашей переменной среды заключены в кавычки; Я не знаком с действительным идентификатором арендатора, который бы их содержал. Мне кажется опечатка.
Хорошо, после изменения переменной среды (опускания кавычек) я вернулся к does not have authorization to perform action 'Microsoft.Compute/virtualMachines/start/action' over scope
, хотя я добавил роль участника виртуальных машин к этому ресурсу...
Попробуйте добавить роль участника
Я добавил роль Virtual Machines Contributor
... сообщите мне, как добавить роль Contributor
... Я не могу ссылаться на эту роль. Пожалуйста, будьте как можно более многословны.
Перейдите в VM -> Контроль доступа -> Добавить -> Добавить назначение роли -> Роли привилегированного администратора -> Участник, а затем добавьте своего пользователя.
В качестве ясности к комментарию @ AJ31 добавьте идентификатор регистрации приложения, для которого у вас есть значения Client ID и Client Secret.
@ AJ31 AJ31 Я выполнил эти шаги, но все равно получаю ту же ошибку.
@esqew Пожалуйста, будьте как можно более подробными, я не могу найти, где добавить идентификатор регистрации приложения ... каковы шаги? (P.S. Боже, это чертовски сложно!). Быстрее просто нажать чертову кнопку «Пуск».
@MichealJ.Roberts Можете ли вы обновить код, добавив обновление настроек среды? options := azidentity.DefaultAzureCredentialOptions{} options.IncludeEnvironmentCredential = true cred, err := azidentity.NewDefaultAzureCredential(&options)
Иисус, Алалула, мне удалось запустить виртуальную машину программно, регистрация приложения запутана, и вам нужно ее найти. Господи, Microsoft, ты сегодня меня занозил в заднице. Абсолютная боль. Почему ничего из этого не задокументировано? ДХ-10
Чтобы получить AZURE_CLIENT_ID и AZURE_CLIENT_SECRET, вам необходимо выполнить следующие шаги:
Создайте приложение Azure Active Directory в Microsoft Entra ID
:
MS EntraID
.App registrations
, а затем New registration
.Создайте секрет клиента:
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 и указал на него правильную ссылку, и это так. в окружающей среде...
Кроме того, вы также можете найти идентификатор арендатора программным путем с помощью Azure CLI или PowerShell: az account show
Итак, я только что запустил az login
и вижу, что идентификатор арендатора, возвращаемый этой командой, точно такой же, как и в моей среде... идентификатор арендатора указан правильно, но я все еще не могу этого сделать. Этот процесс необходимо сломать. Я рву на себе волосы.
Убедитесь, что регистрация приложения имеет соответствующие разрешения для запуска/остановки вашей виртуальной машины.
Я назначил правильную роль, как указано, но все еще вижу неправильную ошибку TenantId...
Идентификаторы клиента и секреты клиента принципиально отличаются от вашего идентификатора клиента. Можете ли вы дать ссылку на источник, который запрашивает эти переменные? Вероятно, вам необходимо настроить Регистрация приложения, которая автоматически сгенерирует идентификатор клиента, а затем позволит вам сгенерировать соответствующий секрет клиента. Затем вы добавите области разрешений, которые вам нужны, к связанному управляемому удостоверению для выполнения необходимых вам задач.