Elasticsearch 액세스 문제 해결
GitLab v19.5Offering: GitLab Self-Managed, GitLab Dedicated
요약
Elasticsearch 액세스로 작업할 때 다음과 같은 문제가 발생할 수 있습니다. Rails 콘솔 세션 시작을 참고합니다. 사용 가능한 모든 속성을 조회하려면 다음 단계를 따릅니다. 출력에는 elasticsearch_indexing, elasticsearch_url, elasticsearch_replicas, elasticsearch_pause_indexing 등 Elasticsearch 통합에서 사용 가능한 모든 설정이 포함됩니다.
Elasticsearch 액세스로 작업할 때 다음과 같은 문제가 발생할 수 있습니다.
Rails 콘솔에서 설정 구성#
Rails 콘솔 세션 시작을 참고합니다.
속성 목록 조회#
사용 가능한 모든 속성을 조회하려면 다음 단계를 따릅니다.
- Rails 콘솔을 엽니다(
sudo gitlab-rails console). - 다음 명령을 실행합니다.
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 통합 문제를 식별하는 데 가장 유용한 도구 중 하나는 로그입니다. 이 통합과 가장 관련이 깊은 로그는 다음과 같습니다.
sidekiq.log- 모든 인덱싱이 Sidekiq에서 이뤄지므로, Elasticsearch 통합과 관련된 로그 대부분을 이 파일에서 확인할 수 있습니다.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로 설정해 비활성화합니다.