Untitled

 avatar
unknown
plain_text
2 years ago
4.7 kB
6
Indexable
using Amazon.Lambda.Core;
using Amazon.EC2;
using Amazon.EC2.Model;
using Amazon.CloudWatch;
using Amazon.CloudWatch.Model;
using System.Collections;

// Assembly attribute to enable the Lambda function's JSON input to be converted into a .NET class.
[assembly: LambdaSerializer(typeof(Amazon.Lambda.Serialization.SystemTextJson.DefaultLambdaJsonSerializer))]

namespace AwsShutDown;
public class LambdaFunction
{
    private readonly IAmazonEC2 _amazonEC2;
    private readonly IAmazonCloudWatch _amazonCloudWatch;
    public LambdaFunction()
    {
        _amazonEC2 = new AmazonEC2Client();
        _amazonCloudWatch = new AmazonCloudWatchClient();
    }


    public static class Globals
    {
        public static awsinstances = new List<string>();

        //List<string> awsinstances = new List<string>(); 
    }

    public string FunctionStarter(string input, ILambdaContext context)
    {

        List<string> awsinstances = new List<string>();

        var awsinstances2 = new List<string>();

        /// StopInstances("i-0ba48b5640b66b3ce");

        /// var output = DescribeAlarms();

        /// LambdaLogger.Log(string.Concat(output.Result.Select(x => x.AlarmName)));

        DescribeInstances();


        return "Done";
    }
    public async Task StopInstances(string ec2InstanceId)
    {
        var request = new StopInstancesRequest
        {
            InstanceIds = new List<string> { ec2InstanceId },
        };

        var response = await _amazonEC2.StopInstancesAsync(request);

        if (response.StoppingInstances.Count > 0)
        {
            var instances = response.StoppingInstances;
            instances.ForEach(i =>
            {
                LambdaLogger.Log($"Successfully stopped the EC2 Instance " +
                                  $"with InstanceID: {i.InstanceId}.");
            });
        }
    }

    /// <summary>
    /// Describe the current alarms, optionally filtered by state.
    /// </summary>
    /// <param name="stateValue">Optional filter for alarm state.</param>
    /// <returns>The list of alarm data.</returns>
    public async Task<List<MetricAlarm>> DescribeAlarms(StateValue? stateValue = null)
    {
        List<MetricAlarm> alarms = new List<MetricAlarm>();
        var paginatedDescribeAlarms = _amazonCloudWatch.Paginators.DescribeAlarms(
            new DescribeAlarmsRequest()
            {
                StateValue = stateValue
            });

        await foreach (var data in paginatedDescribeAlarms.MetricAlarms)
        {
            alarms.Add(data);
        }
        return alarms;
    }










    /// <summary>
    /// Get information about existing EC2 images.
    /// </summary>
    /// <returns>Async task.</returns>
    public async Task DescribeInstances()
    {
        string tagName = "Environment";
        string tagValue = "orc01";
        await GetInstanceDescriptionsFiltered(tagName, tagValue);
    }

    /// <summary>
    /// Get information about EC2 instances filtered by a tag name and value.
    /// </summary>
    /// <param name="tagName">The name of the tag to filter on.</param>
    /// <param name="tagValue">The value of the tag to look for.</param>
    /// <returns>Async task.</returns>
    public async Task GetInstanceDescriptionsFiltered(string tagName, string tagValue)
    {
        // This tag filters the results of the instance list.
        var filters = new List<Filter>
        {
            new Filter
            {
                Name = $"tag:{tagName}",
                Values = new List<string>
                {
                    tagValue,
                },
            },
        };
        var request = new DescribeInstancesRequest
        {
            Filters = filters,
        };

        Console.WriteLine("\nShowing instances with tag: \"IncludeInList\" set to \"Yes\".");
        var paginator = _amazonEC2.Paginators.DescribeInstances(request);

        await foreach (var response in paginator.Responses)
        {
            foreach (var reservation in response.Reservations)
            {
                foreach (var instance in reservation.Instances)
                {
                    Console.Write($"Instance ID: {instance.InstanceId} ");
                    Console.WriteLine($"\tCurrent State: {instance.State.Name}");
                    LambdaLogger.Log(instance.InstanceId);
                    LambdaLogger.Log(instance.State.Name);

                    names.Add(instance.InstanceId);
                }
            }
        }
    }

}
Editor is loading...