0

我正在关注这里的教程:

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 引起的,但我已经尝试了安全组的所有可用引用,结果相同。

4

2 回答 2

0

LaunchSpecification 类 | 适用于 .NET V3 的 AWS 开发工具包,似乎SecurityGroups属于 .NET 类型System.Collections.Generic.List<System.String>

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

于 2019-02-27T01:05:44.100 回答
0

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

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

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

于 2019-02-27T03:25:09.947 回答