web-dev-qa-db-fra.com

ValidationException: avant de pouvoir continuer, vous devez activer un rôle lié au service pour donner à Amazon ES les autorisations nécessaires pour accéder à votre VPC.

J'essaie de créer un service Elastic Search contrôlé par VPC sur AWS. Le problème est que je reçois toujours l'erreur lorsque j'exécute le code suivant: "ValidationException: avant de pouvoir continuer, vous devez activer un rôle lié au service pour donner à Amazon ES les autorisations nécessaires pour accéder à votre VPC".

const AWS = require('aws-sdk');
AWS.config.update({region:'<aws-datacenter>'});
const accessPolicies = {
  Statement: [{
    Effect: "Allow",
    Principal: {
      AWS: "*"
    },
    Action: "es:*",
    Resource: "arn:aws:es:<dc>:<accountid>:domain/<domain-name/*"
  }]
};
const params = {
  DomainName: '<domain>',
  /* required */
  AccessPolicies: JSON.stringify(accessPolicies),
  AdvancedOptions: {
    EBSEnabled: "true",
    VolumeType: "io1",
    VolumeSize: "100",
    Iops: "1000"
  },
  EBSOptions: {
    EBSEnabled: true,
    Iops: 1000,
    VolumeSize: 100,
    VolumeType: "io1"
  },
  ElasticsearchClusterConfig: {
    DedicatedMasterCount: 3,
    DedicatedMasterEnabled: true,
    DedicatedMasterType: "m4.large.elasticsearch",
    InstanceCount: 2,
    InstanceType: 'm4.xlarge.elasticsearch',
    ZoneAwarenessEnabled: true
  },
  ElasticsearchVersion: '5.5',
  SnapshotOptions: {
    AutomatedSnapshotStartHour: 3
  },
  VPCOptions: {
    SubnetIds: [
      '<redacted>',
      '<redacted>'
    ],
    SecurityGroupIds: [
      '<redacted>'
    ]
  }
};

const es = new AWS.ES();
es.createElasticsearchDomain(params, function (err, data) {
  if (err) {
    console.log(err, err.stack); // an error occurred
  } else {
    console.log(JSON.stringify(data, null, 4)); // successful response
  }
});

Le problème est que j'ai l'erreur suivante: ValidationException: avant de pouvoir continuer, vous devez activer un rôle lié au service pour donner à Amazon ES les autorisations nécessaires pour accéder à votre VPC. Je n'arrive pas à comprendre comment créer ce rôle lié au service pour le service de recherche élastique. Dans la console IAM aws.Amazon.com, je ne peux pas sélectionner ce service pour un rôle. Je crois qu'il est censé être créé automatiquement.

Est-ce que quelqu'un l'a rencontré ou sait comment y remédier?

7
Michael Young

Le rôle lié au service peut être créé à l'aide de l'AWS CLI.

aws iam create-service-linked-role --aws-service-name es.amazonaws.com
18
Oscar Barrett

La création d'un domaine elasticsearch avec VPC et l'utilisation de aws-sdk/cloudformation n'est actuellement pas prise en charge. Le service elasticsearch nécessite un rôle spécial lié au service pour créer les interfaces réseau dans la VPC spécifiée. Ceci est actuellement possible en utilisant console/cli (@ réponse d'Oscar Barrett ci-dessous).

Cependant, il existe une solution de contournement pour que cela fonctionne et elle est décrite comme suit:

  • Créez un domaine elasticsearch de test avec un accès VPC à l'aide de la console.
  • Cela créera un rôle lié au service nommé AWSServiceRoleForAmazonElasticsearchService [Remarque: vous ne pouvez pas créer le rôle avec le nom spécifié manuellement ou par le biais de console]
  • Une fois ce rôle créé, utilisez aws-sdk ou cloudformation pour créer le domaine elasticsearch avec VPC.
  • Vous pouvez supprimer le domaine de test elasticsearch ultérieurement

Mise à jour: La réponse la plus correcte pour créer le rôle de service est décrite dans la réponse de @Oscar Barrett. Je pensais à supprimer ma réponse; mais les autres faits sur la question actuelle sont encore plus pertinents, gardant ainsi ma réponse ici.

14

Vous pouvez maintenant créer un rôle lié au service dans un modèle CloudFormation, similaire à la réponse Terraform de @htaccess. Voir la documentation sur la syntaxe CloudFormation pour les rôles liés au service pour plus de détails

YourRoleNameHere:
  Type: 'AWS::IAM::ServiceLinkedRole'
  Properties:
    AWSServiceName: es.amazonaws.com
    Description: 'Role for ES to access resources in my VPC'
2
tryinHard

Pour les utilisateurs terraform ayant rencontré cette erreur, vous pouvez utiliser la ressource aws_iam_service_linked_role pour créer un rôle lié au service pour le service ES:

resource "aws_iam_service_linked_role" "es" {
    aws_service_name = "es.amazonaws.com"
    description      = "Allows Amazon ES to manage AWS resources for a domain on your behalf."
}

Cette ressource a été ajoutée dans Version 1.15.0 (18 avril 2018) du fournisseur AWS.

0
htaccess