Como soluciono problemas com o CloudWatch Logs para que ele faça uma transmissão para o meu domínio do Amazon OpenSearch Service?

Data da última atualização: 13/12/2022

Não consigo fazer streaming do Amazon CloudWatch Logs para meu domínio do Amazon OpenSearch Service. Como posso solucionar esse problema?

Resolução

Não consigo fazer uma transmissão de vários grupos de logs do CloudWatch para o mesmo domínio do OpenSearch Service

Por padrão, o Amazon CloudWatch cria apenas uma função do AWS Lambda para cada domínio do OpenSearch Service. Se você configurar vários grupos de log para indexar dados no seu domínio, todos os diversos grupos de logs invocarão a mesma função Lambda. Quando o primeiro grupo de logs invoca uma função do Lambda, a chamada cria um índice e um campo de tipo no seu domínio.

Os índices criados no Amazon OpenSearch Service 6.0.0 ou versão posterior podem conter somente um único tipo de mapeamento. Os índices criados no 5.x com vários tipos de mapeamento continuam funcionando como antes no OpenSearch Service 6.x. Para obter mais informações sobre a descontinuação dos tipos de mapeamento do OpenSearch Service, consulte Removal of mapping types (Remoção de tipos de mapeamento) no site do Elastic.

Quando outros grupos de logs tentam invocar a mesma função do Lambda, a invocação falha com a seguinte mensagem de erro:

“reason”: “Rejecting mapping update to [ ] as the final mapping would have more than 1 type: [log-group-1, log-group-2]” (“Rejeitar a atualização do mapeamento para [ ], pois o mapeamento final teria mais de 1 tipo: [log-group-1, log-group-2]”)

Para solucionar esse problema, atualize a sua função do Lambda com a seguinte sintaxe:

var indexName = [
     'cwl-' + payload.logGroup.toLowerCase().split('/').join('-') + '-' + timestamp.getUTCFullYear(),
     ('0' + (timestamp.getUTCMonth() + 1)).slice(-2),
     ('0' + timestamp.getUTCDate()).slice(-2) 
     ].join('.');

Essa sintaxe cria vários índices para os diferentes grupos de logs que estão sendo transmitidos para o seu domínio do OpenSearch Service.

Em seguida, salve a função Lambda atualizada para criar índices separados para os diversos grupos de logs que estão sendo transmitidos para o seu domínio.

Não consigo fazer uma transmissão para um domínio do OpenSearch Service baseado em uma VPC na mesma conta da AWS

Importante: antes de fazer uma transmissão dos grupos de logs do CloudWatch para o domínio do OpenSearch Service baseado em uma VPC, atualize a sua política da função do AWS Identity and Access Management (IAM). A função do IAM anexada à função Lambda correspondente deve ter a política AWSLambdaVPCAccessExecutionRole anexada a ela.

Aqui está uma política AWSLambdaVPCAccessExecutionRole no formato JSON:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "logs:CreateLogGroup",
        "logs:CreateLogStream",
        "logs:PutLogEvents",
        "ec2:CreateNetworkInterface",
        "ec2:DescribeNetworkInterfaces",
        "ec2:DeleteNetworkInterface"
      ],
      "Resource": "*"
    }
  ]
}

Observação: essa política gerenciada permite que a função Lambda grave o grupo de logs do CloudWatch no seu cluster na VPC.

Depois de anexar a política à sua função Lambda, você poderá começar a fazer uma transmissão dos logs para o domínio do OpenSearch Service na VPC.

Não consigo fazer uma transmissão do meu grupo de logs do CloudWatch para um domínio do OpenSearch Service quando o controle de acesso refinado está habilitado

Se você fizer uma transmissão do seu CloudWatch Logs para um domínio do OpenSearch Service com controle de acesso refinado, poderá receber o seguinte erro de permissões:

"{\"statusCode\":403,\"responseBody\":{\"error\":{\"root_cause\":[{\"type\":\"security_exception\",\"reason\":\"no permissions for [indices:data/write/bulk] and User [name=arn:aws:iam::123456789101:role/lambda_opensearch_execution, roles=[arn:aws:iam::123456789101:role/lambda_opensearch_execution], requestedTenant=null]\"}],\"type\":\"security_exception\",\"reason\":\"no permissions for [indices:data/write/bulk] and User [name=arn:aws:iam::123456789101:role/lambda_opensearch_execution, roles=[arn:aws:iam::123456789101:role/lambda_opensearch_execution], requestedTenant=null]\"},\"status\":403}}"

Se você receber essa mensagem de erro dos logs da função do Lambda, o mapeamento de funções estará incompleto.

Observação: por padrão, o OpenSearch Service cria uma função do AWS Lambda para você.

Domínios do OpenSearch Service executando 7.9 e posterior (incluindo o OpenSearch versão 1.x)

Para solucionar a mensagem de erro, execute as seguintes etapas:

1.    Abra o OpenSearch Dashboards. Você pode encontrar um link para o OpenSearch Dashboards no resumo do domínio do seu console do OpenSearch Service.

2.    No painel de navegação, escolha Segurança.

3.    Escolha Funções.

4.    Escolha a funçãoall_access.

5.    Escolha a guiaUsuários mapeados.

6.    Na página de diálogoUsuários mapeados, escolha Gerenciar mapeamento.

7.    EmFunções de back-end, insira o ARN da função de execução da função do Lambda.

8.    EscolhaMapa. Os seus logs agora devem ser transmitidos para o seu domínio do OpenSearch Service.

Para obter mais informações sobre o mapeamento de funções, consulte Mapear funções em usuários.

Domínios do OpenSearch Service executando a versão 7.8 e anteriores

Para solucionar a mensagem de erro, execute as seguintes etapas:

1.    Abra o OpenSearch Dashboards. Você pode encontrar um link para o OpenSearch Dashboards no resumo do domínio do seu console do OpenSearch Service.

2.    No painel de navegação esquerdo, escolha o ícone de cadeado.

3.    Selecione Role mappings (Mapeamentos de funções).

4.    Escolha all_access e security_manager como as suas funções.

Observação: a função all_access só fornece acesso ao seu cluster. Com base no seu caso de uso, você também pode adicionar controle de acesso refinado ao seu cluster.

5.    Edite o mapeamento para all_access.

6.    Em Backend Role (Função de backend), adicione a função de execução da função Lambda e escolha Send (Enviar). Os seus logs agora devem ser transmitidos para o seu domínio do OpenSearch Service.

Os meus logs do CloudWatch não estão sendo entregues ao meu domínio do OpenSearch Service

Quando você faz uma transmissão dos logs do CloudWatch (usando a função padrão do AWS Lambda) para o domínio do OpenSearch Service, pode receber o seguinte erro de indexação:

"errorMessage": "{\"statusCode\":200,\"responseBody\":{\"took\":42,\"errors\":true}}",

Observação: por padrão, os erros do AWS Lambda são retornados como respostas de 200 OK.

Para solucionar essa mensagem de erro, execute as seguintes etapas:

1.    Abra a função do AWS Lambda padrão.

2.    Encontre a seguinte linha de código:

"var logFailedResponses = false;"

3.    Atualize o valor var logFailedResponses como “true” (verdadeiro). Essa atualização fornece informações adicionais para quaisquer novas solicitações de indexação usando a função do AWS Lambda. É possível usar as informações adicionais para identificar a causa do seu problema de indexação.

Estou recebendo um erro cluster_block_exception

As exceções de bloco de clusters ocorrem pelo seguinte:

  • Falta de espaço de armazenamento gratuito
  • Pressão excessiva de memória JVM

Para obter mais informações sobre como solucionar problemas de exceções de bloco de clusters, consulte ClusterBlockException.

Meu filtro de assinatura do CloudWatch falha ao enviar dados para meu cluster por meio de uma função padrão do Lambda (OpenSearch Service 2.0 e versões posteriores)

Você poderá receber um erro se tiver um filtro de assinatura do CloudWatch para enviar logs para o Amazon OpenSearch Service 2.x usando a função padrão do Lambda. Se o filtro de assinatura não ingerirem os logs e você vir o seguinte erro, é porque o erro foi causado por um parâmetro desativado:

"{\"statusCode\":400,\"responseBody\":{\"error\":{\"root_cause\":[{\"type\":\"illegal_argument_exception\",\"reason\":\"Action/metadata line [1] contains an unknown parameter [_type]\"}],\"type\":\"illegal_argument_exception\",\"reason\":\"Action/metadata line [1] contains an unknown parameter [_type]\"},\"status\":400}}"

Nas versões 2.0 e posteriores do OpenSearch Service, o parâmetro _type foi removido dos endpoints da API. Para resolver esse erro, você também deve remover o parâmetro do código da sua função do Lambda.

1.    Abra o console do AWS Lambda.

2.    Selecione a função padrão do Lambda para seu filtro de assinatura.

3.    Veja o código da sua função em Code source (Origem do código).

4.    Encontre a função de transform (transformação) que está definida no código. Nessa função, os dados são convertidos no formato de indexação JSON para o OpenSearch Service. As primeiras linhas desse código são semelhantes às seguintes:

function transform(payload) {
    if (payload.messageType === 'CONTROL_MESSAGE') {
        return null;
    }

    var bulkRequestBody = '';

    payload.logEvents.forEach(function(logEvent) {
                var timestamp = new Date(1 * logEvent.timestamp);

5.    Na função de transform (transformação), localize o parâmetro _type. Na maioria dos casos, ele estará na linha 79. Remova ou comente a linha de código que adiciona o parâmetro _type. Após a remoção, seu código será semelhante ao seguinte:

var action = {
    "index": {}
};
action.index._index = indexName;
//action.index._type = payload.logGroup;
action.index._id = logEvent.id;

bulkRequestBody += [

Agora você pode enviar solicitações de indexação com sucesso.


Este artigo ajudou?


Precisa de ajuda com faturamento ou suporte técnico?