如何使用AWS CDK创建OpenSearch Domain专属VPC端点?
我正在VPC中搭建OpenSearch Domain,需要创建VPC端点以使其对部分Lambda函数可用。我发现OpenSearch Domain的VPC端点创建方式特殊:无需进入VPC服务页面的「端点」选项,而是要在OpenSearch服务页面左侧菜单中创建。这类VPC端点是集群专属的,创建时需指定对应Domain。
我通过AWS CDK可创建Lambda、STS等普通VPC端点,代码示例如下:
new InterfaceVpcEndpoint(this, 'STSEndpoint', { vpc, subnets: { subnets }, service: new InterfaceVpcEndpointService(`com.amazonaws.${stageConfig.AWSProfileRegion}.sts`), privateDnsEnabled: true, open: true, }); new InterfaceVpcEndpoint(this, 'LambdaEndpoint', { vpc, subnets: { subnets }, service: new InterfaceVpcEndpointService(`com.amazonaws.${stageConfig.AWSProfileRegion}.lambda`), privateDnsEnabled: true, open: true, });
但不知如何通过CDK创建这类OpenSearch专属端点,恳请指点实现方向。
首先要明确:你说的这种OpenSearch专属「VPC端点」,本质是OpenSearch Domain部署在VPC内时自动生成的弹性网络接口(ENI),并非独立的VPC端点服务,不需要像创建STS/Lambda端点那样单独调用
InterfaceVpcEndpoint构造。在AWS CDK中,直接通过OpenSearch的Domain构造配置VPC参数即可自动完成网络部署,步骤如下:
准备VPC、子网和安全组
先创建或复用目标VPC、子网,以及用于控制访问的安全组:import { Domain, EngineVersion } from 'aws-cdk-lib/aws-opensearchservice'; import { Vpc, SecurityGroup, Port } from 'aws-cdk-lib/aws-ec2'; // 假设已存在VPC和目标子网 const openSearchSG = new SecurityGroup(this, 'OpenSearchSG', { vpc: yourVpc, description: 'Allow access to OpenSearch from Lambda', });创建带VPC配置的OpenSearch Domain
在Domain构造中指定VPC、子网和安全组,CDK会自动在指定子网创建ENI并配置网络:const osDomain = new Domain(this, 'MyVpcOpenSearchDomain', { version: EngineVersion.OPENSEARCH_2_11, vpc: yourVpc, vpcSubnets: { subnets: yourTargetSubnets }, // 指定部署Domain的子网 securityGroups: [openSearchSG], // 关联安全组 // 按需配置其他参数:实例类型、副本数等 capacity: { dataNodes: 2, dataNodeInstanceType: 't3.small.search', masterNodes: 3, }, });配置Lambda访问权限
给Lambda的安全组添加出站规则,允许访问OpenSearch安全组的443端口:// 假设已存在Lambda的安全组 lambdaSG.connections.allowTo(openSearchSG, Port.tcp(443));获取OpenSearch端点
部署完成后,可通过osDomain.domainEndpoint获取Domain的VPC内部端点,在Lambda代码中直接使用该地址访问。
- 如果你需要更底层的配置控制,可以使用
CfnDomain的VPCOptions属性,手动指定子网ID、安全组ID:import { CfnDomain } from 'aws-cdk-lib/aws-opensearchservice'; new CfnDomain(this, 'MyRawOpenSearchDomain', { domainName: 'my-domain', engineVersion: 'OpenSearch_2.11', vpcOptions: { subnetIds: ['subnet-xxxxxx', 'subnet-yyyyyy'], securityGroupIds: [openSearchSG.securityGroupId], }, // 其他配置参数 });
内容的提问来源于stack exchange,提问作者Renato Gama

