CakePHP 4,AWS Elasticsearch 7 -请求中包含的安全令牌无效

9rnv2umw  于 2022-11-11  发布在  PHP
关注(0)|答案(1)|浏览(133)

因此,我在EC2示例AWS ES 7上运行CakePHP 4,并在CakePHP中设置了ElasticSearch插件。

composer require cakephp/elastic-search "^3.0"

我已经在config/app.php中添加了弹性数据源连接

'elastic' => [
            'className' => 'Cake\ElasticSearch\Datasource\Connection',
            'driver' => 'Cake\ElasticSearch\Datasource\Connection',
            '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 Cake\ElasticSearch\Plugin as ElasticSearchPlugin;

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

我已经通过curl从EC2示例手动添加了一条索引记录到ES中,所以我知道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 Cake\ElasticSearch\IndexRegistry;

class AppController extends Controller
{

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

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

我收到以下错误:
客户端错误:POST https://search-DOMAIN.REGION.es.amazonaws.com/movies/movies/_search导致403禁止响应:{“message”:“请求中包含的安全令牌无效。"} Elastica\异常\连接\GuzzleException
似乎插件添加了'索引'名称两次出于某种原因。我到处寻找一个设置,我可能已经错过了。如果我复制并粘贴上述网址,并删除重复的索引从网址在浏览器中,它的工作正常。

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

我是不是漏掉了什么?
我甚至尝试过这种方法,但在url中重复索引值时也遇到了同样的问题。

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

我尝试了一个新的/干净的CakePHP示例,还是遇到了同样的问题?插件有什么问题吗?有没有更好的方法通过CakePHP与ES通信?

rvpgvaaj

rvpgvaaj1#

我不熟悉插件和Elasticsearch,但据我所知,其中一个movies是索引名,其中一个是类型名,其中类型名-至少根据文档-应该是单数,即路径应该看起来像:

/movies/movie/_search

此外,Index类假设类型Map具有索引的单数名称,例如articles索引具有article的类型Map。

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

这是否是所使用的Elasticsearch版本所支持的正确路径,这可能是一个不同的问题。
您可能需要打开一个有关at GitHub的问题。

相关问题