AWS - маршрут от публичного c API-шлюза до in-VP C лямбда - PullRequest
1 голос
/ 14 марта 2020

Вопрос

От шлюза API в общедоступной сети c, обращенной к AWS, до функции Lambda в VP C su bnet, через которую проходит трафик?

Представление частных конечных точек Amazon API Gateway

С этим запуском вы можете создавать службы на основе API, для которых не требуется общедоступная конечная точка. Они по-прежнему могут взаимодействовать с частными службами, такими как базы данных, внутри вашего VP C. enter image description here

Фон

Когда лямбда отсутствует в VP C (в сети AWS publi c, обращенной к сети), traffi c проходит через Inte rnet. Но не уверен, когда лямбда находится в VP C.

С консоли AWS я создал лямбда-функцию в VP C и подтвердил API-шлюз (НЕ в VP C). может принимать лямбду в VP C.

Поскольку лямбда находится в su bnet в VP C, она не имеет publi c IP, поэтому она не должна go через Inte rnet. Однако не существует частной ссылки VP C, которая используется для подключения шлюза API к NLB в VP C, как описано в Частная интеграция шлюза API .

. не знаю, где проходит трафик c.

enter image description here

Terraform

Terraform aws_api_gateway_integration ресурс, тип_соединения говорит:

(Необязательно) Тип соединения интегрированного входа. Допустимые значения: INTE RNET (по умолчанию для подключений через publi c intetable rnet) и VPC_LINK (для частных подключений между API-шлюзом и балансировщиком сетевой нагрузки в VP C ).

Следовательно, похоже, что он может go через Inte rnet, так как тип_соединения по умолчанию - INTE RNET, а 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}"
}

1 Ответ

0 голосов
/ 14 марта 2020

В ответ на вопрос @Marcin, он проходит через внутреннюю сеть AWS.

Текущее мое понимание интеграции API-шлюза (пожалуйста, исправьте меня, если не так).

Надеюсь, что другим не придется go через те же усилия, чтобы их выяснить.

enter image description here

Обновление

Согласно Как API-шлюз взаимодействует с Firehose VP C конечной точкой , в настоящее время понимается, что API-шлюз взаимодействует с AWS сервисами, которые не находятся в VP C, внутренне в AWS сети Не через Inte rnet.

enter image description here enter image description here

...