Использование 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.