Exemplo n.º 1
0
        private async Task SetShutdownTime(EC2InstanceStateChangeEvent cloudWatchEvent, ILambdaContext context)
        {
            Instance instance = await GetInstanceDetails(cloudWatchEvent.Detail.InstanceId, context);

            var tag = instance.Tags.FirstOrDefault(x => x.Key == "StopAfterMinutes");

            if (tag == null)
            {
                context.Logger.LogLine($"Instance {instance.InstanceId} does not have a 'StopAfterMinutes' tag. Ignoring");
                return;
            }

            if (!int.TryParse(tag.Value, out var minutes))
            {
                context.Logger.LogLine($"Instance {instance.InstanceId} has invalid time for 'StopAfterMinutes' tag. Ignoring");
                return;
            }

            SetInstanceShutdownDto shutdownDto = new SetInstanceShutdownDto {
                InstanceId = instance.InstanceId, StopAfterMinutes = minutes
            };
            string message = Newtonsoft.Json.JsonConvert.SerializeObject(shutdownDto);

            var snsTopic = GetSnsTopic();

            context.Logger.LogLine($"Publishing SetInstanceShutdown message to topic {snsTopic}. Message: {message}");

            PublishRequest request = new PublishRequest(snsTopic, message);
            await _snsClient.PublishAsync(request);

            context.Logger.LogLine($"Published!");
        }
Exemplo n.º 2
0
 private static void LogEvent(EC2InstanceStateChangeEvent cloudWatchEvent, ILambdaContext context)
 {
     context.Logger.LogLine($"Source: {cloudWatchEvent.Source}");
     context.Logger.LogLine($"Region: {cloudWatchEvent.Region}");
     context.Logger.LogLine($"DetailType: {cloudWatchEvent.DetailType}");
     context.Logger.LogLine($"InstanceId: {cloudWatchEvent.Detail.InstanceId}");
     context.Logger.LogLine($"State: {cloudWatchEvent.Detail.State}");
 }
Exemplo n.º 3
0
        private async Task UpdateRoute53Entry(EC2InstanceStateChangeEvent cloudWatchEvent,
                                              ILambdaContext context)
        {
            Instance instance = await GetInstanceDetails(cloudWatchEvent.Detail.InstanceId, context);

            if (instance != null)
            {
                HostedZone zone = await GetZone(instance, context);

                await UpdateRoute53(zone, instance, context);
            }
            else
            {
                context.Logger.LogLine($"**** InstanceId Not Found: {cloudWatchEvent.Detail.InstanceId}");
            }
        }
Exemplo n.º 4
0
        /// <summary>
        /// Instance is stopping
        ///
        /// Remove the route 53 entry for it.
        /// </summary>
        /// <param name="cloudWatchEvent"></param>
        /// <param name="context"></param>
        /// <returns></returns>
        private async Task RemoveRoute53Entry(EC2InstanceStateChangeEvent cloudWatchEvent,
                                              ILambdaContext context)
        {
            Instance instance = await GetInstanceDetails(cloudWatchEvent.Detail.InstanceId, context);

            if (instance != null)
            {
                HostedZone zone = await GetZone(instance, context);

                if (zone == null)
                {
                    return;
                }

                await DeleteRoute53RecordSet(zone, instance, context);
            }
        }
Exemplo n.º 5
0
        /// <summary>
        /// Lambda function handler. Triggered by CloudWatch EC2 instance state change.
        /// </summary>
        /// <param name="cloudWatchEvent"></param>
        /// <param name="context"></param>
        /// <returns></returns>
        public async Task FunctionHandler(EC2InstanceStateChangeEvent cloudWatchEvent, ILambdaContext context)
        {
            context.Logger.LogLine("EC2 State Change event triggered.");

            LogEvent(cloudWatchEvent, context);

            switch (cloudWatchEvent.Detail.State)
            {
            case "running":
                await SetShutdownTime(cloudWatchEvent, context);

                break;

            default:
                context.Logger.LogLine($"No action for state: {cloudWatchEvent.Detail.State}");
                break;
            }
        }
Exemplo n.º 6
0
        /// <summary>
        /// Lambda function handler.
        /// </summary>
        /// <param name="cloudWatchEvent"></param>
        /// <param name="context"></param>
        /// <returns></returns>
        public async Task FunctionHandler(EC2InstanceStateChangeEvent cloudWatchEvent, ILambdaContext context)
        {
            context.Logger.LogLine("EC2 State Change event triggered.");

            LogEvent(cloudWatchEvent, context);

            switch (cloudWatchEvent.Detail.State)
            {
            case "stopping":
                await RemoveRoute53Entry(cloudWatchEvent, context);

                break;

            case "running":
                await UpdateRoute53Entry(cloudWatchEvent, context);

                break;

            default:
                context.Logger.LogLine($"No action for state: {cloudWatchEvent.Detail.State}");
                break;
            }
        }