CDK中如何将Lambda与OpenSearch安全组设为VPC默认安全组?
解决方案
方案一:新建专用安全组(推荐)
直接创建专门用于Lambda和OpenSearch互访的安全组,避免依赖默认安全组的限制,配置更灵活可控。
单个共享安全组配置(简单场景)
创建一个共享安全组,同时关联到Lambda和OpenSearch,允许组内流量互通:
// 创建共享安全组,关联目标VPC const sharedSg = new ec2.SecurityGroup(this, 'LambdaOpensearchSharedSg', { vpc: serviceVPC, allowAllOutbound: true, // Lambda需要出站访问OpenSearch,默认开启可按需调整 description: 'Shared SG for Lambda and OpenSearch in private subnet', }); // 添加规则:允许同安全组内的流量访问OpenSearch端口(HTTPS用443,HTTP用9200) sharedSg.addIngressRule( ec2.Peer.securityGroupId(sharedSg.securityGroupId), ec2.Port.tcp(443), 'Allow internal SG traffic to OpenSearch' ); // 给Lambda关联该安全组 new lambda.Function(this, 'MyLambda', { // 其他必要配置(代码、运行时等) vpc: serviceVPC, vpcSubnets: { subnetType: ec2.SubnetType.PRIVATE_ISOLATED }, securityGroups: [sharedSg], }); // 给OpenSearch域关联该安全组 new opensearch.Domain(this, 'MyOpensearchDomain', { // 其他必要配置(版本、存储等) vpc: serviceVPC, vpcSubnets: [{ subnetType: ec2.SubnetType.PRIVATE_ISOLATED }], securityGroups: [sharedSg], });
分拆独立安全组(严谨场景)
给Lambda和OpenSearch分别创建安全组,精准控制访问权限:
// Lambda专属安全组 const lambdaSg = new ec2.SecurityGroup(this, 'LambdaSg', { vpc: serviceVPC, allowAllOutbound: true, description: 'SG for Lambda accessing OpenSearch', }); // OpenSearch专属安全组 const opensearchSg = new ec2.SecurityGroup(this, 'OpensearchSg', { vpc: serviceVPC, allowAllOutbound: false, // OpenSearch无需主动出站时关闭,按需调整 description: 'SG for OpenSearch domain', }); // 给OpenSearch添加入站规则:允许Lambda安全组访问服务端口 opensearchSg.addIngressRule( ec2.Peer.securityGroupId(lambdaSg.securityGroupId), ec2.Port.tcp(443), 'Allow Lambda to access OpenSearch' ); // 关联安全组到Lambda new lambda.Function(this, 'MyLambda', { // 其他配置 vpc: serviceVPC, vpcSubnets: { subnetType: ec2.SubnetType.PRIVATE_ISOLATED }, securityGroups: [lambdaSg], }); // 关联安全组到OpenSearch new opensearch.Domain(this, 'MyOpensearchDomain', { // 其他配置 vpc: serviceVPC, vpcSubnets: [{ subnetType: ec2.SubnetType.PRIVATE_ISOLATED }], securityGroups: [opensearchSg], });
方案二:复用VPC默认安全组
如果一定要用默认安全组,不要用fromLookupById,改用fromSecurityGroupId来引用,它支持CloudFormation令牌(部署时解析的ID):
// 直接引用VPC默认安全组 const defaultSg = ec2.SecurityGroup.fromSecurityGroupId(this, 'DefaultSg', serviceVPC.vpcDefaultSecurityGroup); // 关联到Lambda new lambda.Function(this, 'MyLambda', { // 其他配置 vpc: serviceVPC, vpcSubnets: { subnetType: ec2.SubnetType.PRIVATE_ISOLATED }, securityGroups: [defaultSg], }); // 关联到OpenSearch new opensearch.Domain(this, 'MyOpensearchDomain', { // 其他配置 vpc: serviceVPC, vpcSubnets: [{ subnetType: ec2.SubnetType.PRIVATE_ISOLATED }], securityGroups: [defaultSg], });
错误原因说明
fromLookupById用于查找CDK栈外已存在的资源,要求在合成(synth)阶段就有具体的安全组ID,而serviceVPC.vpcDefaultSecurityGroup是CloudFormation令牌,只有部署阶段才会生成实际ID,因此会触发All arguments to look up a security group must be concrete (no Tokens)错误。fromSecurityGroupId则支持引用栈内或关联资源的令牌ID,适配这种场景。
内容的提问来源于stack exchange,提问作者Omar Elhosseni
相关产品推荐
相关产品推荐

