AWS ElasticSearch Logstash 403禁止访问

时间:2020-04-08 03:01:36

标签: amazon-web-services elasticsearch logstash

MySQL和elasticsearch托管在aws上。 Logstash在ec2上运行。我没有使用VPC。我可以在本地或ec2上连接到MySQL。

稍微修改一下问题。这是我的ec2中的新logstash文件。 我的es2实例未通过SSL认证,这是一个问题吗?

input {
    jdbc {
        jdbc_connection_string => "jdbc:mysql://aws.xxxxx.us-east-1.rds.amazonaws.com:3306/stuffed?user=admin&password=pword"
        jdbc_user => "admin"
        jdbc_password => "pword"
        schedule => "* * * * *"
        jdbc_validate_connection => true
        jdbc_driver_library => "mysql-connector-java-8.0.19.jar"
        jdbc_driver_class => "com.mysql.cj.jdbc.Driver"
        statement => "SELECT * from foo"
        type => "foo"
        tags => ["foo"]
    }

    jdbc {
        jdbc_connection_string => "jdbc:mysql://aws.xxxxx.us-east-1.rds.amazonaws.com:3306/stuffed?user=admin&password=pword"
        jdbc_user => "admin"
        jdbc_password => "pword"
        schedule => "* * * * *"
        jdbc_validate_connection => true
        jdbc_driver_library => "mysql-connector-java-8.0.19.jar"
        jdbc_driver_class => "com.mysql.cj.jdbc.Driver"
        statement => "SELECT * from cat"
        type => "cat"
        tags => ["cat"]
    }

    jdbc {
        jdbc_connection_string => "jdbc:mysql://aws.xxxxx.us-east-1.rds.amazonaws.com:3306/stuffed?user=admin&password=pword"
        jdbc_user => "admin"
        jdbc_password => "pword"
        schedule => "* * * * *"
        jdbc_validate_connection => true
        jdbc_driver_library => "mysql-connector-java-8.0.19.jar"
        jdbc_driver_class => "com.mysql.cj.jdbc.Driver"
        statement => "SELECT * from rest"
        type => "rest"
        tags => ["rest"]
    }
}
output {
    stdout { codec => json_lines }

    if "foo" in [tags] {
        amazon_es {
            hosts => ["https://es1.stuffed-es-mysql.us-east-1.es.amazonaws.com"]
            index => "foo"
            region => "us-east-1"
        aws_access_key_id => "id"
        aws_secret_access_key => "key"
            document_type => "foo-%{+YYYY.MM.dd}"
        }
    }

    if "cat" in [tags] {
        amazon_es {
            hosts => ["https://es1.stuffed-es-mysql.us-east-1.es.amazonaws.com"]
            index => "cat"
            region => "us-east-1"
        aws_access_key_id => "id"
        aws_secret_access_key => "key"
            document_type => "cat-%{+YYYY.MM.dd}"
        }
    }

    if "rest" in [tags] {
        amazon_es {
            hosts => ["https://es1.stuffed-es-mysql.us-east-1.es.amazonaws.com"]
            index => "rest"
            region => "us-east-1"
        aws_access_key_id => "id"
        aws_secret_access_key => "key"            
        document_type => "rest-%{+YYYY.MM.dd}"
        }
    }
}

现在我遇到的问题是403禁止的错误。

我确实在AWS中创建了具有AmazonESFullAccess(AWS托管策略)权限的用户。我不知道还能做什么。我没有使用VPC,而是想避免这种情况。因此,我想坚持使用公共访问权限。

我尝试根据以下指南创建新的ElasticSearch服务:https://docs.aws.amazon.com/elasticsearch-service/latest/developerguide/es-gsg.html

但我收到错误消息error_type=>LogStash::Outputs::ElasticSearch::HttpClient::Pool::HostUnreachableError, :error=>"Elasticsearch Unreachable: [https://user:xxxxxx@mysql-abcdefghijkl.us-east-1.es.amazonaws.com:9200/]

,此实例的logstash输出为:

elasticsearch {
        hosts => ["https://es-mysql.us-east-1.es.amazonaws.com/"]
        index => "category"
        user => "user"
        password => "password"
        document_type => "cat-%{+YYYY.MM.dd}"
    }

显然,这不是首选方法,但是我实际上只是在尝试设置开发人员/个人环境。

此外,我可以使用此实例登录Kibana。

访问政策

对于第一个弹性搜索服务:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::111111111:user/root"
      },
      "Action": "es:*",
      "Resource": "arn:aws:es:us-east-1:11111111:domain/stuffed-es-mysql/*"
    },
    {
      "Effect": "Allow",
      "Principal": {
        "AWS": "*"
      },
      "Action": "es:*",
      "Resource": "arn:aws:es:us-east-1:166216189490:domain/stuffed-es-mysql/*",
      "Condition": {
        "IpAddress": {
          "aws:SourceIp": [
            "11.11.11.111",
            "111.111.1.111",
            "111.111.1.1",
            "1.11.111.111",
          ]
        }
      }
    }
  ]
}

对于我创建的第二个ElasticSearch服务:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "AWS": "*"
      },
      "Action": "es:*",
      "Resource": "arn:aws:es:us-east-1:xxxxxxxxx:domain/es-mysql/*"
    }
  ]
}

1 个答案:

答案 0 :(得分:1)

所以我解决了两个问题。

问题一::我的Logstash输入到RDS的连接仍然有问题(这不是发布的问题,但我认为我还是应该共享):

问题

RDS MySQL实例版本错误。 AWS(5.7)将其设置为推荐值,我需要最新的8.0。*。这导致jdbc无法正常工作。

解决方案

将RDS MySQL实例更新为8.0.17。现在,我的logstash能够从MySQL RDS读取输入。

问题二:我的logstash的输出不起作用。

问题

收到403禁止的错误。

解决方案

在设置ES服务时删除了https要求。这很可能对我有用,因为我的ec2未通过ssl认证。

问题二的解决方案在我的帖子中曾受到质疑。而且,对于ec2和elasticsearch服务(AWS)上的logstash设置是新手,我并没有本能。但是,在设置ES服务时,我删除了https要求。是的,不是最好的主意,但这是一个开发环境。这解决了问题。为什么?因为我的ec2服务未通过ssl认证。这很有道理。出现403错误的常见问题之一是因为源正在向SSL认证的目标发送请求。

我认为这对于那些想要在预算上运行某些东西的人来说是一个普遍的问题,但它却被忽略了。大多数人都想跳到您的访问策略,IP策略或安全组,这是可以理解的。