我正在尝试在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控制台中,我无法为角色选择该服务。我相信它应该是自动创建的。
有没有人碰到这个或知道解决方法?
答案 0 :(得分:23)
可以使用AWS CLI创建服务链接角色。
aws iam create-service-linked-role --aws-service-name es.amazonaws.com
答案 1 :(得分:14)
目前不支持使用elasticsearch
创建VPC
域并使用aws-sdk
/ cloudformation
。 elasticsearch
服务需要特殊的服务链接角色才能在指定的VPC
中创建网络接口。目前可以使用console
/ cli
(@ Oscar Barrett在下面给出答案)。
但是,有一种解决方法可以使其正常工作,其描述如下:
elasticsearch
访问权限的测试VPC
域。AWSServiceRoleForAmazonElasticsearchService
的服务链接角色[注意:您无法手动或通过thr console
创建具有指定名称的角色] aws-sdk
或cloudformation
创建elasticsearch
域VPC
。elasticsearch
域更新:在@Oscar Barrett的回答中描述了更正确的创建服务角色的方法。我想删除我的答案;但是关于实际问题的其他事实仍然更具相关性,因此在这里保留我的答案。
答案 2 :(得分:3)
您现在可以在CloudFormation模板中创建与服务相关的角色,类似于@htaccess的Terraform答案。有关更多详细信息,请参见the documentation for the CloudFormation syntax for Service-Linked Roles
YourRoleNameHere:
Type: 'AWS::IAM::ServiceLinkedRole'
Properties:
AWSServiceName: es.amazonaws.com
Description: 'Role for ES to access resources in my VPC'
答案 3 :(得分:1)
在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);
答案 4 :(得分:0)
对于遇到此错误的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的Release 1.15.0(2018年4月18日)中。