You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.24 08:15:29