web-dev-qa-db-ja.com

ValidationException:続行する前に、サービスにリンクされたロールを有効にして、VPCにアクセスするためのAmazon ESアクセス許可を付与する必要があります

AWSでVPC制御のElastic Search Serviceを作成しようとしています。問題は、次のコードを実行するとエラーが発生し続けることです: '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:続行する前に、サービスにリンクされたロールを有効にして、VPCにアクセスするためのAmazon ESアクセス許可を付与する必要があります。このサービスにリンクされたロールをエラスティック検索サービス用に作成する方法がわかりません。 aws.Amazon.com IAMコンソールで、ロールにそのサービスを選択できません。自動的に作成されるはずだと思います。

誰かがこれに遭遇したり、それを修正する方法を知っていますか?

13
Michael Young

サービスにリンクされたロールは、AWS CLIを使用して作成できます。

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

elasticsearchを使用してVPCドメインを作成し、aws-sdk/cloudformationを使用することは現在サポートされていません。 elasticsearchサービスには、指定されたVPCにネットワークインターフェイスを作成するための特別なサービスにリンクされたロールが必要です。現在、これはconsole/cliを使用して可能です(@Oscar Barrettの以下の回答)。

ただし、これを機能させるための回避策があり、次のように説明されています。

  • コンソールを使用して、elasticsearchアクセス権を持つテストVPCドメインを作成します。
  • これにより、AWSServiceRoleForAmazonElasticsearchServiceという名前のサービスにリンクされたロールが作成されます[注:指定した名前のロールを手動またはthr console]で作成することはできません
  • このロールが作成されたら、aws-sdkまたはcloudformationを使用して、elasticsearchVPCドメインを作成します。
  • テストelasticsearchドメインは後で削除できます

更新:サービスロールを作成するより正確な方法は、@ Oscar Barrettの回答に記載されています。私は自分の答えを削除することを考えていました。しかし、実際の問題に関する他の事実はさらに関連性が高いので、ここで私の答えを保持します。

14

@htaccessによるTerraform回答と同様に、CloudFormationテンプレートでサービスにリンクされたロールを作成できるようになりました。詳細については Service-Linked RolesのCloudFormation構文のドキュメント を参照してください

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

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);
1
Otto

このエラーが発生した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プロバイダーの Release 1.15. (2018年4月18日)に追加されました。

0
htaccess