3

我想启动一个 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"

任何帮助将不胜感激。

谢谢

4

2 回答 2

2

我想将 VME 的答案扩展得更精确。

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

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

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

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

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

关于如何改进这一点的任何想法?

于 2017-05-23T15:44:08.980 回答
1

可能你需要签署你的 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

于 2017-05-14T21:06:28.963 回答