【发布时间】:2020-02-17 11:46:08
【问题描述】:
我有一个在 VPC 中运行的 lambda 函数。
我需要在此 VPC 中使用我拥有的服务名称创建一个终端节点。我已经创建了一个并通过控制台执行所有操作来测试从 lambda 到服务的连接。但现在我需要在 CFT 中执行此操作。
我知道如何创建 VPC 端点,但不知道如何将端点链接到运行 lambda 的 VPC 的 VPC Id。
这就是我创建 lambda 以在 VPC 中运行的方式。
Type: AWS::Serverless::Function
Properties:
Handler: 'handleRequest'
Runtime: java8
CodeUri:
Bucket: {}
Key: BATS::SAM::CodeS3Key
Description: Lambda.
Timeout: 20
Role:
Fn::GetAtt: [LambdaRole, Arn]
VpcConfig:
Fn::If:
- RunLambdaInVPC
- SecurityGroupIds: [{Ref: LambdaSecurityGroup}]
SubnetIds:
- {'Fn::ImportValue': PrivateSubnet01}
- {'Fn::ImportValue': PrivateSubnet02}
- {Ref: 'AWS::NoValue'}
下面是我正在创建的 VPC 端点,但看不到如何提供 VPC Id:
Type: AWS::EC2::VPCEndpoint
Properties:
SecurityGroupIds: [{Ref: LambdaSecurityGroup}]
ServiceName: 'ServiceName'
SubnetIds:
- {'Fn::ImportValue': PrivateSubnet01}
- {'Fn::ImportValue': PrivateSubnet02}
VpcId : <??>
【问题讨论】:
-
VpcId 属性是
The ID of the VPC in which the endpoint will be used.docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/… -
@AmitBaranes 我知道,问题是如何获取 VPC 的 ID?我可以在控制台中看到创建 lambda 时堆栈默认创建的 VPC 的 ID,但我认为这不是创建对硬编码值的依赖的适当方式。
-
VPC 不是动态创建的,因此您绝对应该将其编码为配置(或环境变量)。启动私有网络需要了解所有私有 CIDR 以防止冲突。
-
@iammrmehul 模板似乎正在从另一个堆栈导入子网信息。其他堆栈也可以导出 VPC ID 吗?
-
@LostJon 专用网络实际上已经设置和测试。我唯一担心的是在专用链接 VPCE(我用来访问目标服务)中创建的 DNS 服务器名称基本上是硬编码的。我想通过在 CFT 中设置 VPCE 然后在其上使用 Fn::GetAttr 来获取 DNS 服务器名称,从而使其成为 CFT 的一部分。
标签: amazon-web-services aws-lambda amazon-cloudformation amazon-vpc