CakePHP 4, AWS Elasticsearch 7 — Маркер безопасности, указанный в запросе, недействителен

#php #amazon-web-services #elasticsearch #cakephp #elastica

Вопрос:

Итак, я запускаю CakePHP 4 на экземпляре EC2, AWS ES 7, и я настроил плагин ElasticSearch в CakePHP.

 composer require cakephp/elastic-search "^3.0"
 

Я добавил эластичное подключение к источнику данных в config/app.php

 'elastic' => [
            'className' => 'CakeElasticSearchDatasourceConnection',
            'driver' => 'CakeElasticSearchDatasourceConnection',
            'host' => 'search-DOMAIN.REGION.es.amazonaws.com',
            'port' => 443,
            'transport' => "AwsAuthV4",
            'aws_access_key_id' => "KEY",
            'aws_secret_access_key' => "SECRET",
            'aws_region' => "REGION",
            'ssl' => 'true',
        ],
 

.. и я активировал плагин

 use CakeElasticSearchPlugin as ElasticSearchPlugin;

class Application extends BaseApplication
{
    public function bootstrap()
    {
        $this->addPlugin(ElasticSearchPlugin::class);
 

Я вручную добавил 1 запись индекса в ES через curl из экземпляра EC2. Так что я знаю, что связь между EC2 и ES работает.

 curl -XPUT -u 'KEY:SECRET' 'https://search-DOMAIN.REGION.es.amazonaws.com/movies?pretty' -d '{"director": "Burton, Tim", "genre": ["Comedy","Sci-Fi"], "year": 1996, "actor": ["Jack Nicholson","Pierce Brosnan","Sarah Jessica Parker"], "title": "Mars Attacks!"}' -H 'Content-Type: application/json'
 

Мне также удалось найти эту запись через curl без каких-либо проблем.

В AppController.php Я попробовал этот простой поиск, просто чтобы посмотреть, работает ли плагин, и ни за что на свете я не могу заставить его работать.

 # /src/Controller/AppController.php
...
use CakeElasticSearchIndexRegistry;

class AppController extends Controller
{

    public function initialize(): void
    {
        parent::initialize();

        $this->loadModel('movies', 'Elastic');
        $query = $this->movies->find('all');
        $results = $query->toArray();
 

Я получаю следующую ошибку:

Ошибка клиента: СООБЩЕНИЕ https://search-DOMAIN.REGION.es.amazonaws.com/movies/movies/_search в результате получен запрещенный ответ 403: {«сообщение»:»Маркер безопасности, включенный в запрос, недействителен».} Исключение ElasticaИсключениеСоединениеИсключение

Похоже, плагин по какой-то причине дважды добавляет имя «Индекс». Я повсюду искал обстановку, которую мог пропустить. Если я скопирую и вставлю указанный выше URL-адрес и удалю дубликат индекса из URL-адреса в браузере, он будет работать нормально.

 https://search-DOMAIN.REGION.es.amazonaws.com/movies/_search
 

Я что-то здесь упускаю?

Я даже пробовал этот метод, и у меня та же проблема с дублированными значениями индекса в URL-адресе.

 $Movies = IndexRegistry::get('movies');
$query = $Movies->find('all');
$results = $query->toArray();
 

Я попробовал новый/чистый экземпляр CakePHP, и у меня возникла та же проблема? Что — то не так с плагином? Есть ли лучший подход для общения с ES через CakePHP?

Ответ №1:

Я не знаком с плагином и Elasticsearch, но, насколько я понимаю, один из movies них — это имя индекса, а один из них — имя типа, где имя типа-по крайней мере, согласно документации-должно быть единственным, т. Е. Вместо этого ожидается, что путь будет выглядеть так:

 /movies/movie/_search
 

Кроме того, классы индексов предполагают, что сопоставление типов имеет единственное имя индекса. Например articles , индекс имеет сопоставление типов article .

https://book.cakephp.org/elasticsearch/3/en/3-0-upgrade-guide.html#types-renamed-to-indexes

Будет ли это правильным путем в отношении того, что поддерживается используемой версией Elasticsearch, это может быть другой вопрос.

Возможно, вы захотите открыть проблему на GitHub.

Комментарии:

1. Да, я думаю, вы поняли, что этот плагин может не поддерживать ES 7.x, так как «типы индексов» устарели с ES 7.x. elastic.co/guide/en/elasticsearch/reference/current/… Я вообще не указываю структуру URL-адреса, плагин обрабатывает это.

2. @Skobbejak Путь генерируется ruflin/elastica AFAICT. ES 7.x пока не поддерживается, но, согласно карте версий, она будет в предстоящей версии плагина 4.x. Если вы любите приключения, попробуйте dev-master этот плагин.