亚马逊 OpenSearch 服务构建库
此API 可能会发出警告 。 后向兼容性没有保证 .
我们建议使用本单元,而不是本单元 @aws-cdk/aws-opensearch服务 模块。 见 亚马逊 OpenSearch 服务 FAQs 详细情况。 见 移动到 OpenSearch 移民指示.
快开始
通过简单指定版本创建开发集群:
const devDomain = new es.Domain(this, 'Domain', {
version: es.ElasticsearchVersion.V7_1,
});
要进行版本升级而不替换整个域,请指定 enableVersionUpgrade 属性.
const devDomain = new es.Domain(this, 'Domain', {
version: es.ElasticsearchVersion.V7_10,
enableVersionUpgrade: true, // defaults to false
});
通过同时指定容量和 az 分布等事项来创建生产级组
const prodDomain = new es.Domain(this, 'Domain', {
version: es.ElasticsearchVersion.V7_1,
capacity: {
masterNodes: 5,
dataNodes: 20,
},
ebs: {
volumeSize: 20,
},
zoneAwareness: {
availabilityZoneCount: 3,
},
logging: {
slowSearchLogEnabled: true,
appLogEnabled: true,
slowIndexLogEnabled: true,
},
});
这将创建一个弹性搜索集群,并自动设置日志组 记录域日志并慢取搜索日志.
关于 SLR 的说明
一些集群配置(例如VPC访问)需要存在 AWSServiceRoleForAmazonElasticsearchService 与服务相关的角色.
在通过 AWS 控制台进行此类操作时,此 SLR 在需要时会被自动创建 。 然而,使用CloudFormation时,这不是行为. 如果需要SLR,但不存在,您将会遇到一个失败消息 simlar:
Before you can proceed, you must enable a service-linked role to give Amazon ES...
为了解决这个问题,你需要 创建 sLR号 我们建议使用AWS CLI:
aws iam create-service-linked-role --aws-service-name es.amazonaws.com
您也可以使用 CDK 创建它, 但请注意,只有第一个应用软件才会成功数字 :
const slr = new iam.CfnServiceLinkedRole(this, 'ElasticSLR', {
awsServiceName: 'es.amazonaws.com',
});
导入已存在的域
要将已有域导入您的 CDK 应用程序, 请使用 Domain.fromDomainEndpoint 工厂方法.
此方法接受一个已经存在的域的域端点 :
const domainEndpoint = 'https://my-domain-jcjotrt6f7otem4sqcwbch3c4u.us-east-1.es.amazonaws.com';
const domain = es.Domain.fromDomainEndpoint(this, 'ImportedDomain', domainEndpoint);
权限
行政会议
管理访问域的帮助方法也存在.
declare const fn: lambda.Function;
declare const domain: es.Domain;
// Grant write access to the app-search index
domain.grantIndexWrite('app-search', fn);
// Grant read access to the 'app-search/_search' path
domain.grantPathRead('app-search/_search', fn);
加密
也可以通过加密创建域 :
const domain = new es.Domain(this, 'Domain', {
version: es.ElasticsearchVersion.V7_4,
ebs: {
volumeSize: 100,
volumeType: ec2.EbsDeviceVolumeType.GENERAL_PURPOSE_SSD,
},
nodeToNodeEncryption: true,
encryptionAtRest: {
enabled: true,
},
});
此设置有节点可加密的域名 休养. 您也可以选择提供用于加密的 KMS 密钥 休养.
VPC 支持
弹性搜索域可以被放入VPC内,提供亚马逊ES与VPC内其他服务之间的安全通信,而不需要互联网网关,NAT设备,或VPN连接.
const vpc = new ec2.Vpc(this, 'Vpc');
const domainProps: es.DomainProps = {
version: es.ElasticsearchVersion.V7_1,
removalPolicy: RemovalPolicy.DESTROY,
vpc,
// must be enabled since our VPC contains multiple private subnets.
zoneAwareness: {
enabled: true,
},
capacity: {
// must be an even number since the default az count is 2.
dataNodes: 2,
},
};
new es.Domain(this, 'Domain', domainProps);
此外,您还可以使用 vpcSubnets 属性以控制将使用哪些子网,以及 securityGroups 要控制的属性
哪些安全小组将附属于域。 默认情况下, CDK 将选择全部 私营 vPC中的子网,并创建一个专用的安全组.
计量
存在帮助方法来访问共同域度量衡,例如:
declare const domain: es.Domain;
const freeStorageSpace = domain.metricFreeStorageSpace();
const masterSysMemoryUtilization = domain.metric('MasterSysMemoryUtilization');
这个模块是 AWS 云开发套件 项目.
精细的谷物出入控制
也可以通过配置主用户来创建域. 密码可以 如果不提供则提供或动态创建.
const domain = new es.Domain(this, 'Domain', {
version: es.ElasticsearchVersion.V7_1,
enforceHttps: true,
nodeToNodeEncryption: true,
encryptionAtRest: {
enabled: true,
},
fineGrainedAccessControl: {
masterUserName: 'master-user',
},
});
const masterUserPassword = domain.masterUserPassword;
使用未签名的基本认证
为方便起见,可以配置域允许未签名的 HTTP 请求 使用基本的认证。 除非域配置为 VPC 的一部分 表示任何人可以使用所配置的主用户名访问域并 密码.
要启用未签名的基本认证访问, 域名配置为访问 策略允许任意请求, HTTPS 需要,节点到节点加密, 在休息时加密 和精细的进取控制.
如果以上设置没有设定, 将配置为启用的一部分 未签名的基本认证 。 如果它们设置为相冲突值,则错误是 抛出.
如果没有配置主用户,则创建默认主用户
用户名 admin。 。 。 .
如果没有配置密码,将创建默认主用户密码
存储在 AWS 机密管理器中作为秘密 。 秘密有前缀
<domain id>MasterUser。 。 。 .
const domain = new es.Domain(this, 'Domain', {
version: es.ElasticsearchVersion.V7_1,
useUnsignedBasicAuth: true,
});
const masterUserPassword = domain.masterUserPassword;
自定义准入政策
如果域名需要自定义访问控制,则可以配置为 建造者财产,或后来通过帮助方法.
对于简单的权限 accessPolicies 构造器可能足以:
const domain = new es.Domain(this, 'Domain', {
version: es.ElasticsearchVersion.V7_1,
accessPolicies: [
new iam.PolicyStatement({
actions: ['es:*ESHttpPost', 'es:ESHttpPut*'],
effect: iam.Effect.ALLOW,
principals: [new iam.AccountPrincipal('123456789012')],
resources: ['*'],
}),
]
});
例如,对于更为复杂的使用大小写,设置域名以接收来自 a
交叉账户 Kinesis Firehose 页:1 addAccessPolicies 帮助方法
允许包含明确域 ARN 的政策.
const domain = new es.Domain(this, 'Domain', {
version: es.ElasticsearchVersion.V7_1,
});
domain.addAccessPolicies(
new iam.PolicyStatement({
actions: ['es:ESHttpPost', 'es:ESHttpPut'],
effect: iam.Effect.ALLOW,
principals: [new iam.AccountPrincipal('123456789012')],
resources: [domain.domainArn, `${domain.domainArn}/*`],
}),
new iam.PolicyStatement({
actions: ['es:ESHttpGet'],
effect: iam.Effect.ALLOW,
principals: [new iam.AccountPrincipal('123456789012')],
resources: [
`${domain.domainArn}/_all/_settings`,
`${domain.domainArn}/_cluster/stats`,
`${domain.domainArn}/index-name*/_mapping/type-name`,
`${domain.domainArn}/roletest*/_mapping/roletest`,
`${domain.domainArn}/_nodes`,
`${domain.domainArn}/_nodes/stats`,
`${domain.domainArn}/_nodes/*/stats`,
`${domain.domainArn}/_stats`,
`${domain.domainArn}/index-name*/_stats`,
`${domain.domainArn}/roletest*/_stat`,
],
}),
);
审计记录
可以启用一个域的审计日志,但只有在启用了精细的访问控制后才能启用.
const domain = new es.Domain(this, 'Domain', {
version: es.ElasticsearchVersion.V7_1,
enforceHttps: true,
nodeToNodeEncryption: true,
encryptionAtRest: {
enabled: true,
},
fineGrainedAccessControl: {
masterUserName: 'master-user',
},
logging: {
auditLogEnabled: true,
slowSearchLogEnabled: true,
appLogEnabled: true,
slowIndexLogEnabled: true,
},
});
超温
可以启用UltraWarm节点,提供成本效益高的方法来存储大量只读数据.
const domain = new es.Domain(this, 'Domain', {
version: es.ElasticsearchVersion.V7_10,
capacity: {
masterNodes: 2,
warmNodes: 2,
warmInstanceType: 'ultrawarm1.medium.elasticsearch',
},
});
自定义终点
自定义端点可以被配置到自定义域名下的ES域.
new es.Domain(this, 'Domain', {
version: es.ElasticsearchVersion.V7_7,
customEndpoint: {
domainName: 'search.example.com',
},
});
还可能指定一个自定义证书,而不是自动生成的证书.
此外,如果为自定义终点提供了主机区,则创建自动的 CNAME 记录
高级选项
高级集群设置 可用于配置额外选项.
new es.Domain(this, 'Domain', {
version: es.ElasticsearchVersion.V7_7,
advancedOptions: {
'rest.action.multi.allow_explicit_index': 'false',
'indices.fielddata.cache.size': '25',
'indices.query.bool.max_clause_count': '2048',
},
});
移动到 OpenSearch
从本单元迁移( E)@aws-cdk/aws-elasticsearch) 改为: @aws-cdk/aws-opensearchservice 模块,您必须修改您的 CDK 应用程序以引用新模块(包括一些相关的修改),然后执行 CloudFormation 资源删除/导入.
必要的 CDK 修改
对您的 CDK 应用程序作以下修改以迁移到 @aws-cdk/aws-opensearchservice 模块.
-
重写要使用的模块导入
'@aws-cdk/aws-opensearchservice改为'@aws-cdk/aws-elasticsearch。 。 。 . 例如:import * as es from '@aws-cdk/aws-elasticsearch'; import { Domain } from '@aws-cdk/aws-elasticsearch';...会...
import * as opensearch from '@aws-cdk/aws-opensearchservice'; import { Domain } from '@aws-cdk/aws-opensearchservice'; -
替换实例
es.ElasticsearchVersion与opensearch.EngineVersion。 。 。 . 例如:const version = es.ElasticsearchVersion.V7_1;...会...
const version = opensearch.EngineVersion.ELASTICSEARCH_7_1; -
替换
cognitoKibanaAuth财产DomainProps与cognitoDashboardsAuth。 。 。 . 例如:new es.Domain(this, 'Domain', { cognitoKibanaAuth: { identityPoolId: 'test-identity-pool-id', userPoolId: 'test-user-pool-id', role: role, }, version: elasticsearchVersion, });...会...
new opensearch.Domain(this, 'Domain', { cognitoDashboardsAuth: { identityPoolId: 'test-identity-pool-id', userPoolId: 'test-user-pool-id', role: role, }, version: openSearchVersion, }); -
重写实例类型后缀
.elasticsearch改为.search。 。 。 . 例如:new es.Domain(this, 'Domain', { capacity: { masterNodeInstanceType: 'r5.large.elasticsearch', }, version: elasticsearchVersion, });...会...
new opensearch.Domain(this, 'Domain', { capacity: { masterNodeInstanceType: 'r5.large.search', }, version: openSearchVersion, }); -
任意
CfnInclude'd'域需要重新写入其原始模板 命令以成功方式列入opensearch.CfnDomain
云层迁移
执行这些步骤以迁移您的应用程序而不丢失数据 :
- 确保 删除政策 设置为
RemovalPolicy.RETAIN。这是域建构的默认值,因此不需要任何内容,除非您已经将删除策略设置为其它的值. - 通过手动修改用于创建 CloudFormation 堆栈的已合成模板,从您的 CloudFormation 堆栈中删除域资源 。 这也可能涉及修改或删除所依赖的资源,例如CDK为管理域的访问政策而创建的自定义资源,或者您已经连接到域上的任何其他资源. 您需要搜索每个域的逻辑ID的引用,以确定哪些其它资源引用,并替换或删除这些引用. 不删除属于域依赖性的资源,或在导入域前必须重新创建或导入. 修改后,通过AWS管理控制台或使用AWS CLI来部署堆栈.
- 移动您的 CDK 应用程序以使用新
@aws-cdk/aws-opensearchservice模块,采用上述必要修改。 合成您的应用程序并获取由此产生的堆栈模板. - 仅将域名定义从"移出"模板复制到您在上面部署的相应"被抽出"模板. 导入 使用这些模板将孤儿域输入您的 CloudFormation 堆栈.
- 合成并部署您的 CDK 应用程序, 以重新配置/ 重建修改的依赖资源 。 CloudFormation堆栈现在应该包含与迁移前相同的资源.
- 继续正常发展!