3

Je veux lancer un projet CodeBuild pour exécuter mes tests d'intégration. Mon application utilise AWS ElasticSearch Service comme stockage d'index Hibernate Search.AWS Elastisearch Politique d'accès pour l'intégration CodeBuild Tests avec Hibernate Search en utilisant un stockage ElasticSearch pour les index

J'ai ajouté une politique à mon domaine ES qui permet aux instances ec2 privées d'accéder à ES via une passerelle NAT. Malheureusement, je ne peux pas trouver la bonne politique pour permettre à CodeBuild d'accéder à ES. Lorsque j'exécute le projet CodeBuild, j'obtiens une erreur 403 quand Hibernate essaie de vérifier l'existence d'un index.

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 

J'ai essayé de configurer ES Politique d'accès pour permettre l'accès libre au domaine, teste puis exécute ok (« AWS »: « * »).

C'est la politique ES Accès

{ 
    "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" 
     } 
    } 
    } 
    ] 
} 

Comme principale, j'ai aussi essayé ce qui suit:

"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"

Toute aide sera très appréciée.

Merci

+0

Nous avons fait de bons progrès à ce sujet dans Hibernate Search: http://in.relation.to/2017/06/13/hibernate-search-5-8-0-Beta3/ – Sanne

Répondre

1

Vous avez probablement besoin de signer vos demandes ES.

Je ne suis pas familier avec CodeBuild, mais généralement la règle est la suivante: lorsque vous utilisez des rôles IAM pour accéder à Elasticsearch, vos demandes doivent être signées avec ce rôle IAM.

E.g. Pour python vous pouvez utiliser un outil comme celui-ci: https://github.com/DavidMuller/aws-requests-auth

Plus d'infos: http://docs.aws.amazon.com/general/latest/gr/signing_aws_api_requests.html

+0

Merci beaucoup. Je vais essayer de cette façon. – bertie

2

Je voudrais étendre la réponse à être plus VME précis.

Pour accéder à ElasticSearch à l'aide d'un rôle, la requête doit certainement être signée.

Cette solution est généralement correcte, mais dans mon cas particulier, cela ne convient pas car les requêtes vers AWS ES sont générées par Hibernate Search ElasticSearch. (Pourrions-nous trouver une autre solution en utilisant AOP?)

J'ai finalement trouvé une solution de contournement pour ce problème. Sur la spécification de construction CodeBuild j'ai ajouté les étapes suivantes:

  • Configurer AWS CLI en utilisant un utilisateur avec une stratégie qui lui permet de lire et mettre à jour le domaine ES.
  • Lire et enregistrer le courant ES Stratégie de domaine d'accès
  • je reçois le EC2 CodeBuild IP
  • Mise à jour ES accès politique de domaine pour permettre l'accès de CodeBuild IP
  • Attendez jusqu'à ce que les changements s'applique (15 minutes aprox)
  • Exécutez le test
  • Restaurez la configuration précédente

Je n'aime pas cette solution très bien parce que les mises à jour de stratégie de domaine prend trop LON g. Cette étape fait partie d'un CodePipeline pour l'intégration continue, et les exécutions ne devraient pas prendre plus de 15 ou 20 minutes.

Des idées pour améliorer cela?

+0

oui: si vous nous aidez de l'équipe Hibernate Search à définir une interface appropriée, nous serions très heureux de vous permettre d'injecter une forme d'extension "request signer". N'hésitez pas à participer au brainstorming en commentant sur https://hibernate.atlassian.net/browse/HSEARCH-2714 – Sanne