O blog da AWS

Gerenciamento e resiliência de logs do IIS utilizando Systems Manager, Cloudwatch e ElasticSearch

Por Caio Ribeiro César

Este blog faz referência ao post de 2017 criado por Pawan Puthran.

 

O IIS é um serviço da Microsoft para servidor Web (WWW) que auxilia as empresas a obter melhor desempenho, escalabilidade, confiabilidade e segurança para hospedar aplicações e sites. Quando operamos sites em larga escala, o monitoramento dos serviços são primordiais para garantia da alta disponibilidade.

Para que a alta disponibilidade exista, temos que verificar os logs para confimar que os serviços estão funcionando conforme o esperado. Qualquer mensagem prévia não vista é suspeita e precisa de atenção, seja ela de performance, pacotes descartados ou até logins fora do horário normal de trabalho.

Para sites e aplicativos hospedados no IIS, é importante monitorar logging para HttpErr e W3C. Os logs possuem uma entrada para cada solicitação em seu site; também podemos localizar entradas do HTTP.sys quando os pedidos incluem “rejects”, tais como:

HTTP 503 – Service Unavailable

HTTP 400 – Bad Request

Neste cenário, utilizamos a criação de um ambiente web IIS altamente disponível com a opção .NET do Beanstalk e High Availability.

Confirmar que o site está acessivel e validar que os logs de acessos foram criados*:

C:\inetpub\logs\LogFiles\W3SVC1

 

C:\Windows\System32\LogFiles\HTTPERR

*A maioria dos administradores alteram a localização padrão dos logs de IIS para que este espaço não seja alocado no disco do sistema operacional, altere a localização dos logs no arquivo JSON caso necessário.

Iremos utilizar o Systems Manager para configurar o agente de CloudWatch Logs nos servidores IIS, com a configuração de exportar os logs de IIS. Por padrão, o AWS Systems Manager não tem permissão para executar ações em suas instâncias EC2. Você deverá conceder acesso usando um perfil de instância do AWS Identity and Access Management (IAM).

Para este cenário, aplicamos as políticas CloudWatchAgentServerPolicy e AmazonSSMManagedInstanceCore.

Passo 1 – Configurando a integração do CloudWatch nas instâncias pelo Systems Manager State Manager

a.       Abra o console do AWS Systems Manager em https://console.aws.amazon.com/systems-manager/.

b.       No painel de navegação, selecionar Instances & Nodes, State Manager

c.       Selecionar a opção Create Association

d.       Adicionar um nome para a sua associação, escolha a opção “AWS-ConfigureCloudWatch”

 

e.       Para a opção de parâmetros, iremos adicionar o JSON abaixo:

{
"IsEnabled": true,
"EngineConfiguration": {
"PollInterval": "00:00:15",
"Components": [
{
"Id": "PerformanceCounter",
"FullName": "AWS.EC2.Windows.CloudWatch.PerformanceCounterComponent.PerformanceCounterInputComponent,AWS.EC2.Windows.CloudWatch",
"Parameters": {
"CategoryName": "Memory",
"CounterName": "Available MBytes",
"InstanceName": "",
"MetricName": "Memory",
"Unit": "Megabytes",
"DimensionName": "",
"DimensionValue": ""
}
},
{
"Id": "IISLogs",
"FullName": "AWS.EC2.Windows.CloudWatch.CustomLog.CustomLogInputComponent,AWS.EC2.Windows.CloudWatch",
"Parameters": {
	"LogDirectoryPath": "C:\\inetpub\\logs\\LogFiles\\W3SVC1",
	"TimestampFormat": "yyyy-MM-dd HH:mm:ss",
	"Encoding": "UTF-8",
	"Filter": "",
	"CultureName": "en-US",
	"TimeZoneKind": "UTC",
	"LineCount": "3"
			}
		},
{
"Id": "HttpErr",
"FullName": "AWS.EC2.Windows.CloudWatch.CustomLog.CustomLogInputComponent,AWS.EC2.Windows.CloudWatch",
"Parameters": {
	"LogDirectoryPath": "C:\\Windows\\System32\\LogFiles\\HTTPERR",
	"TimestampFormat": "yyyy-MM-dd HH:mm:ss",
	"Encoding": "UTF-8",
	"Filter": "",
	"CultureName": "en-US",
	"TimeZoneKind": "UTC",
	"LineCount": "3"
				}
			},
{
"Id": "IISCloudWatchLogs",
	"FullName": "AWS.EC2.Windows.CloudWatch.CloudWatchLogsOutput,AWS.EC2.Windows.CloudWatch",
	"Parameters": {
	"AccessKey": "",
	"SecretKey": "",
	"Region": "sa-east-1",
	"LogGroup": "WebServer",
	"LogStream": "{instance_id}-iis"
		}
},
{
"Id": "HttpErrCloudWatchLogs",
	"FullName": "AWS.EC2.Windows.CloudWatch.CloudWatchLogsOutput,AWS.EC2.Windows.CloudWatch",
	"Parameters": {
	"AccessKey": "",
	"SecretKey": "",
	"Region": "sa-east-1",
	"LogGroup": "WebServer",
	"LogStream": "{instance_id}-httpErr"
		}
},
{
"Id": "CloudWatch",
"FullName": "AWS.EC2.Windows.CloudWatch.CloudWatch.CloudWatchOutputComponent,AWS.EC2.Windows.CloudWatch",
"Parameters": 
{
"AccessKey": "",
"SecretKey": "",
"Region": "sa-east-1",
"NameSpace": "Windows/Default"
}
}
],
"Flows": {
"Flows": 
[
"PerformanceCounter,CloudWatch",
"IISLogs,IISCloudWatchLogs",
"HttpErr,HttpErrCloudWatchLogs"
]
}
}
}

 

f.       Adicionar as instâncias EC2 com IIS (a recomendação é a utilização de Tags para a gerência de instâncias).

g.       Crie uma agendamento para o intervalo de execução:

 

 

h.       Criar a associação.

i.       Selecionar a opção “Apply Association now”:

 

Após aproximadamente 30 minutos, os logs do IIS WebServer estarão disponíveis na console do CloudWatch, na opção “LogGroups”:

IIS logs

httperr

 

Passo 2 – Criar alertas com o CloudWatch

a.       Selecionar um HTTP Verb para criação do alerta. Para o exemplo deste post, a opção foi selecionado o HTTP 401:

b.       Na console do CloudWatch, selecionar o LogGroup “WebServer” , opção “Create Metric Filter”:

c.       Adicionar “401” como o filtro:

d.       Na tab “Alarms”, selecionar a opção “Create Alarm”:

e.       Selecionar a métrica criada anteriormente e escolher um período de tempo para o treshold:

 

f.       Configurar a ação para enviar um alarme utilizando o serviço de SNS:

g.       Criar o alarme. Após alguns minutos, um teste poderá ser feito para validar que os emails estão sendo recebidos após a identificação do alerta:

 

Passo 3 – Configurando o AWS ElasticSearch com captura de logs via CloudWatch

a.       Abra o Abra o console do CloudWatch em https://console.aws.amazon.com/cloudwatch/.

b.       No painel de navegação, selecionar Logs.

c.       Selecionar o grupo de logs do IIS.

d.       Escolha Actions (Ações), Stream to (Transmitir para) Amazon Elasticsearch Service.

e.       Caso você possua um Amazon Elasticsearch Cluster Configurado, pule para o passo ”i”. Caso você não possua um cluster, selecione a opção “Create a cluster”:

f.       Na tela de configuração do Amazon Elasticsearch, selecione a opção “Create a new domain”:

g.       Selecione o tipo de implementação e versão de serviço que serão utilizadas no ambiente. Para maiores informações, siga os passos deste artigo:

h.       Crie seu domínio com as opções de domain name, tamanho da instância, número de nodes, tipo de volume do disco e tamanho e utilize em uma VPC do seu ambiente. Abaixo, temos as informações do Elastisearch criado para o ambiente de teste:

i.       Voltando ao CloudWatch, na tela “Iniciar streaming para Amazon Elasticsearch Service”, selecione seu cluster do Amazon ES e em seguida, escolha Next (Próximo).

j.       Sob Função do Lambda, em Função de execução do Lambda para IAM, escolha a função do IAM que o Lambda devera usar ao executar chamadas para o Amazon ES e selecione Next (Próximo):

k.       Escolha Next (Próximo) e, em seguida, na tela Revisar e iniciar streaming para Amazon Elasticsearch Service, escolha Start Streaming (Iniciar streaming).

l.       Você podera acessar a interface do Kibana pela URL disponibilizada na criação do ElasticSearch:

Podemos então criar um dashboard customizado, no exemplo abaixo utilizei a criação de gráficos pré selecionados com as entradas do log (count):

HTTP 200 – WebSite Valid Hits.

HTTP 503 – Número de vezes que o site ficou fora do ar.

HTTP 401 – Visualização do número de hits dos logs.

Nesta imagem, temos o dashboard de HTTP Requests para o Website.

 

Conclusão

Neste post, discutimos como exportar os logs de IIS para o CloudWatch, utilizando ferramentas de gerenciamento do Systems Manager. Criamos também alertas customizados e um log streamer utilizando o serviço de ElasticSearch da AWS:

 


Sobre o autor

Caio Ribeiro Cesar atualmente trabalha como arquiteto de soluções especializadas em tecnologia da Microsoft na nuvem AWS. Ele iniciou sua carreira profissional como administrador de sistemas, que continuou por mais de 12 anos em áreas como Segurança da Informação, Identity Online e Plataformas de Email Corporativo. Recentemente, se tornou fã da computação em nuvem da AWS e auxilia os clientes a utilizar o poder da tecnologia da Microsoft na AWS.

 

 

Revisor

Enrico Bergamo é Arquiteto de Soluções especialista em Serverless na AWS para a América Latina, e atua auxiliando clientes de diversos segmentos em suas jornadas de modernização de aplicações na nuvem. Com mais de 10 anos de experiência em Arquitetura e Desenvolvimento de Sistemas, e DevOps, Enrico atuou diretamente com diversas empresas na definição, implementação, e implantação de diversas soluções corporativas.