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!"); }
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}"); }
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}"); } }
/// <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); } }
/// <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; } }
/// <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; } }