使用 ElasticSearch 进行索引存储的 AWS Elastisearch CodeBuild 集成测试与 Hibernate 搜索的访问策略

AWS Elastisearch Access Policy for CodeBuild Integration Tests with Hibernate Search using a ElasticSearch for indexes storage

我想启动一个 CodeBuild 项目来 运行 我的集成测试。我的应用程序使用 AWS ElasticSearch Service 作为 Hibernate Search 索引存储。

我已将策略添加到我的 ES 域,允许私有 ec2 实例通过 NAT 网关访问 ES。不幸的是,我想不出允许 CodeBuild 访问 ES 的正确策略。当我 运行 CodeBuild 项目时,Hibernate 尝试检查索引是否存在时出现 403 错误。

Caused by: org.hibernate.search.exception.SearchException:   HSEARCH400007: Elasticsearch request failed.
Request:
Operation: IndicesExists
URI:com.mycompany.myproject.model.tenant
Data:
null
Response:
=========
Status: 403
Error message: 403 Forbidden
Cluster name: null
Cluster status: null 

我尝试配置 ES 访问策略以允许对域的开放访问,然后测试 运行 正常("AWS":“*”)。

这是 ES 访问策略

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
          "AWS": "arn:aws:iam::AWS_ACCOUNT_ID:role/CodeBuildRole-XXXXXXXX"
      },
      "Action": "es:*",
      "Resource": "arn:aws:es:eu-west-1:AWS_ACOUNT_ID:domain/elastic-search-domain/*"      
  },
  {
    "Effect": "Allow",
    "Principal": {
       "AWS": "*"
    },
    "Action": "es:*",
    "Resource": "arn:aws:es:eu-west-1:AWS_ACCOUNT_ID:domain/elastic-search-domain/*",
    "Condition": {
      "IpAddress": {
        "aws:SourceIp": "NAT_GW_IP"
      }
     }
   }
  ]
 }

作为校长,我还尝试了以下方法:

"arn:aws:sts::AWS_ACCOUNT_ID:assumed-role/CodeBuildRole-XXXXXXXXX/*" "arn:aws:iam::AWS_ACCOUNT_ID:role/CodeBuildRole-XXXXXXXXX" "arn:aws:iam::AWS_ACCOUNT_ID:root" "arn:aws:iam::AWS_ACCOUNT_ID:user/MI_USER_ADMIN"

任何帮助将不胜感激。

谢谢

可能您需要签署您的 ES 请求。

我不熟悉CodeBuild,但一般规则是:当使用IAM角色访问Elasticsearch时,您的请求需要使用该IAM角色进行签名。

例如对于 python,您将使用这样的工具:https://github.com/DavidMuller/aws-requests-auth

更多信息:http://docs.aws.amazon.com/general/latest/gr/signing_aws_api_requests.html

我想扩展 VME 答案以使其更精确。

要使用角色访问 ElasticSearch,必须对请求进行签名。

这个解决方案通常是正确的,但在我的特定情况下,这是不合适的,因为对 AWS ES 的请求是由 Hibernate Search ElasticSearch 生成的。 (我们可以找到另一个使用 AOP 的解决方案吗?)

我终于找到了解决这个问题的方法。在 CodeBuild 构建规范中,我添加了以下步骤:

  • 使用具有允许他读取和更新 ES 域的策略的用户配置 AWS CLI。
  • 读取并存储当前的 ES 域访问策略
  • 我得到了 CodeBuild ec2 IP
  • 更新 ES 域策略访问以允许从 CodeBuild IP 访问
  • 等到更改应用(大约 15 分钟)
  • 运行 测试
  • 恢复之前的配置

我不太喜欢这个解决方案,因为域策略更新时间太长。此步骤是用于持续集成的 CodePipeline 的一部分,执行时间不应超过 15 或 20 分钟。

有什么改进方法吗?