Использование C# для запроса AWS EC2 SpotInstance завершается неудачно с Value () для параметра groupId недопустим

Я следую за учебником здесь:

https://docs.aws.amazon.com/sdk-for-net/v3/developer-guide/how-to-spot-instances.html

И создали функцию C# Lambda для тестирования создания точечного экземпляра. Рассматриваемая функция:

public async static Task<SpotInstanceRequest> RequestSpotInstance(
      AmazonEC2Client ec2Client,
      string amiId,
      string securityGroupName,
      InstanceType instanceType,
      string spotPrice,
      int instanceCount)
{
    var request = new RequestSpotInstancesRequest();

    request.SpotPrice = spotPrice;
    request.InstanceCount = instanceCount;

    var launchSpecification = new LaunchSpecification();
    launchSpecification.ImageId = amiId;
    launchSpecification.InstanceType = instanceType;

    launchSpecification.SecurityGroups.Add(securityGroupName);

    request.LaunchSpecification = launchSpecification;

    var result = await ec2Client.RequestSpotInstancesAsync(request);
    return result.SpotInstanceRequests[0];
}

Однако выполнение функции завершается неудачно с:

START RequestId: c64ea78d-d350-4f24-974c-09f31d16c5fd Version: $LATEST
One or more errors occurred. (Value () for parameter groupId is invalid. The value cannot be empty): AggregateException
   at System.Threading.Tasks.Task`1.GetResultCore(Boolean waitCompletionNotification)
   at lambda_method(Closure , Stream , Stream , LambdaContextInternal )

Я подтвердил, что ссылаюсь на группу безопасности, которая является действующей и существует. Я пробовал groupId, имя группы и "Имя" для vale securityGroupId, но возникает та же ошибка. Куда я здесь не так? Я выполнил некоторые поиски, и они указывают, что эта ошибка может быть вызвана использованием идентификатора группы безопасности вместо имени группы, но я попробовал все доступные ссылки для группы безопасности с тем же результатом.

2 ответа

Из класса LaunchSpecification | AWS SDK для.NET V3, кажется, что SecurityGroups имеет тип System.Collections.Generic.List<System.String>,

Пример кода может быть неправильным. Попробуйте сначала создать список, а затем добавить к нему группу безопасности.

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

    GroupIdentifier group = new GroupIdentifier { GroupName = "InSite App SG" };
    launchSpecification.AllSecurityGroups = new List<GroupIdentifier> { group };

Это кажется действительным и работает. Не уверен, что это актуально или нет, но я также указал подсеть для полноты. Поэтому я думаю, что пример кода AWS должен быть обновлен, чтобы отразить, что вместо того, чтобы использовать строку для имени группы, вы должны создать экземпляр экземпляра GroupIdentifier, добавить его в список GroupIdentifier, а затем передать его в LaunchSpecification.

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