我在这里关注本教程:
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而不是组名称引起的,但是我尝试了对安全组使用所有可用引用的结果相同。
答案 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。