【问题标题】:CakePHP 4, AWS Elasticsearch 7 - The security token included in the request is invalidCakePHP 4、AWS Elasticsearch 7 - 请求中包含的安全令牌无效
【发布时间】:2021-09-07 10:46:17
【问题描述】:

所以我在 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 添加了 1 条索引记录。所以我知道 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 Forbidden 响应:{“消息”:“安全令牌 请求中包含的内容无效。"} Elastica\Exception\Connection\GuzzleException

似乎插件出于某种原因两次添加了“索引”名称。我到处寻找我可能错过的环境。如果我复制并粘贴上面的 URL 并在浏览器中从 URL 中删除重复的索引,它就可以正常工作。

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

我错过了什么吗?

我什至尝试过这种方法,但在 url 中重复索引值时遇到了同样的问题。

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

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

【问题讨论】:

    标签: php amazon-web-services elasticsearch cakephp elastica


    【解决方案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 版本所支持的内容而言,这是否是正确的路径,这可能是另一个问题。

    您可能想通过at GitHub 提出问题。

    【讨论】:

    • 是的,我认为您的观点是,该插件可能不支持 ES 7.x,因为自 ES 7.x 以来,索引“类型”已被弃用。 elastic.co/guide/en/elasticsearch/reference/current/… 我根本没有指定 URL 结构,插件会处理。
    • @Skobbejak 路径由ruflin/elasticaAFAICT 生成。 ES 7.x 尚不支持,但根据版本映射,它将出现在即将发布的 4.x 版本的插件中。如果您喜欢冒险,请尝试插件的dev-master
    猜你喜欢
    • 2018-04-09
    • 1970-01-01
    • 2021-11-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-24
    • 1970-01-01
    • 2016-12-12
    相关资源
    最近更新 更多