我正在尝试从VPC内的lambda函数访问VPC外部的kinesis流。目前,当执行写入kinesis流的代码时,它将挂起然后超时。当我将lambda从VPC中取出时,写入流的代码工作正常。但我需要访问VPC中的资源,然后写入流。有人知道怎么修这个东西吗?
这是我在VPC中的功能
functions:
handleChanges:
handler: functions/handlers.handleChanges
timeout: 10
package:
include:
- functions/utils/**
events:
- http:
method: POST
path: "/"
integration: lambda
vpc:
securityGroupIds:
- ${file(./private.yml):variables.securityGroup}
subnetIds:
- ${file(./private.yml):variables.subnetID}
这是我的政策
iamRoleStatements:
- Effect: "Allow"
Action:
- "kinesis:PutRecord"
- "kinesis:GetRecords"
- "kinesis:GetShardIterator"
- "kinesis:DescribeStream"
- "kinesis:ListStreams"
Resource:
Fn::GetAtt:
- KinesisStream
- Arn
- Effect: "Allow"
Action:
- "cognito-idp:AdminGetUser"
Resource: "*"
- Effect: "Allow"
Action:
- "logs:CreateLogGroup"
- "logs:CreateLogStream"
- "logs:PutLogEvents"
- "ec2:CreateNetworkInterface"
- "ec2:DescribeNetworkInterfaces"
- "ec2:DeleteNetworkInterface"
Resource: "*"
最后这是我的kinesis流资源
KinesisStream:
Type: AWS::Kinesis::Stream
Properties:
Name: ${self:provider.environment.STREAM_NAME}
ShardCount: 1
答案 0 :(得分:4)
唯一的解决方案是向您的VPC添加NAT Gateway(或NAT instance),以便驻留在您的私有子网中的Lambda函数等资源可以访问VPC之外的资源。
答案 1 :(得分:1)
不需要NAT,您也可以使用VPC端点进行此操作: https://docs.aws.amazon.com/vpc/latest/userguide/vpc-endpoints.html 这就是对Kinesis进行的操作: https://docs.aws.amazon.com/streams/latest/dev/vpc.html
为我工作:)并便宜一些。 确保设置正确的安全组(私有VPC的Sg,而不是默认VPC的)
如果您将阅读NAT定价文档,他们也建议这样做: https://aws.amazon.com/vpc/pricing/ 阅读最后的注释:
<!-- ko with: user -->
<button data-bind="click: $root.showData">POS User</button>
<!-- /ko -->
self.showData = function (user) { ... };
答案 2 :(得分:-3)
本文似乎对这个问题有完整的解决方案: https://aws.amazon.com/premiumsupport/knowledge-center/internet-access-lambda-function/
我按照说明进行操作,并为现有的VPC创建了所有内容,而我在VPC中的lambda函数仍然无法访问我想要的外部资源(AWS识别)。但是,在我放弃现有的VPC并使用本文开头所述的“ VPC”向导创建了一个新的“具有公共子网和私有子网的VPC”之后,此方法便可以使用。我不知道为什么。