簡體   English   中英

AWS - 從公共 API 網關路由到 VPC 內 lambda

[英]AWS - Route from public API Gateway to in-VPC lambda

從面向公眾的 AWS.network 中的 API 網關到 VPC su.net 中的 Lambda function,流量經過哪里?

介紹 Amazon API 網關私有端點

通過此次發布,您可以構建不需要公開端點的基於 API 的服務。 它們仍然可以與您的 VPC 內的私有服務(例如數據庫)進行交互。 在此處輸入圖像描述

背景

當 lambda 不在 VPC 中(在 AWS public facing.network 中)時,流量通過 Inte.net。 但不確定 lambda 何時在 VPC 中。

從 AWS 控制台,我在 VPC 中創建了一個 lambda function 並確認 API 網關(不在 VPC 中)可以連接到 VPC 中的 lambda。

由於lambda在VPC中是一個su.net,它沒有public IP,那么go應該不會通過Inte.net。 但是,沒有用於從 API 網關連接到 VPC 中的 NLB 的 VPC 專用鏈接,如API 網關專用集成中所述。

因此,我不知道交通要經過哪里。

在此處輸入圖像描述

Terraform

Terraform aws_api_gateway_integration資源, connection_type說:

(可選)集成輸入的連接類型。 有效值是INTE.NET(通過公共可路由 inte.net 連接的默認值)和 VPC_LINK(對於 VPC 中 API 網關和 a.network 負載均衡器之間的私有連接)。

因此,它看起來可能是 go 通過 Inte.net,因為 connection_type 默認是 INTE.NET,而 VPC_LINK 當前用於 API Gateway Private Integration with 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 Gateway 集成的理解(如果錯誤,請糾正我)。

希望其他人不必通過同樣的努力來弄清楚它們。

在此處輸入圖片說明

更新

根據API Gateway 如何與 Firehose VPC 端點通信,目前的理解是 API 網關與 AWS 服務進行通信,這些服務不在 VPC 中,在 AWS 網絡內部,而不是通過 Internet。

在此處輸入圖片說明 在此處輸入圖片說明

您可以在下面找到 AWS 員工的 回復 簡而言之,不能保證流量保持私密

所有學分 go 給@ChildishGirl

請記住,Lambda 和 API 網關等服務在服務賬戶 VPC 中運行。 當服務相互通信時,它們將通過 public.networks 進行通信,但會盡一切努力通過 AWS 骨干網進行通信。 換句話說,我們不保證它不會使用公共 Inte.net,但我們會盡力將流量保持在我們的骨干網內部。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM