34

我正在尝试在 AWS 上创建 VPC 控制的弹性搜索服务。问题是我在运行以下代码时不断收到错误消息:“ValidationException:在您继续之前,您必须启用服务相关角色以授予 Amazon ES 访问您的 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
  }
});

问题是我收到此错误:ValidationException: 在您继续之前,您必须启用服务相关角色以授予 Amazon ES 访问您的 VPC 的权限。我似乎无法弄清楚如何为弹性搜索服务创建此服务链接角色。在 aws.amazon.com IAM 控制台中,我无法为角色选择该服务。我相信它应该是自动创建的。

有没有人遇到过这个问题或知道解决方法?

4

5 回答 5

63

可以使用 AWS CLI 创建服务相关角色。

aws iam create-service-linked-role --aws-service-name es.amazonaws.com
于 2018-04-13T03:09:10.033 回答
23

您现在可以在 CloudFormation 模板中创建服务相关角色,类似于 @htaccess 的 Terraform 答案。有关更多详细信息,请参阅服务相关角色的 CloudFormation 语法文档

YourRoleNameHere:
  Type: 'AWS::IAM::ServiceLinkedRole'
  Properties:
    AWSServiceName: es.amazonaws.com
    Description: 'Role for ES to access resources in my VPC'
于 2018-10-16T03:09:50.023 回答
19

目前不支持使用/创建elasticsearch域。该服务需要一个特殊的服务链接角色来创建指定的网络接口。目前可以使用/ (@Oscar Barrett 的回答如下)。VPCaws-sdkcloudformationelasticsearchVPCconsolecli

但是,有一种解决方法可以使其正常工作,描述如下:

  • 使用控制台创建具有访问权限的测试elasticsearch域。VPC
  • 这将创建一个名为AWSServiceRoleForAmazonElasticsearchService[注意:您不能手动或通过 thr 创建具有指定名称的角色console]
  • 创建此角色后,使用aws-sdk或使用.cloudformationelasticsearchVPC
  • 您可以稍后删除测试elasticsearch

更新:@Oscar Barrett 的回答中描述了创建服务角色的更正确方法。我想删除我的答案;但关于实际问题的其他事实仍然更相关,因此我的答案保留在这里。

于 2017-11-29T08:51:02.903 回答
16

对于遇到此错误的 terraform 用户,您可以使用aws_iam_service_linked_role资源为 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."
}

此资源是在AWS Provider的版本 1.15.0 (2018 年 4 月 18 日)中添加的。

于 2018-08-22T02:36:41.550 回答
2

在 CDK 中自己做:

const serviceLinkedRole = new cdk.CfnResource(this, "es-service-linked-role", {
  type: "AWS::IAM::ServiceLinkedRole",
  properties: {
    AWSServiceName: "es.amazonaws.com",
    Description: "Role for ES to access resources in my VPC"
  }
});

const esDomain = new es.CfnDomain(this, "es", { ... });

esDomain.node.addDependency(serviceLinkedRole);
于 2020-02-14T07:02:27.023 回答