internal DescribeLogGroupsResponse DescribeLogGroups(DescribeLogGroupsRequest request)
        {
            var marshaller   = new DescribeLogGroupsRequestMarshaller();
            var unmarshaller = DescribeLogGroupsResponseUnmarshaller.Instance;

            return(Invoke <DescribeLogGroupsRequest, DescribeLogGroupsResponse>(request, marshaller, unmarshaller));
        }
Ejemplo n.º 2
0
        // snippet-start:[CloudWatchLogs.dotnetv3.DescribeLogGroupsExample]
        public static async Task Main()
        {
            // Creates a CloudWatch Logs client using the default
            // user. If you need to work with resources in another
            // AWS Region than the one defined for the default user,
            // pass the AWS Region as a parameter to the client constructor.
            var client = new AmazonCloudWatchLogsClient();

            var request = new DescribeLogGroupsRequest
            {
                Limit = 5,
            };

            var response = await client.DescribeLogGroupsAsync(request);

            if (response.LogGroups.Count > 0)
            {
                do
                {
                    response.LogGroups.ForEach(lg =>
                    {
                        Console.WriteLine($"{lg.LogGroupName} is associated with the key: {lg.KmsKeyId}.");
                        Console.WriteLine($"Created on: {lg.CreationTime.Date.Date}");
                        Console.WriteLine($"Date for this group will be stored for: {lg.RetentionInDays} days.\n");
                    });
                }while (response.NextToken is not null);
            }
        }
Ejemplo n.º 3
0
        /// <summary>
        /// Creates the log group.
        /// </summary>
        /// <exception cref="Serilog.Sinks.AwsCloudWatch.AwsCloudWatchSinkException"></exception>
        private async Task CreateLogGroupAsync()
        {
            if (options.CreateLogGroup)
            {
                // see if the log group already exists
                var describeRequest = new DescribeLogGroupsRequest
                {
                    LogGroupNamePrefix = options.LogGroupName
                };

                var logGroups = await cloudWatchClient
                                .DescribeLogGroupsAsync(describeRequest);

                var logGroup = logGroups
                               .LogGroups
                               .FirstOrDefault(lg => string.Equals(lg.LogGroupName, options.LogGroupName, StringComparison.Ordinal));

                // create log group if it doesn't exist
                if (logGroup == null)
                {
                    var createRequest  = new CreateLogGroupRequest(options.LogGroupName);
                    var createResponse = await cloudWatchClient.CreateLogGroupAsync(createRequest);

                    // update the retention policy if a specific period is defined
                    if (options.LogGroupRetentionPolicy != LogGroupRetentionPolicy.Indefinitely)
                    {
                        var putRetentionRequest = new PutRetentionPolicyRequest(options.LogGroupName, (int)options.LogGroupRetentionPolicy);
                        await cloudWatchClient.PutRetentionPolicyAsync(putRetentionRequest);
                    }
                }
            }
        }
Ejemplo n.º 4
0
        /// <summary>
        /// Initiates the asynchronous execution of the DescribeLogGroups operation.
        /// <seealso cref="Amazon.CloudWatchLogs.IAmazonCloudWatchLogs"/>
        /// </summary>
        ///
        /// <param name="request">Container for the necessary parameters to execute the DescribeLogGroups operation.</param>
        /// <param name="cancellationToken">
        ///     A cancellation token that can be used by other objects or threads to receive notice of cancellation.
        /// </param>
        /// <returns>The task object representing the asynchronous operation.</returns>
        public Task <DescribeLogGroupsResponse> DescribeLogGroupsAsync(DescribeLogGroupsRequest request, CancellationToken cancellationToken = default(CancellationToken))
        {
            var marshaller   = new DescribeLogGroupsRequestMarshaller();
            var unmarshaller = DescribeLogGroupsResponseUnmarshaller.Instance;

            return(Invoke <IRequest, DescribeLogGroupsRequest, DescribeLogGroupsResponse>(request, marshaller, unmarshaller, signer, cancellationToken));
        }
Ejemplo n.º 5
0
        public override void Invoke(AWSCredentials creds, RegionEndpoint region, int maxItems)
        {
            AmazonCloudWatchLogsConfig config = new AmazonCloudWatchLogsConfig();

            config.RegionEndpoint = region;
            ConfigureClient(config);
            AmazonCloudWatchLogsClient client = new AmazonCloudWatchLogsClient(creds, config);

            DescribeLogGroupsResponse resp = new DescribeLogGroupsResponse();

            do
            {
                DescribeLogGroupsRequest req = new DescribeLogGroupsRequest
                {
                    NextToken = resp.NextToken
                    ,
                    Limit = maxItems
                };

                resp = client.DescribeLogGroups(req);
                CheckError(resp.HttpStatusCode, "200");

                foreach (var obj in resp.LogGroups)
                {
                    AddObject(obj);
                }
            }while (!string.IsNullOrEmpty(resp.NextToken));
        }
        public async Task DescribeLogGroupsTest_TwoResponses()
        {
            var request       = new DescribeLogGroupsRequest();
            var firstResponse = new DescribeLogGroupsResponse()
            {
                NextToken = "foo"
            };
            var secondResponse = new DescribeLogGroupsResponse()
            {
                NextToken = null
            };
            var token = new CancellationToken();

            _mockClient.SetupSequence(x => x.DescribeLogGroupsAsync(It.IsAny <DescribeLogGroupsRequest>(), It.IsAny <CancellationToken>()))
            .ReturnsAsync(firstResponse)
            .ReturnsAsync(secondResponse);

            var numResponses = 0;

            await foreach (var desination in _mockClient.Object.Paginators.DescribeLogGroups(request).Responses.WithCancellation(token))
            {
                numResponses += 1;
            }
            Assert.Equal(2, numResponses);
        }
        private async Task <IEnumerable <string> > GetLogGroups(IEnumerable <string> logGroups = null, string nextToken = default)
        {
            while (true)
            {
                if (logGroups == null)
                {
                    logGroups = new string[0];
                }

                var request = new DescribeLogGroupsRequest {
                    Limit = 50, LogGroupNamePrefix = _prefix, NextToken = nextToken
                };
                var result = await _cloudWatchLogs.DescribeLogGroupsAsync(request);

                logGroups = logGroups.Concat(result.LogGroups.Select(logGroup => logGroup.LogGroupName));

                if (!string.IsNullOrEmpty(result.NextToken))
                {
                    nextToken = result.NextToken;
                }
                else
                {
                    return(logGroups);
                }
            }
        }
Ejemplo n.º 8
0
 /// <summary>
 /// To check if the credentials is right
 /// </summary>
 /// <returns>Return a bool verb after trying to connect to AWS</returns>
 public bool awsConnection()
 {
     awsLogGroup = new DescribeLogGroupsRequest();
     try
     {
         awsCloudwatchClient.DescribeLogGroups(awsLogGroup);
         return(true);
     }
     catch { return(false); }
 }
Ejemplo n.º 9
0
 public LogGroupsReader(InputContext context, IRowFactory rowFactory)
 {
     _context    = context;
     _rowFactory = rowFactory;
     _client     = new AmazonCloudWatchLogsClient();
     CheckFieldTypes();
     _request = new DescribeLogGroupsRequest()
     {
         Limit = GetLimit(), LogGroupNamePrefix = GetPrefix()
     };
 }
Ejemplo n.º 10
0
        private static bool LogGroupExists(IAmazonCloudWatchLogs client, string logGroupName)
        {
            var describeLogGroupRequest = new DescribeLogGroupsRequest
            {
                LogGroupNamePrefix = logGroupName,
                Limit = 1
            };
            var describeLogGroupResponse =
                (client.DescribeLogGroupsAsync(describeLogGroupRequest)).GetAwaiter()
                .GetResult();

            return(describeLogGroupResponse.LogGroups.Any(x => x.LogGroupName == logGroupName));
        }
Ejemplo n.º 11
0
        internal DescribeLogGroupsResponse DescribeLogGroups(DescribeLogGroupsRequest request)
        {
            var task = DescribeLogGroupsAsync(request);

            try
            {
                return(task.Result);
            }
            catch (AggregateException e)
            {
                ExceptionDispatchInfo.Capture(e.InnerException).Throw();
                return(null);
            }
        }
        public async Task DescribeLogGroupsTest__OnlyUsedOnce()
        {
            var request   = new DescribeLogGroupsRequest();
            var response  = new DescribeLogGroupsResponse();
            var token     = new CancellationToken();
            var paginator = _mockClient.Object.Paginators.DescribeLogGroups(request);

            _mockClient.Setup(x => x.DescribeLogGroupsAsync(It.IsAny <DescribeLogGroupsRequest>(), It.IsAny <CancellationToken>())).ReturnsAsync(response);

            // Should work the first time
            await LoopOverLogGroups(paginator, token);

            // Second time should throw an exception
            await Assert.ThrowsAsync <System.InvalidOperationException>(async() => await LoopOverLogGroups(paginator, token));
        }
        private async Task EnsureInitialized()
        {
            if (hasInit)
            {
                return;
            }

            if (options.CreateLogGroup)
            {
                // see if the log group already exists
                DescribeLogGroupsRequest describeRequest = new DescribeLogGroupsRequest {
                    LogGroupNamePrefix = options.LogGroupName
                };
                var logGroups = await cloudWatchClient.DescribeLogGroupsAsync(describeRequest);

                var logGroup = logGroups.LogGroups.FirstOrDefault(lg => string.Equals(lg.LogGroupName, options.LogGroupName, StringComparison.OrdinalIgnoreCase));

                // create log group if it doesn't exist
                if (logGroup == null)
                {
                    CreateLogGroupRequest createRequest = new CreateLogGroupRequest(options.LogGroupName);
                    var createResponse = await cloudWatchClient.CreateLogGroupAsync(createRequest);

                    if (!createResponse.HttpStatusCode.IsSuccessStatusCode())
                    {
                        throw new Exception($"Tried to create a log group, but failed with status code '{createResponse.HttpStatusCode}' and data '{createResponse.ResponseMetadata.FlattenedMetaData()}'.");
                    }
                }
            }

            // create log stream
            CreateLogStreamRequest createLogStreamRequest = new CreateLogStreamRequest()
            {
                LogGroupName  = options.LogGroupName,
                LogStreamName = logStreamName
            };
            var createLogStreamResponse = await cloudWatchClient.CreateLogStreamAsync(createLogStreamRequest);

            if (!createLogStreamResponse.HttpStatusCode.IsSuccessStatusCode())
            {
                throw new Exception(
                          $"Tried to create a log stream, but failed with status code '{createLogStreamResponse.HttpStatusCode}' and data '{createLogStreamResponse.ResponseMetadata.FlattenedMetaData()}'.");
            }

            hasInit = true;
        }
Ejemplo n.º 14
0
        /// <summary>
        /// Creates the log group.
        /// </summary>
        /// <exception cref="Serilog.Sinks.AwsCloudWatch.AwsCloudWatchSinkException"></exception>
        private async Task CreateLogGroupAsync()
        {
            if (options.CreateLogGroup)
            {
                // see if the log group already exists
                DescribeLogGroupsRequest describeRequest = new DescribeLogGroupsRequest {
                    LogGroupNamePrefix = options.LogGroupName
                };
                var logGroups = await cloudWatchClient.DescribeLogGroupsAsync(describeRequest);

                var logGroup = logGroups.LogGroups.FirstOrDefault(lg => string.Equals(lg.LogGroupName, options.LogGroupName, StringComparison.OrdinalIgnoreCase));

                // create log group if it doesn't exist
                if (logGroup == null)
                {
                    CreateLogGroupRequest createRequest = new CreateLogGroupRequest(options.LogGroupName);
                    var createResponse = await cloudWatchClient.CreateLogGroupAsync(createRequest);
                }
            }
        }
        public async Task DescribeLogGroupsTest__CancellationToken()
        {
            var request       = new DescribeLogGroupsRequest();
            var firstResponse = new DescribeLogGroupsResponse()
            {
                NextToken = "foo"
            };
            var secondResponse = new DescribeLogGroupsResponse()
            {
                NextToken = null
            };
            var paginator = _mockClient.Object.Paginators.DescribeLogGroups(request);

            var tokenSource = new CancellationTokenSource();
            var token       = tokenSource.Token;

            tokenSource.Cancel();

            _mockClient.SetupSequence(x => x.DescribeLogGroupsAsync(It.IsAny <DescribeLogGroupsRequest>(), It.IsAny <CancellationToken>()))
            .ReturnsAsync(firstResponse)
            .ReturnsAsync(secondResponse);

            await Assert.ThrowsAsync <OperationCanceledException>(async() => await LoopOverLogGroups(paginator, token));
        }
Ejemplo n.º 16
0
 /// <summary>
 /// Get all the LogGroup on the RegionEndpoint
 /// </summary>
 /// <returns>return the LogGroup found</returns>
 public DescribeLogGroupsResponse GetLogGroups()
 {
     awsLogGroup = new DescribeLogGroupsRequest();
     return(awsCloudwatchClient.DescribeLogGroups(awsLogGroup));
 }
Ejemplo n.º 17
0
        public async Task DeleteOrphanLogsAsync(bool dryRun, string awsProfile, string awsRegion)
        {
            Console.WriteLine();

            // initialize AWS profile
            await InitializeAwsProfile(awsProfile, awsRegion : awsRegion);

            var logsClient = new AmazonCloudWatchLogsClient(AWSConfigs.RegionEndpoint);

            // delete orphaned logs
            var totalLogGroups    = 0;
            var activeLogGroups   = 0;
            var orphanedLogGroups = 0;
            var skippedLogGroups  = 0;

            await DeleteOrphanLambdaLogsAsync();
            await DeleteOrphanApiGatewayLogs();
            await DeleteOrphanApiGatewayV2Logs();

            if ((orphanedLogGroups > 0) || (skippedLogGroups > 0))
            {
                Console.WriteLine();
            }
            Console.WriteLine($"Found {totalLogGroups:N0} log groups. Active {activeLogGroups:N0}. Orphaned {orphanedLogGroups:N0}. Skipped {skippedLogGroups:N0}.");

            // local functions
            async Task DeleteOrphanLambdaLogsAsync()
            {
                // list all lambda functions
                var lambdaClient        = new AmazonLambdaClient(AWSConfigs.RegionEndpoint);
                var request             = new ListFunctionsRequest {
                };
                var lambdaLogGroupNames = new HashSet <string>();

                do
                {
                    var response = await lambdaClient.ListFunctionsAsync(request);

                    foreach (var function in response.Functions)
                    {
                        lambdaLogGroupNames.Add($"/aws/lambda/{function.FunctionName}");
                    }
                    request.Marker = response.NextMarker;
                } while(request.Marker != null);

                // list all log groups for lambda functions
                await DeleteOrphanCloudWatchLogs(
                    "/aws/lambda/",
                    logGroupName => lambdaLogGroupNames.Contains(logGroupName),
                    logGroupName => Regex.IsMatch(logGroupName, @"^\/aws\/lambda\/[a-zA-Z0-9\-_]+$")
                    );
            }

            async Task DeleteOrphanApiGatewayLogs()
            {
                // list all API Gateway V1 instances
                var apiGatewayClient     = new AmazonAPIGatewayClient(AWSConfigs.RegionEndpoint);
                var request              = new GetRestApisRequest {
                };
                var apiGatewayGroupNames = new List <string>();

                do
                {
                    var response = await apiGatewayClient.GetRestApisAsync(request);

                    apiGatewayGroupNames.AddRange(response.Items.Select(item => $"API-Gateway-Execution-Logs_{item.Id}/"));
                    request.Position = response.Position;
                } while(request.Position != null);

                // list all log groups for API Gateway instances
                await DeleteOrphanCloudWatchLogs(
                    "API-Gateway-Execution-Logs_",
                    logGroupName => apiGatewayGroupNames.Any(apiGatewayGroupName => logGroupName.StartsWith(apiGatewayGroupName, StringComparison.Ordinal)),
                    logGroupName => Regex.IsMatch(logGroupName, @"^API-Gateway-Execution-Logs_[a-zA-Z0-9]+/.+$")
                    );
            }

            async Task DeleteOrphanApiGatewayV2Logs()
            {
                // list all API Gateway V2 instances
                var apiGatewayV2Client   = new AmazonApiGatewayV2Client(AWSConfigs.RegionEndpoint);
                var request              = new GetApisRequest {
                };
                var apiGatewayGroupNames = new List <string>();

                do
                {
                    var response = await apiGatewayV2Client.GetApisAsync(request);

                    apiGatewayGroupNames.AddRange(response.Items.Select(item => $"/aws/apigateway/{item.ApiId}/"));
                    request.NextToken = response.NextToken;
                } while(request.NextToken != null);

                // list all log groups for API Gateway instances
                await DeleteOrphanCloudWatchLogs(
                    "/aws/apigateway/",
                    logGroupName => (logGroupName == "/aws/apigateway/welcome") || apiGatewayGroupNames.Any(apiGatewayGroupName => logGroupName.StartsWith(apiGatewayGroupName, StringComparison.Ordinal)),
                    logGroupName => Regex.IsMatch(logGroupName, @"^/aws/apigateway/[a-zA-Z0-9]+/.+$")
                    );
            }

            async Task DeleteOrphanCloudWatchLogs(string logGroupPrefix, Func <string, bool> isActiveLogGroup, Func <string, bool> isValidLogGroup)
            {
                var describeLogGroupsRequest = new DescribeLogGroupsRequest {
                    LogGroupNamePrefix = logGroupPrefix
                };

                do
                {
                    var describeLogGroupsResponse = await logsClient.DescribeLogGroupsAsync(describeLogGroupsRequest);

                    totalLogGroups += describeLogGroupsResponse.LogGroups.Count;
                    foreach (var logGroup in describeLogGroupsResponse.LogGroups)
                    {
                        if (isActiveLogGroup(logGroup.LogGroupName))
                        {
                            // nothing to do
                            ++activeLogGroups;
                        }
                        else if (isValidLogGroup(logGroup.LogGroupName))
                        {
                            // attempt to delete log group
                            if (dryRun)
                            {
                                Console.WriteLine($"* deleted '{logGroup.LogGroupName}' (skipped)");
                                ++orphanedLogGroups;
                            }
                            else
                            {
                                try {
                                    await logsClient.DeleteLogGroupAsync(new DeleteLogGroupRequest {
                                        LogGroupName = logGroup.LogGroupName
                                    });

                                    Console.WriteLine($"* deleted '{logGroup.LogGroupName}'");
                                    ++orphanedLogGroups;
                                } catch {
                                    LogError($"could not delete '{logGroup.LogGroupName}'");
                                    ++skippedLogGroups;
                                }
                            }
                        }
                        else
                        {
                            // log group has an invalid name structure; skip it
                            Console.WriteLine($"SKIPPED '{logGroup.LogGroupName}'");
                            ++skippedLogGroups;
                        }
                    }
                    describeLogGroupsRequest.NextToken = describeLogGroupsResponse.NextToken;
                } while(describeLogGroupsRequest.NextToken != null);
            }
        }
Ejemplo n.º 18
0
        public async Task DeleteOrphanLambdaLogsAsync(bool dryRun)
        {
            Console.WriteLine();

            // list all lambda functions
            var lambdaClient         = new AmazonLambdaClient();
            var listFunctionsRequest = new ListFunctionsRequest {
            };
            var lambdaLogGroupNames  = new HashSet <string>();

            do
            {
                var listFunctionsResponse = await lambdaClient.ListFunctionsAsync(listFunctionsRequest);

                foreach (var function in listFunctionsResponse.Functions)
                {
                    lambdaLogGroupNames.Add($"/aws/lambda/{function.FunctionName}");
                }
                listFunctionsRequest.Marker = listFunctionsResponse.NextMarker;
            } while(listFunctionsRequest.Marker != null);

            // list all log groups for lambda functions
            var logsClient = new AmazonCloudWatchLogsClient();
            var describeLogGroupsRequest = new DescribeLogGroupsRequest {
                LogGroupNamePrefix = "/aws/lambda/"
            };
            var totalLogGroups   = 0;
            var deletedLogGroups = 0;
            var skippedLogGroups = 0;

            do
            {
                var describeLogGroupsResponse = await logsClient.DescribeLogGroupsAsync(describeLogGroupsRequest);

                totalLogGroups += describeLogGroupsResponse.LogGroups.Count;
                foreach (var logGroup in describeLogGroupsResponse.LogGroups)
                {
                    if (lambdaLogGroupNames.Contains(logGroup.LogGroupName))
                    {
                        // nothing to do
                    }
                    else if (System.Text.RegularExpressions.Regex.IsMatch(logGroup.LogGroupName, @"^\/aws\/lambda\/[a-zA-Z0-9\-_]+$"))
                    {
                        // attempt to delete log group
                        if (dryRun)
                        {
                            Console.WriteLine($"* deleted '{logGroup.LogGroupName}' (skipped)");
                        }
                        else
                        {
                            try {
                                await logsClient.DeleteLogGroupAsync(new DeleteLogGroupRequest {
                                    LogGroupName = logGroup.LogGroupName
                                });

                                Console.WriteLine($"* deleted '{logGroup.LogGroupName}'");
                                ++deletedLogGroups;
                            } catch {
                                LogError($"could not delete '{logGroup.LogGroupName}'");
                            }
                        }
                    }
                    else
                    {
                        // log group has an invalid name structure; skip it
                        Console.WriteLine($"SKIPPED '{logGroup.LogGroupName}'");
                        ++skippedLogGroups;
                    }
                }
                describeLogGroupsRequest.NextToken = describeLogGroupsResponse.NextToken;
            } while(describeLogGroupsRequest.NextToken != null);
            if ((deletedLogGroups > 0) || (skippedLogGroups > 0))
            {
                Console.WriteLine();
            }
            Console.WriteLine($"Found {totalLogGroups:N0} log groups. Deleted {deletedLogGroups:N0}. Skipped {skippedLogGroups:N0}.");
        }