InfoGrab DocsInfoGrab Docs

Elasticsearch 액세스 문제 해결

요약

Elasticsearch 액세스로 작업할 때 다음과 같은 문제가 발생할 수 있습니다. Rails 콘솔 세션 시작을 참고합니다. 사용 가능한 모든 속성을 조회하려면 다음 단계를 따릅니다. 출력에는 elasticsearch_indexing, elasticsearch_url, elasticsearch_replicas, elasticsearch_pause_indexing 등 Elasticsearch 통합에서 사용 가능한 모든 설정이 포함됩니다.

Elasticsearch 액세스로 작업할 때 다음과 같은 문제가 발생할 수 있습니다.

Rails 콘솔에서 설정 구성#

Rails 콘솔 세션 시작을 참고합니다.

속성 목록 조회#

사용 가능한 모든 속성을 조회하려면 다음 단계를 따릅니다.

  1. Rails 콘솔을 엽니다(sudo gitlab-rails console).
  2. 다음 명령을 실행합니다.
ApplicationSetting.last.attributes

출력에는 elasticsearch_indexing, elasticsearch_url, elasticsearch_replicas, elasticsearch_pause_indexing 등 Elasticsearch 통합에서 사용 가능한 모든 설정이 포함됩니다.

속성 설정#

Elasticsearch 통합 설정을 지정하려면 다음과 같은 명령을 실행합니다.

ApplicationSetting.last.update(elasticsearch_url: '<your ES URL and port>')

#or

ApplicationSetting.last.update(elasticsearch_indexing: false)

속성 조회#

Elasticsearch 통합 또는 Rails 콘솔에서 설정이 적용됐는지 확인하려면 다음과 같은 명령을 실행합니다.

Gitlab::CurrentSettings.elasticsearch_url

#or

Gitlab::CurrentSettings.elasticsearch_indexing

비밀번호 변경#

Elasticsearch 비밀번호를 변경하려면 다음 명령을 실행합니다.

es_url = Gitlab::CurrentSettings.current_application_settings

# Confirm the current Elasticsearch URL
es_url.elasticsearch_url

# Set the Elasticsearch URL
es_url.elasticsearch_url = "http://<username>:<password>@your.es.host:<port>"

# Save the change
es_url.save!

로그 확인#

Elasticsearch 통합 문제를 식별하는 데 가장 유용한 도구 중 하나는 로그입니다. 이 통합과 가장 관련이 깊은 로그는 다음과 같습니다.

  1. sidekiq.log - 모든 인덱싱이 Sidekiq에서 이뤄지므로, Elasticsearch 통합과 관련된 로그 대부분을 이 파일에서 확인할 수 있습니다.
  2. elasticsearch.log - Elasticsearch에 특화된 추가 로그가 이 파일로 전송되며, 검색, 인덱싱, 마이그레이션에 관한 진단 정보가 담겨 있을 수 있습니다.

흔히 발생하는 문제와 해결 방법은 다음과 같습니다.

GitLab 인스턴스가 Elasticsearch를 사용하는지 확인#

GitLab 인스턴스가 Elasticsearch를 사용하는지 확인하려면 다음을 따릅니다.

  • 검색을 수행할 때 검색 결과 페이지 우측 상단에 Advanced search is enabled가 표시되는지 확인합니다.

  • Admin 영역의 Settings > Search에서 고급 검색 설정이 선택되어 있는지 확인합니다.

    필요하면 동일한 설정을 Rails 콘솔에서도 확인할 수 있습니다.

    ::Gitlab::CurrentSettings.elasticsearch_search?         # Whether or not searches will use Elasticsearch
    ::Gitlab::CurrentSettings.elasticsearch_indexing?       # Whether or not content will be indexed in Elasticsearch
    ::Gitlab::CurrentSettings.elasticsearch_limit_indexing? # Whether or not Elasticsearch is limited only to certain projects/namespaces
    
  • Rails 콘솔에 접속해 다음 명령을 실행하여 검색이 Elasticsearch를 사용하는지 확인합니다.

    u = User.find_by_email('email_of_user_doing_search')
    s = SearchService.new(u, {:search => 'search_term'})
    pp s.search_objects.class
    

    마지막 명령의 출력이 핵심입니다. 다음과 같이 표시되면:

    • ActiveRecord::Relation 이면 Elasticsearch를 사용하지 않는 것입니다.
    • Kaminari::PaginatableArray 면 Elasticsearch를 사용하는 것입니다.
  • Elasticsearch가 특정 네임스페이스로 제한되어 있고 특정 프로젝트나 네임스페이스에서 Elasticsearch가 사용되는지 확인해야 한다면 Rails 콘솔을 사용할 수 있습니다.

    ::Gitlab::CurrentSettings.search_using_elasticsearch?(scope: Namespace.find_by_full_path("/my-namespace"))
    ::Gitlab::CurrentSettings.search_using_elasticsearch?(scope: Project.find_by_full_path("/my-namespace/my-project"))
    

Error: User: anonymous is not authorized to perform: es:ESHttpGet#

AWS OpenSearch 또는 Elasticsearch에서 도메인 수준 액세스 정책을 사용할 때 AWS 역할이 올바른 GitLab 노드에 할당되지 않는 경우입니다. GitLab Rails 및 Sidekiq 노드는 검색 클러스터와 통신할 권한이 필요합니다.

User: anonymous is not authorized to perform: es:ESHttpGet because no resource-based policy allows the es:ESHttpGet
action

이 문제를 해결하려면 AWS 역할이 올바른 GitLab 노드에 할당되어 있는지 확인합니다.

No valid region specified#

고급 검색에서 AWS 인증을 사용할 때는 지정하는 리전이 유효해야 합니다.

Error: no permissions for [indices:data/write/bulk]#

AWS OpenSearch Dashboards에서 생성한 IAM 역할이나 역할로 세분화된 액세스 제어를 사용할 때 다음과 같은 오류가 발생할 수 있습니다.

{
  "error": {
    "root_cause": [
      {
        "type": "security_exception",
        "reason": "no permissions for [indices:data/write/bulk] and User [name=arn:aws:iam::xxx:role/INSERT_ROLE_NAME_HERE, backend_roles=[arn:aws:iam::xxx:role/INSERT_ROLE_NAME_HERE], requestedTenant=null]"
      }
    ],
    "type": "security_exception",
    "reason": "no permissions for [indices:data/write/bulk] and User [name=arn:aws:iam::xxx:role/INSERT_ROLE_NAME_HERE, backend_roles=[arn:aws:iam::xxx:role/INSERT_ROLE_NAME_HERE], requestedTenant=null]"
  },
  "status": 403
}

이 문제를 해결하려면 AWS OpenSearch Dashboards에서 역할을 사용자에 매핑해야 합니다.

AWS OpenSearch Service에서 추가 마스터 사용자 생성#

도메인을 생성할 때 마스터 사용자를 설정할 수 있습니다. 이 사용자로 추가 마스터 사용자를 생성할 수 있습니다. 자세한 내용은 AWS 문서를 참고합니다.

권한이 있는 사용자와 역할을 생성하고 사용자를 역할에 매핑하려면 OpenSearch 문서를 참고합니다. 역할에는 다음 권한을 포함해야 합니다.

{
  "cluster_permissions": [
    "cluster_composite_ops",
    "cluster_monitor"
  ],
  "index_permissions": [
    {
      "index_patterns": [
        "gitlab*"
      ],
      "allowed_actions": [
        "data_access",
        "manage_aliases",
        "search",
        "create_index",
        "delete",
        "manage"
      ]
    },
    {
      "index_patterns": [
        "*"
      ],
      "allowed_actions": [
        "indices:admin/aliases/get",
        "indices:monitor/stats"
      ]
    }
  ]
}

열린 TCP 연결 누적#

GitLab 17.11 이상에서는 GitLab 프로세스에서 외부 서비스로의 열린 TCP 연결이 증가하는 현상이 나타날 수 있습니다. 이 연결은 시간이 지나며 누적되고 제대로 닫히지 않습니다.

이 문제는 GitLab의 연결 풀링에서 Faraday 어댑터가 net_http에서 typhoeus로 전환된 것과 관련이 있습니다. 자세한 내용은 이슈 550805를 참고합니다.

이 문제를 해결하려면 elasticsearch_client_adapter를 net_http로 설정합니다.

검색 클러스터가 OpenSearch 인데도 gitlab:elastic:info가 Elasticsearch로 보고하는 경우#

Amazon OpenSearch Service에서 호환 모드가 활성화된 경우, OpenSearch 클러스터는 모든 클라이언트에 버전을 7.10.2로, 배포판을 Elasticsearch로 보고합니다. gitlab:elastic:info를 실행하면 Server distribution 이 Elasticsearch와 해당 버전으로 표시됩니다. 호환 모드가 활성화되어 있는지 확인하려면 클러스터 설정을 직접 조회합니다.

curl --user "<username>:<password>" \
  "<opensearch_url>/_cluster/settings?include_defaults=true&pretty" \
  | grep -A2 override_main_response_version

compatibility.override_main_response_version 이 true 면, 클러스터는 OpenSearch를 실행 중이며 Elasticsearch 대상 클라이언트와의 호환성을 위해 자신의 정체를 숨기고 있는 것입니다. gitlab:elastic:info가 정확하게 보고하도록 하려면 호환 모드를 false로 설정해 비활성화합니다.

Elasticsearch 액세스 문제 해결

GitLab v19.5
Tier: Premium, Ultimate
Offering: GitLab Self-Managed, GitLab Dedicated
원문 보기

요약

Elasticsearch 액세스로 작업할 때 다음과 같은 문제가 발생할 수 있습니다. Rails 콘솔 세션 시작을 참고합니다. 사용 가능한 모든 속성을 조회하려면 다음 단계를 따릅니다. 출력에는 elasticsearch_indexing, elasticsearch_url, elasticsearch_replicas, elasticsearch_pause_indexing 등 Elasticsearch 통합에서 사용 가능한 모든 설정이 포함됩니다.

Elasticsearch 액세스로 작업할 때 다음과 같은 문제가 발생할 수 있습니다.

Rails 콘솔에서 설정 구성#

Rails 콘솔 세션 시작을 참고합니다.

속성 목록 조회#

사용 가능한 모든 속성을 조회하려면 다음 단계를 따릅니다.

  1. Rails 콘솔을 엽니다(sudo gitlab-rails console).
  2. 다음 명령을 실행합니다.
ApplicationSetting.last.attributes

출력에는 elasticsearch_indexing, elasticsearch_url, elasticsearch_replicas, elasticsearch_pause_indexing 등 Elasticsearch 통합에서 사용 가능한 모든 설정이 포함됩니다.

속성 설정#

Elasticsearch 통합 설정을 지정하려면 다음과 같은 명령을 실행합니다.

ApplicationSetting.last.update(elasticsearch_url: '<your ES URL and port>')

#or

ApplicationSetting.last.update(elasticsearch_indexing: false)

속성 조회#

Elasticsearch 통합 또는 Rails 콘솔에서 설정이 적용됐는지 확인하려면 다음과 같은 명령을 실행합니다.

Gitlab::CurrentSettings.elasticsearch_url

#or

Gitlab::CurrentSettings.elasticsearch_indexing

비밀번호 변경#

Elasticsearch 비밀번호를 변경하려면 다음 명령을 실행합니다.

es_url = Gitlab::CurrentSettings.current_application_settings

# Confirm the current Elasticsearch URL
es_url.elasticsearch_url

# Set the Elasticsearch URL
es_url.elasticsearch_url = "http://<username>:<password>@your.es.host:<port>"

# Save the change
es_url.save!

로그 확인#

Elasticsearch 통합 문제를 식별하는 데 가장 유용한 도구 중 하나는 로그입니다. 이 통합과 가장 관련이 깊은 로그는 다음과 같습니다.

  1. sidekiq.log - 모든 인덱싱이 Sidekiq에서 이뤄지므로, Elasticsearch 통합과 관련된 로그 대부분을 이 파일에서 확인할 수 있습니다.
  2. elasticsearch.log - Elasticsearch에 특화된 추가 로그가 이 파일로 전송되며, 검색, 인덱싱, 마이그레이션에 관한 진단 정보가 담겨 있을 수 있습니다.

흔히 발생하는 문제와 해결 방법은 다음과 같습니다.

GitLab 인스턴스가 Elasticsearch를 사용하는지 확인#

GitLab 인스턴스가 Elasticsearch를 사용하는지 확인하려면 다음을 따릅니다.

  • 검색을 수행할 때 검색 결과 페이지 우측 상단에 Advanced search is enabled가 표시되는지 확인합니다.

  • Admin 영역의 Settings > Search에서 고급 검색 설정이 선택되어 있는지 확인합니다.

    필요하면 동일한 설정을 Rails 콘솔에서도 확인할 수 있습니다.

    ::Gitlab::CurrentSettings.elasticsearch_search?         # Whether or not searches will use Elasticsearch
    ::Gitlab::CurrentSettings.elasticsearch_indexing?       # Whether or not content will be indexed in Elasticsearch
    ::Gitlab::CurrentSettings.elasticsearch_limit_indexing? # Whether or not Elasticsearch is limited only to certain projects/namespaces
    
  • Rails 콘솔에 접속해 다음 명령을 실행하여 검색이 Elasticsearch를 사용하는지 확인합니다.

    u = User.find_by_email('email_of_user_doing_search')
    s = SearchService.new(u, {:search => 'search_term'})
    pp s.search_objects.class
    

    마지막 명령의 출력이 핵심입니다. 다음과 같이 표시되면:

    • ActiveRecord::Relation 이면 Elasticsearch를 사용하지 않는 것입니다.
    • Kaminari::PaginatableArray 면 Elasticsearch를 사용하는 것입니다.
  • Elasticsearch가 특정 네임스페이스로 제한되어 있고 특정 프로젝트나 네임스페이스에서 Elasticsearch가 사용되는지 확인해야 한다면 Rails 콘솔을 사용할 수 있습니다.

    ::Gitlab::CurrentSettings.search_using_elasticsearch?(scope: Namespace.find_by_full_path("/my-namespace"))
    ::Gitlab::CurrentSettings.search_using_elasticsearch?(scope: Project.find_by_full_path("/my-namespace/my-project"))
    

Error: User: anonymous is not authorized to perform: es:ESHttpGet#

AWS OpenSearch 또는 Elasticsearch에서 도메인 수준 액세스 정책을 사용할 때 AWS 역할이 올바른 GitLab 노드에 할당되지 않는 경우입니다. GitLab Rails 및 Sidekiq 노드는 검색 클러스터와 통신할 권한이 필요합니다.

User: anonymous is not authorized to perform: es:ESHttpGet because no resource-based policy allows the es:ESHttpGet
action

이 문제를 해결하려면 AWS 역할이 올바른 GitLab 노드에 할당되어 있는지 확인합니다.

No valid region specified#

고급 검색에서 AWS 인증을 사용할 때는 지정하는 리전이 유효해야 합니다.

Error: no permissions for [indices:data/write/bulk]#

AWS OpenSearch Dashboards에서 생성한 IAM 역할이나 역할로 세분화된 액세스 제어를 사용할 때 다음과 같은 오류가 발생할 수 있습니다.

{
  "error": {
    "root_cause": [
      {
        "type": "security_exception",
        "reason": "no permissions for [indices:data/write/bulk] and User [name=arn:aws:iam::xxx:role/INSERT_ROLE_NAME_HERE, backend_roles=[arn:aws:iam::xxx:role/INSERT_ROLE_NAME_HERE], requestedTenant=null]"
      }
    ],
    "type": "security_exception",
    "reason": "no permissions for [indices:data/write/bulk] and User [name=arn:aws:iam::xxx:role/INSERT_ROLE_NAME_HERE, backend_roles=[arn:aws:iam::xxx:role/INSERT_ROLE_NAME_HERE], requestedTenant=null]"
  },
  "status": 403
}

이 문제를 해결하려면 AWS OpenSearch Dashboards에서 역할을 사용자에 매핑해야 합니다.

AWS OpenSearch Service에서 추가 마스터 사용자 생성#

도메인을 생성할 때 마스터 사용자를 설정할 수 있습니다. 이 사용자로 추가 마스터 사용자를 생성할 수 있습니다. 자세한 내용은 AWS 문서를 참고합니다.

권한이 있는 사용자와 역할을 생성하고 사용자를 역할에 매핑하려면 OpenSearch 문서를 참고합니다. 역할에는 다음 권한을 포함해야 합니다.

{
  "cluster_permissions": [
    "cluster_composite_ops",
    "cluster_monitor"
  ],
  "index_permissions": [
    {
      "index_patterns": [
        "gitlab*"
      ],
      "allowed_actions": [
        "data_access",
        "manage_aliases",
        "search",
        "create_index",
        "delete",
        "manage"
      ]
    },
    {
      "index_patterns": [
        "*"
      ],
      "allowed_actions": [
        "indices:admin/aliases/get",
        "indices:monitor/stats"
      ]
    }
  ]
}

열린 TCP 연결 누적#

GitLab 17.11 이상에서는 GitLab 프로세스에서 외부 서비스로의 열린 TCP 연결이 증가하는 현상이 나타날 수 있습니다. 이 연결은 시간이 지나며 누적되고 제대로 닫히지 않습니다.

이 문제는 GitLab의 연결 풀링에서 Faraday 어댑터가 net_http에서 typhoeus로 전환된 것과 관련이 있습니다. 자세한 내용은 이슈 550805를 참고합니다.

이 문제를 해결하려면 elasticsearch_client_adapter를 net_http로 설정합니다.

검색 클러스터가 OpenSearch 인데도 gitlab:elastic:info가 Elasticsearch로 보고하는 경우#

Amazon OpenSearch Service에서 호환 모드가 활성화된 경우, OpenSearch 클러스터는 모든 클라이언트에 버전을 7.10.2로, 배포판을 Elasticsearch로 보고합니다. gitlab:elastic:info를 실행하면 Server distribution 이 Elasticsearch와 해당 버전으로 표시됩니다. 호환 모드가 활성화되어 있는지 확인하려면 클러스터 설정을 직접 조회합니다.

curl --user "<username>:<password>" \
  "<opensearch_url>/_cluster/settings?include_defaults=true&pretty" \
  | grep -A2 override_main_response_version

compatibility.override_main_response_version 이 true 면, 클러스터는 OpenSearch를 실행 중이며 Elasticsearch 대상 클라이언트와의 호환성을 위해 자신의 정체를 숨기고 있는 것입니다. gitlab:elastic:info가 정확하게 보고하도록 하려면 호환 모드를 false로 설정해 비활성화합니다.