AWS - 从公共 API 网关到 VPC 内 lambda 的路由

2024-01-07

Question

从面向公众的AWS网络中的API网关到VPC子网中的Lambda函数,流量经过哪里?

推出 Amazon API Gateway 私有终端节点 https://aws.amazon.com/blogs/compute/introducing-amazon-api-gateway-private-endpoints/

With this launch, you could build API-based services that did not require a publicly available endpoint. They could still interact with private services, such as databases, inside your VPC. enter image description here

背景

当 lambda 不在 VPC 中(在 AWS 面向公众的网络中)时,流量将通过 Internet。但不确定 lambda 何时位于 VPC 中。

我从 AWS 控制台在 VPC 中创建了一个 lambda 函数,并确认 API 网关(不在 VPC 中)可以使用 VPC 中的 lambda。

由于 lambda 位于 VPC 中的子网中,因此它没有公共 IP,因此它不应该通过 Internet。但是,没有用于从 API 网关连接到 VPC 中的 NLB 的 VPC 专用链接,如中所述API网关私有集成 https://docs.aws.amazon.com/apigateway/latest/developerguide/set-up-private-integration.html.

因此我不知道交通经过哪里。

地形

地形aws_api_gateway_integration https://www.terraform.io/docs/providers/aws/r/api_gateway_integration.html资源,连接类型 says:

(可选)集成输入的连接类型。有效值为INTERNET(默认通过公共可路由互联网进行连接)和 VPC_LINK(用于 API 网关与 VPC 中的网络负载均衡器之间的专用连接)。

因此,它看起来可能会通过 Internet,因为 connection_type 默认为 INTERNET,而 VPC_LINK 目前用于 API 网关与 NLB 的私有集成。

# Variables
variable "myregion" {
  default = "us-east-2"
}

variable "accountId" {

  default = var.account_id
}

# API Gateway
resource "aws_api_gateway_rest_api" "api" {
  name = "api-lambda-vpc-test"
}

resource "aws_api_gateway_resource" "resource" {
  path_part   = "resource"
  parent_id   = "${aws_api_gateway_rest_api.api.root_resource_id}"
  rest_api_id = "${aws_api_gateway_rest_api.api.id}"
}

resource "aws_api_gateway_method" "method" {
  rest_api_id   = "${aws_api_gateway_rest_api.api.id}"
  resource_id   = "${aws_api_gateway_resource.resource.id}"
  http_method   = "GET"
  authorization = "NONE"
}

resource "aws_api_gateway_integration" "integration" {
  rest_api_id             = "${aws_api_gateway_rest_api.api.id}"
  resource_id             = "${aws_api_gateway_resource.resource.id}"
  http_method             = "${aws_api_gateway_method.method.http_method}"
  integration_http_method = "POST"
  type                    = "AWS_PROXY"
  uri                     = "${aws_lambda_function.lambda.invoke_arn}"
}

# Lambda
resource "aws_lambda_permission" "apigw_lambda" {
  statement_id  = "AllowExecutionFromAPIGateway"
  action        = "lambda:InvokeFunction"
  function_name = "${aws_lambda_function.lambda.function_name}"
  principal     = "apigateway.amazonaws.com"

  # More: http://docs.aws.amazon.com/apigateway/latest/developerguide/api-gateway-control-access-using-iam-policies-to-invoke-api.html
  source_arn = "arn:aws:execute-api:${var.myregion}:${var.accountId}:${aws_api_gateway_rest_api.api.id}/*/${aws_api_gateway_method.method.http_method}${aws_api_gateway_resource.resource.path}"
}

resource "aws_lambda_function" "lambda" {
  filename      = "lambda.zip"
  function_name = "mylambda"
  role          = "${aws_iam_role.role.arn}"
  handler       = "lambda.lambda_handler"
  runtime       = "python3.6"

  vpc_config {
    security_group_ids = var.sg_ids
    subnet_ids         = var.subnet_ids
  }
  # The filebase64sha256() function is available in Terraform 0.11.12 and later
  # For Terraform 0.11.11 and earlier, use the base64sha256() function and the file() function:
  # source_code_hash = "${base64sha256(file("lambda.zip"))}"
  source_code_hash = "${filebase64sha256("lambda.zip")}"
}

# IAM
resource "aws_iam_role" "role" {
  name = "myrole"

  assume_role_policy = <<POLICY
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Action": "sts:AssumeRole",
      "Principal": {
        "Service": "lambda.amazonaws.com"
      },
      "Effect": "Allow",
      "Sid": ""
    }
  ]
}
POLICY
}
data "aws_iam_policy" "admin" {
  arn = "arn:aws:iam::aws:policy/AdministratorAccess"
}
resource "aws_iam_role_policy_attachment" "admin" {
  role       = "${aws_iam_role.role.id}"
  policy_arn = "${data.aws_iam_policy.admin.arn}"
}

正如@Marcin 所回答的,它通过AWS 内部网络。

目前我对API网关集成的理解(如果错误请纠正)。

希望其他人不必付出同样的努力来解决这些问题。

Update

As per API Gateway 如何与 Firehose VPC 端点通信 https://stackoverflow.com/questions/60769970/how-api-gateway-talk-to-firehose-vpc-endpoint,目前的理解是 API 网关与 AWS 服务进行通信,这些服务不在 VPC 中,在 AWS 网络内部,而不是通过 Internet。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

AWS - 从公共 API 网关到 VPC 内 lambda 的路由 的相关文章

随机推荐

  • 使用预处理器生成具有多个参数的显式实例化

    在我的项目中 我希望对模板化函数进行大量显式实例化 以减少构建时间 现在我有很多函数 它们可以有不同的模板 出于这个原因 如果我想要更多 我不想手动输入它们 而是让预处理器生成它们 我想要生成的示例 template bool match
  • 寻找安全、稳健的 STS 实施

    我面临的一个项目通过 WCF 服务使用自定义身份验证 该服务根据识别用户的一些数据 接近用户名和密码 返回一组声明 除此之外 我还有一个自定义 STS 源自Microsoft IdentityModel SecurityTokenServi
  • TensorFlow:计算 Hessian 矩阵(和高阶导数)

    我希望能够计算损失函数的高阶导数 至少我希望能够计算 Hessian 矩阵 目前 我正在计算 Hessian 矩阵的数值近似值 但这更昂贵 而且更重要的是 据我所知 如果矩阵是病态的 条件数非常大 则不准确 Theano 通过符号循环实现这
  • JavaMail:如何获取与时间戳比较的新邮件

    我试图在某个时间戳之后获取消息 我的编码方式是由本网站的另一位程序员建议的 GregorianCalendar date new GregorianCalendar SearchTerm newer new ReceivedDateTerm
  • 我什么时候应该返回接口,什么时候返回具体类?

    当用 Java 编程时 我几乎总是出于习惯 写这样的东西 public List
  • 在 Android Studio 中导入 Urban Airship 会出现编译问题吗?

    我是 Android Studio 的新手 我想在我的一个项目中实现 Urban Airship 我按照他们网站上的示例使用 aar 文件 最终收到此错误 Error Users AndroidstudioProjects MyApplic
  • Bootstrap模式水平文本溢出

    里面有大文本输入 p 标记文本溢出模式的边界并超出屏幕 需要水平滚动条才能阅读 我已经从 Bootstrap 文档中复制了示例代码 并简单地在其中添加了一个长文本字符串modal body部分 Bootstrap 文档网站上的示例似乎正确地
  • Rails Active Storage 无模型

    Rails Active Storage 可以在没有模型支持的情况下使用吗 我有一个表格 需要上传文件 但我不希望将其附加到模型中 我只需要上传文件 以便我可以使用后台作业处理它 然后将其删除 Yes 当 ActiveStorage 由模型
  • 在浏览器上哪些情况可能导致 window.history.state 为空?

    我的网站的查询字符串 URL 如下 budget 0 year 0 kms 0 so 1 sc 1 pn 1 当用户转到下一页 从第 1 页到第 2 页 时 我们明确增加pn 页码加 1 并将其设置在查询字符串 URL 中 更改后的查询字符
  • 从 VIM 发送电子邮件

    我打算通过 VIM 内部发送电子邮件发电子邮件 http caspian dotconf net menu Software SendEmail 但我遇到了一些问题 当通过 bang 运算符将缓冲区的一部分 或整个缓冲区 传输到 SendE
  • 动态 UITextView 错位行为

    我试图拥有一个类似于iPhone消息的文本视图 其中文本视图最初有一个约束 高度 这是该项目的链接 https github com akawther TextView https github com akawther TextView
  • Foursquare API:获取给定区域中场地的详尽列表

    我正在使用 Foursquare API 来获取特定类别的场所列表 一个重要的要求是该列表是详尽的 即包括所有相关点 v2 venues search API 端点强制输出 50 个场地的限制 因此 我想到的第一个想法是将区域分成几个部分
  • DOMNodeInserted 的新等价物是什么?

    The DOMNodeInserted活动已被弃用 https developer mozilla org en US docs Web Guide Events Mutation events所有突变事件都已被突变观察者取代 But 在突
  • php垂直正则表达式搜索

    我有一个描述 n x m 元素矩阵的字符串 如下所示 inputmap B BBB BBB BB FBB BB BB BB F BB BB F B B B B F
  • 生成元素随机顺序的算法

    如何以最低的复杂度随机排列大约 20 个元素的顺序 生成随机排列 Knuth 洗牌算法 http en wikipedia org wiki Knuth shuffle是一个不错的选择
  • Android 获取所选单选按钮的值

    我有一个无线电组rg1我想获取所选单选按钮的值 我知道我可以获得id所选单选按钮的使用方法 if rg1 getCheckedRadioButtonId 1 int id rg1 getCheckedRadioButtonId 这给了我 i
  • c# 到 json 无法在视图中正确呈现

    您好 我正在尝试将字符串发送到看起来像 json 的视图 我正在发送地点列表 class Place public string title get set public string description get set public
  • SQLSTATE[HY000][2002] php_network_getaddresses: getaddrinfo 失败: 提供节点名或服务名,或未知

    我的问题 我在 Mac 上使用 MAMP 和 Git 通过 SQL 数据库连接查看和编辑 PHP 文件 然后将其推送到 Web 服务器 我最近添加了一个文件目录 这是带有 SQl 数据库连接的文件
  • poll 系统调用超时

    附加strace显示了很多这样的消息 poll fd 5 events POLLIN fd 6 events POLLIN fd 7 events POLLIN fd 8 events POLLIN fd 9 events POLLIN f
  • AWS - 从公共 API 网关到 VPC 内 lambda 的路由

    Question 从面向公众的AWS网络中的API网关到VPC子网中的Lambda函数 流量经过哪里 推出 Amazon API Gateway 私有终端节点 https aws amazon com blogs compute intro