InvokeAsync() private method

private InvokeAsync ( InvokeAsyncRequest request ) : Amazon.Lambda.Model.InvokeAsyncResponse
request Amazon.Lambda.Model.InvokeAsyncRequest
return Amazon.Lambda.Model.InvokeAsyncResponse
Esempio n. 1
0
    public void UpdateRedis(bool serverTerminated = false)
    {
        var gameServerStatusData = new GameServerStatusData();

        gameServerStatusData.taskArn            = this.taskDataArnWithContainer;
        gameServerStatusData.currentPlayers     = this.server.GetPlayerCount();
        gameServerStatusData.maxPlayers         = Server.maxPlayers;
        gameServerStatusData.publicIP           = this.publicIP;
        gameServerStatusData.port               = Server.port;
        gameServerStatusData.serverTerminated   = serverTerminated;
        gameServerStatusData.gameSessionsHosted = Server.hostedGameSessions;

        var lambdaConfig = new AmazonLambdaConfig()
        {
            RegionEndpoint = this.regionEndpoint
        };

        lambdaConfig.MaxErrorRetry = 0; //Don't do retries on failures
        var lambdaClient = new Amazon.Lambda.AmazonLambdaClient(lambdaConfig);

        // Option 1. If TCPListener is not ready yet, update as not ready
        if (!this.server.IsReady())
        {
            Debug.Log("Updating as not ready yet to Redis");
            gameServerStatusData.ready       = false;
            gameServerStatusData.serverInUse = false;
        }
        // Option 2. If not full yet but, update our status as ready
        else if (this.server.IsReady() && this.server.GetPlayerCount() < Server.maxPlayers)
        {
            Debug.Log("Updating as ready to Redis");
            gameServerStatusData.ready       = true;
            gameServerStatusData.serverInUse = false;
        }
        // Option 3. If full, make sure the available key is deleted in Redis and update the full key
        else
        {
            Debug.Log("Updating as full to Redis");
            gameServerStatusData.ready       = true;
            gameServerStatusData.serverInUse = true;
        }

        // Call Lambda function to update status
        var request = new Amazon.Lambda.Model.InvokeRequest()
        {
            FunctionName   = "FargateGameServersUpdateGameServerData",
            Payload        = JsonConvert.SerializeObject(gameServerStatusData),
            InvocationType = InvocationType.Event
        };

        // NOTE: We could catch response to validate it was successful and do something useful with that information
        lambdaClient.InvokeAsync(request);
    }
        public async Task <LambdaSizeCalculationResultItem> RunTestAsync(LambdaInvocationRequest invocationRequest)
        {
            Console.WriteLine("Starting config fetch prior to test run");

            var settings = await _client.GetFunctionConfigurationAsync(invocationRequest.FunctionName);

            var memory = settings.MemorySize;

            Console.WriteLine("Starting dry run");
            await _client.InvokeAsync(await CreateLambdaRequest(invocationRequest));

            Console.WriteLine("Starting test run # 1");
            var response = await _client.InvokeAsync(await CreateLambdaRequest(invocationRequest));

            Console.WriteLine("Starting test run # 2");
            var response2 = await _client.InvokeAsync(await CreateLambdaRequest(invocationRequest));

            if (response.StatusCode > 299 || response.StatusCode < 200)
            {
                throw new InvalidProgramException($"The Lambda which was invoked with the given payload returned with a status code not in the 200 series. The status code was '{response.StatusCode}'");
            }
            if (response2.StatusCode > 299 || response2.StatusCode < 200)
            {
                throw new InvalidProgramException($"The Lambda which was invoked with the given payload returned with a status code not in the 200 series. The status code was '{response2.StatusCode}'");
            }
            var log1 = response.LogResult;

            var item1 = ParseResultFromLog(log1, memory);

            var log2 = response2.LogResult;

            var item2 = ParseResultFromLog(log2, memory);

            var item = item2.Latency < item1.Latency ? item2 : item1;

            Console.WriteLine($"Selected best out of two test result:{item.ToString()}");

            return(item);
        }
Esempio n. 3
0
    private void HandleWaitingForTermination()
    {
        this.waitingForTerminateCounter += Time.deltaTime;
        // Check the status every 5 seconds
        if (waitingForTerminateCounter > 5.0f)
        {
            this.waitingForTerminateCounter = 0.0f;

            Debug.Log("Waiting for other servers in the Task to finish...");

            var lambdaConfig = new AmazonLambdaConfig()
            {
                RegionEndpoint = this.regionEndpoint
            };
            var lambdaClient = new Amazon.Lambda.AmazonLambdaClient(lambdaConfig);

            // Call Lambda function to check if we should terminate
            var taskStatusRequestData = new TaskStatusData();
            taskStatusRequestData.taskArn = this.taskDataArn;
            var request = new Amazon.Lambda.Model.InvokeRequest()
            {
                FunctionName   = "FargateGameServersCheckIfAllContainersInTaskAreDone",
                Payload        = JsonConvert.SerializeObject(taskStatusRequestData),
                InvocationType = InvocationType.RequestResponse
            };

            // As we are not doing anything else on the server anymore, we can just wait for the invoke response
            var invokeResponse = lambdaClient.InvokeAsync(request);
            invokeResponse.Wait();
            invokeResponse.Result.Payload.Position = 0;
            var sr             = new StreamReader(invokeResponse.Result.Payload);
            var responseString = sr.ReadToEnd();

            Debug.Log("Got response: " + responseString);

            // Try catching to boolean, if it was a failure, this will also result in false
            var allServersInTaskDone = false;
            bool.TryParse(responseString, out allServersInTaskDone);

            if (allServersInTaskDone)
            {
                Debug.Log("All servers in the Task done running full amount of sessions --> Terminate");
                Application.Quit();
            }
        }
    }
Esempio n. 4
0
        static void Main(string[] args)
        {
            Console.WriteLine("Calling AWS function...");
            Amazon.Lambda.AmazonLambdaClient client = new Amazon.Lambda.AmazonLambdaClient(Amazon.RegionEndpoint.EUWest1);

            var uploadRequest = new UploadRequest
            {
                S3BucketName   = "afbuckets3",
                S3ObjectKey    = "E033-21_A_PdC_RV_Anna_Monofamiliare_L1_R00.rvt",
                ForgeBucketKey = "gua68z8svobvpg0r5nizfxvbafna2gbd-ebuilding",
                ForgeModelName = "FromLambda_Torre A ARCH_20210331_3.rvt"
            };

            var request = new InvokeRequest
            {
                FunctionName = "ForgeUploadLocalDeploy-UploadToForgeFunction-1XX2E2GUYTUMQ",
                // force sync lambda invocation
                InvocationType = InvocationType.RequestResponse,
                LogType        = LogType.Tail,
                Payload        = JsonSerializer.Serialize(uploadRequest)
            };

            Stopwatch sw = new Stopwatch();

            sw.Start();

            var response = client.InvokeAsync(request).Result;

            sw.Stop();
            Console.WriteLine($"Function executed in {sw.Elapsed.TotalSeconds} sec");

            if (response != null)
            {
                using (var sr = new StreamReader(response.Payload))
                {
                    var result = sr.ReadToEndAsync().Result;
                    Console.WriteLine(result);
                    var uploadResponse = JsonSerializer.Deserialize <UploadResponse>(result);
                    Console.WriteLine($"object key = {uploadResponse.UploadResult.objectKey}");
                }
            }
        }
Esempio n. 5
0
        public String DeregisterReportedAMIs(AMICleanupInput input, ILambdaContext context)
        {
            var ec2Client = new AmazonEC2Client();
            var s3client  = new AmazonS3Client();

            String[] lines = new AWSCommon().GetS3ContextAsText(input.BucketName, input.Key).Split("\n".ToCharArray());
            int      index = 0;

            foreach (String line in lines)
            {
                if (input.StartIndex > index)
                {
                    if (index == input.StartIndex - 1)
                    {
                        context.Logger.LogLine($"Skipped processing up to index #{index}");
                    }
                    index++;
                    continue;
                }

                if (context.RemainingTime.Seconds < 10)
                {
                    context.Logger.LogLine($"Less than 10 seconds for lambda execution, starting function recursively..");
                    var lambdaClient = new Amazon.Lambda.AmazonLambdaClient();
                    input.StartIndex = index;
                    lambdaClient.InvokeAsync(new Amazon.Lambda.Model.InvokeRequest()
                    {
                        InvocationType = Amazon.Lambda.InvocationType.Event,
                        FunctionName   = context.FunctionName,
                        Payload        = JsonConvert.SerializeObject(input)
                    }).Wait();
                    return("Started recursively with index=" + index);
                }

                index = index + 1;

                String[] cells = line.Split(',');
                if (cells.Length >= 3)
                {
                    String amiId = cells[2];
                    if (amiId.StartsWith("ami-"))
                    {
                        try {
                            var describeResponse = ec2Client.DescribeImagesAsync(new DescribeImagesRequest()
                            {
                                ImageIds = new List <String>()
                                {
                                    amiId
                                }
                            });
                            describeResponse.Wait();

                            context.Logger.LogLine($"De-registering AMI {amiId}");
                            ec2Client.DeregisterImageAsync(new DeregisterImageRequest()
                            {
                                ImageId = amiId
                            }).Wait();

                            describeResponse.Result.Images[0].BlockDeviceMappings.ForEach(mapping => {
                                if (mapping.Ebs != null && mapping.Ebs.SnapshotId != null)
                                {
                                    context.Logger.LogLine($"Deleting snapshot {mapping.Ebs.SnapshotId} for ami {amiId}");
                                    ec2Client.DeleteSnapshotAsync(new DeleteSnapshotRequest()
                                    {
                                        SnapshotId = mapping.Ebs.SnapshotId
                                    }).Wait();
                                }
                            });
                        } catch (Exception ex) {
                            context.Logger.LogLine($"Failed to delete ami {amiId} with following error:");
                            context.Logger.LogLine(ex.ToString());
                        }
                    }
                    else
                    {
                        context.Logger.LogLine($"Skppingg non-ami id : {amiId}");
                    }
                }
            }


            return("OK");
        }