मैं Amazon Kinesis Data Firehose से Amazon Elasticsearch Service, लेकिन यह 503 Service Unavailable कहते हुए एक त्रुटि दर्ज कर रहा है। हालांकि, मैं Elasticsearch एंडपॉइंट (https://vpc-XXX.<region>.es.amazonaws.com) तक पहुंच सकता हूं और इस पर प्रश्न पूछ सकता हूं। मैंने मैं HTTP 503 सेवा अनुपलब्ध त्रुटियों को कैसे रोक सकता हूं, इसका भी अध्ययन किया। Amazon Elasticsearch Service में? और पुष्टि कर सकता हूं कि मेरे सेटअप में पर्याप्त संसाधन हैं।

यहाँ त्रुटि है जो मुझे मेरे S3 बैकअप बकेट में मिलती है जिसमें विफल लॉग होते हैं:

{
    "attemptsMade": 8,
    "arrivalTimestamp": 1599748282943,
    "errorCode": "ES.ServiceException",
    "errorMessage": "Error received from Elasticsearch cluster. <html><body><h1>503 Service Unavailable</h1>\nNo server is available to handle this request.\n</body></html>",
    "attemptEndingTimestamp": 1599748643460,
    "rawData": "eyJ0aWNrZXJfc3ltYm9sIjoiQUxZIiwic2VjdG9yIjoiRU5FUkdZIiwiY2hhbmdlIjotNi4zNSwicHJpY2UiOjg4LjgzfQ==",
    "subsequenceNumber": 0,
    "esDocumentId": "49610662085822146490768158474738345331794592496281976834.0",
    "esIndexName": "prometheus-2020-09",
    "esTypeName": ""
},

किसी के पास कोई विचार है कि इसे कैसे ठीक किया जाए और डेटा को Elasticsearch में अनुक्रमित किया जाए?

1
dayuloli 11 सितंबर 2020, 05:21

1 उत्तर

सबसे बढ़िया उत्तर

पता चला, मेरी समस्या गलत सुरक्षा समूह के चयन के साथ थी।


मैं उसी सुरक्षा समूह का उपयोग कर रहा था (मैंने इसे elasticsearch-${domain_name} नाम दिया था) जैसा कि इलास्टिक्स खोज उदाहरण से जुड़ा हुआ था (जिसने firehose_es सुरक्षा समूह से पोर्ट 443 से टीसीपी प्रवेश/निकास की अनुमति दी थी)। मुझे इसके बजाय firehose_es सुरक्षा समूह चुनना चाहिए था।

जैसा कि टिप्पणी में अनुरोध किया गया है, यहां firehose_es SG के लिए टेराफॉर्म कॉन्फ़िगरेशन दिया गया है।

resource "aws_security_group" "firehose_es" {
  name        = "firehose_es"
  description = "Firehose to send logs to Elasticsearch"
  vpc_id      = module.networking.aws_vpc_id
}

resource "aws_security_group_rule" "firehose_es_https_ingress" {
  type              = "ingress"
  from_port         = 443
  to_port           = 443
  protocol          = "tcp"
  security_group_id = aws_security_group.firehose_es.id
  cidr_blocks       = ["10.0.0.0/8"]
}

resource "aws_security_group_rule" "firehose_es_https_egress" {
  type                     = "egress"
  from_port                = 443
  to_port                  = 443
  protocol                 = "tcp"
  security_group_id        = aws_security_group.firehose_es.id
  source_security_group_id = aws_security_group.elasticsearch.id
}

एक और बात जो मैंने इस प्रश्न को पूछने से पहले तय की थी (यही कारण है कि आप में से कुछ लोग इस प्रश्न तक पहुंच रहे हैं) सही भूमिका का उपयोग करना और सही नीति को भूमिका से जोड़ना है। यहां मेरी भूमिका है (टेराफॉर्म कॉन्फ़िगरेशन के रूप में)

// https://docs.aws.amazon.com/firehose/latest/dev/controlling-access.html
data "aws_iam_policy_document" "firehose_es_policy_specific" {
  statement {
    actions = [
      "s3:AbortMultipartUpload",
      "s3:GetBucketLocation",
      "s3:GetObject",
      "s3:ListBucket",
      "s3:ListBucketMultipartUploads",
      "s3:PutObject"
    ]
    resources = [
      aws_s3_bucket.firehose.arn,
      "${aws_s3_bucket.firehose.arn}/*"
    ]
  }

  statement {
    actions = [
      "es:DescribeElasticsearchDomain",
      "es:DescribeElasticsearchDomains",
      "es:DescribeElasticsearchDomainConfig",
      "es:ESHttpPost",
      "es:ESHttpPut"
    ]

    resources = [
      var.elasticsearch_domain_arn,
      "${var.elasticsearch_domain_arn}/*",
    ]
  }

  statement {
    actions = [
      "es:ESHttpGet"
    ]

    resources = [
      "${var.elasticsearch_domain_arn}/_all/_settings",
      "${var.elasticsearch_domain_arn}/_cluster/stats",
      "${var.elasticsearch_domain_arn}/${var.name_prefix}${var.name}_${var.app}*/_mapping/type-name",
      "${var.elasticsearch_domain_arn}/_nodes",
      "${var.elasticsearch_domain_arn}/_nodes/stats",
      "${var.elasticsearch_domain_arn}/_nodes/*/stats",
      "${var.elasticsearch_domain_arn}/_stats",
      "${var.elasticsearch_domain_arn}/${var.name_prefix}${var.name}_${var.app}*/_stats"
    ]
  }

  statement {
    actions = [
      "ec2:DescribeVpcs",
      "ec2:DescribeVpcAttribute",
      "ec2:DescribeSubnets",
      "ec2:DescribeSecurityGroups",
      "ec2:DescribeNetworkInterfaces",
      "ec2:CreateNetworkInterface",
      "ec2:CreateNetworkInterfacePermission",
      "ec2:DeleteNetworkInterface",
    ]

    resources = [
      "*"
    ]
  }
}

resource "aws_kinesis_firehose_delivery_stream" "ecs" {
  name        = "${var.name_prefix}${var.name}_${var.app}"
  destination = "elasticsearch"

  s3_configuration {
    role_arn           = aws_iam_role.firehose_es.arn
    bucket_arn         = aws_s3_bucket.firehose.arn
    buffer_interval    = 60
    compression_format = "GZIP"
  }

  elasticsearch_configuration {
    domain_arn = var.elasticsearch_domain_arn
    role_arn   = aws_iam_role.firehose_es.arn

    # If Firehose cannot deliver to Elasticsearch, logs are sent to S3
    s3_backup_mode = "FailedDocumentsOnly"

    buffering_interval = 60
    buffering_size     = 5

    index_name            = "${var.name_prefix}${var.name}_${var.app}"
    index_rotation_period = "OneMonth"

    vpc_config {
      subnet_ids         = var.elasticsearch_subnet_ids
      security_group_ids = [var.firehose_security_group_id]
      role_arn           = aws_iam_role.firehose_es.arn
    }
  }
}

मैं Amazon Kinesis Data Firehose के साथ एक्सेस को नियंत्रित करना लेख फिर से।

0
dayuloli 29 सितंबर 2020, 12:00