【问题标题】:Using C# to request an AWS EC2 SpotInstance fails with Value () for parameter groupId is invalid使用 C# 请求 AWS EC2 SpotInstance 失败,参数 groupId 的 Value () is invalid
【发布时间】:2019-07-20 15:09:19
【问题描述】:

我正在学习这里的教程:

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

并创建了一个 C# Lambda 函数来测试创建 Spot 实例。有问题的功能是:

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

【问题讨论】:

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


    【解决方案1】:

    LaunchSpecification Class | AWS SDK for .NET V3 看来,SecurityGroups 的类型是System.Collections.Generic.List&lt;System.String&gt;

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

    【讨论】:

    • 好的,约翰,我会试试看。从示例代码中,您似乎可以使用安全组实例化一个字符串,然后像这样添加它:launchSpecification.SecurityGroups.Add(securityGroupName); (此外,我是否正确假设有效值是安全组的“名称”?与 Id 或组名称(在 EC2 控制台中显示为明显不同的值)相反。
    • 不幸的是,这不起作用。我试过 List sGroups = new List { securityGroupName };但无论我为安全组使用什么标识符,都会发生同样的错误。
    【解决方案2】:

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

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

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

    【讨论】:

    • 有趣的是,虽然 Spot 请求现在成功了,但启动实例的安全组是 'default' - 不是我指定的组。混乱仍在继续。
    猜你喜欢
    • 2019-11-02
    • 2018-11-04
    • 1970-01-01
    • 2016-02-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-21
    • 1970-01-01
    相关资源
    最近更新 更多