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コンソールで、ロールにそのサービスを選択できません。自動的に作成されるはずだと思います。
誰かがこれに遭遇したり、それを修正する方法を知っていますか?
サービスにリンクされたロールは、AWS CLIを使用して作成できます。
aws iam create-service-linked-role --aws-service-name es.amazonaws.com
elasticsearch
を使用してVPC
ドメインを作成し、aws-sdk
/cloudformation
を使用することは現在サポートされていません。 elasticsearch
サービスには、指定されたVPC
にネットワークインターフェイスを作成するための特別なサービスにリンクされたロールが必要です。現在、これはconsole
/cli
を使用して可能です(@Oscar Barrettの以下の回答)。
ただし、これを機能させるための回避策があり、次のように説明されています。
elasticsearch
アクセス権を持つテストVPC
ドメインを作成します。AWSServiceRoleForAmazonElasticsearchService
という名前のサービスにリンクされたロールが作成されます[注:指定した名前のロールを手動またはthr console
]で作成することはできませんaws-sdk
またはcloudformation
を使用して、elasticsearch
でVPC
ドメインを作成します。elasticsearch
ドメインは後で削除できます更新:サービスロールを作成するより正確な方法は、@ Oscar Barrettの回答に記載されています。私は自分の答えを削除することを考えていました。しかし、実際の問題に関する他の事実はさらに関連性が高いので、ここで私の答えを保持します。
@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'
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);
このエラーが発生した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日)に追加されました。