gsutil на виртуальной машине Google Compute Engine не может использовать аутентификацию служебной учетной записи с файлом ключа

Я запускаю экземпляр из API google .net, и, несмотря на все мои усилия, я не могу заставить его что-либо копировать в хранилище или из него. В настоящее время я аутентифицируюсь с помощью учетной записи службы консоли разработчика, например: -

string ServiceAccountEmail = "[email protected]";

var certificate = new X509Certificate2(@"key.p12", "notasecret", X509KeyStorageFlags.Exportable);

ServiceAccountCredential credential = new ServiceAccountCredential(
    new ServiceAccountCredential.Initializer(ServiceAccountEmail)
    {
        Scopes = new[] { ComputeService.Scope.Compute, ComputeService.Scope.DevstorageFullControl }
    }.FromCertificate(certificate));

var cs = new ComputeService(new BaseClientService.Initializer
{
    ApplicationName = "appname",
    HttpClientInitializer = (Google.Apis.Http.IConfigurableHttpClientInitializer)credential,
});


Google.Apis.Compute.v1.Data.Instance newinst = new Google.Apis.Compute.v1.Data.Instance();
newinst.Name = "generatedinstance";
newinst.MachineType = "https://www.googleapis.com/compute/v1/projects/projectid/zones/zone/machineTypes/n1-standard-1";

Google.Apis.Compute.v1.Data.AttachedDisk ad = new Google.Apis.Compute.v1.Data.AttachedDisk();
ad.AutoDelete = true;
ad.Boot = true;
ad.Type = "PERSISTENT";
ad.InitializeParams = new Google.Apis.Compute.v1.Data.AttachedDiskInitializeParams();
ad.InitializeParams.DiskName = "newdisk";
ad.InitializeParams.SourceImage = "https://www.googleapis.com/compute/v1/projects/projectid/global/images/customimage";
ad.InitializeParams.DiskType = "https://www.googleapis.com/compute/v1/projects/projectid/zones/zone/diskTypes/pd-standard";
ad.Mode = "READ_WRITE";
newinst.Disks = new List<Google.Apis.Compute.v1.Data.AttachedDisk>();
newinst.Disks.Add(ad);

Google.Apis.Compute.v1.Data.NetworkInterface ni = new Google.Apis.Compute.v1.Data.NetworkInterface();
ni.Network = "https://www.googleapis.com/compute/v1/projects/projectid/global/networks/default";
ni.AccessConfigs = new List<Google.Apis.Compute.v1.Data.AccessConfig>();
ni.AccessConfigs.Add(new Google.Apis.Compute.v1.Data.AccessConfig
{
    Type = "ONE_TO_ONE_NAT",
    Name = "External NAT",
});
newinst.NetworkInterfaces = new List<Google.Apis.Compute.v1.Data.NetworkInterface>();
newinst.NetworkInterfaces.Add(ni);
var start = new Google.Apis.Compute.v1.Data.Metadata.ItemsData();
start.Key = "startup-script";
start.Value = "*startup script* includes gsutil cp which won't work without service account attached";
newinst.Metadata = new Google.Apis.Compute.v1.Data.Metadata();
newinst.Metadata.Kind = "compute#metadata";
newinst.Metadata.Items = new List<Google.Apis.Compute.v1.Data.Metadata.ItemsData>();
newinst.Metadata.Items.Add(start);
newinst.ServiceAccounts = new List<Google.Apis.Compute.v1.Data.ServiceAccount>();

//var sa = new Google.Apis.Compute.v1.Data.ServiceAccount();|with this section
//sa.Email = "[email protected]";      |the instance won't
//sa.Scopes = new[] { ComputeService.Scope.Compute,         |start. (An equivalent
    ComputeService.Scope.DevstorageFullControl };           |is found in instance
//newinst.ServiceAccounts.Add(sa);                          |start REST request)

var instinsert = new InstancesResource.InsertRequest(cs, newinst, "projectid", "zone");
var insertresponse = instinsert.Execute();

Когда я пытаюсь использовать gsutil cp, я получаю сообщение "В настоящее время у вас нет выбранной активной учетной записи.". Может ли кто-нибудь сказать мне, где я ошибаюсь?


person Ross Manson    schedule 19.09.2014    source источник
comment
Вы получаете учетную запись и имя проекта из команды gcloud config list?   -  person Paolo P.    schedule 19.09.2014
comment
@ПаолоП. просто название проекта   -  person Ross Manson    schedule 19.09.2014
comment
Возможно, вам нужно выполнить вход в gcloud auth и пройти аутентификацию со своими учетными данными. Надеюсь это поможет.   -  person Paolo P.    schedule 19.09.2014


Ответы (3)


Вам нужно запустить gcloud auth activate-service-account [email protected] --key-file path_to_key.p12, чтобы сообщить Cloud SDK (включая gsutil) о вашей служебной учетной записи.

person John Asmuth    schedule 19.09.2014
comment
Ему не нужно запускать учетную запись активации службы аутентификации gcloud, поскольку он пытается создать экземпляр с помощью API и имеет сценарий запуска в виртуальной машине. - person Marilu; 20.09.2014
comment
Я попытался активировать учетную запись службы из отдельного экземпляра, но это означает, что я могу использовать ее только для ЭТОГО экземпляра. Я не могу активировать его на текущем экземпляре, так как не могу загрузить файл ключа - person Ross Manson; 22.09.2014

Согласно предоставленному коду я вижу, что оригинал пример есть

var certificate = new X509Certificate2(@"key.p12", "notasecret", X509KeyStorageFlags.Exportable);

Я заметил, что вам не хватает '@' в вашем коде. Я не очень хорошо знаком с .Net. Я протестировал эти примеры в python, и этот один. При создании своего экземпляра я добавил учетную запись службы для GCS, и файл загружается правильно.

person Marilu    schedule 19.09.2014
comment
извините, @ есть в самом коде, я забыл включить его в вопрос - person Ross Manson; 22.09.2014
comment
мне нужно добавить мою учетную запись службы с областями действия в поле учетных записей службы запроса на вставку? похоже, это происходит в остальном эквиваленте API, найденном в консоли разработчика, но когда я это делаю, экземпляр не запускается - person Ross Manson; 22.09.2014

ХОРОШО! Задача решена. Часть, в которой я ошибался, была частью, прокомментированной в вопросе:

var sa = new Google.Apis.Compute.v1.Data.ServiceAccount();
sa.Email = "[email protected]";
sa.Scopes = new[] { ComputeService.Scope.Compute,
    ComputeService.Scope.DevstorageFullControl };
newinst.ServiceAccounts.Add(sa);

Мне нужен адрес электронной почты для основной учетной записи службы для консоли разработчика в этом разделе, а не та же учетная запись службы, которую я использовал для создания учетных данных, но не спрашивайте меня, почему. Дело в том, что экземпляр запускается, и gsutil теперь успешно копирует его.
Спасибо за ваше время и помогите всем!
Росс

person Ross Manson    schedule 23.09.2014