使用C#请求AWS EC2 SpotInstance失败,参数groupId的Value()无效

时间:2019-02-27 00:30:47

标签: c# amazon-web-services amazon-ec2 aws-lambda amazon-ec2-spot-market

我在这里关注本教程:

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 )

我已验证我所引用的安全组有效且存在。我已经尝试了securityGroupId谷歌的groupId,组名和“名称”,但是发生相同的错误。我在哪里错了?我进行了一些搜索,他们表明此错误可能是由使用安全组ID而不是组名称引起的,但是我尝试了对安全组使用所有可用引用的结果相同。

2 个答案:

答案 0 :(得分:0)

LaunchSpecification Class | AWS SDK for .NET V3中,看来SecurityGroups的类型为System.Collections.Generic.List<System.String>

该示例代码可能是错误的。尝试首先创建列表,然后向其中添加安全组。

答案 1 :(得分:0)

好的,看来示例代码是错误的。我做了一些进一步的研究,发现您必须按如下所示引用安全组:

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

这似乎是有效的并且有效。不知道它是否相关,但我还指定了子网的完整性。因此,我认为应该更新AWS示例代码以反映这一点,而不是使用字符串作为组名,您应该实例化GroupIdentifier的实例,将其添加到GroupIdentifier的列表中,然后将其传递给LaunchSpecification。