Страница AWS API Gateway 404 не найдена ошибка при вызове URL-адреса конечной точки - PullRequest
0 голосов
/ 25 сентября 2019

У меня есть API, работающий на ECS Fargate, который принимает GET запросы метода.Я поставил перед ним конечную точку API Gateway с интеграцией VPC_LINK с NLB в частной подсети.Когда я отправляю запрос GET, используя url invoke, я получаю ошибку 404 page not found.Я смущен, почему я получаю это.Я настроил каждый компонент - слушатель NLB, целевую группу, порты хоста и контейнера в своем определении задачи - на 8000/tcp.Итак, я не уверен, почему эта ошибка происходит.Моя задача Fargate также успешно выполняется и проходит все проверки работоспособности.Когда я тестирую контейнер локально, делая curl -X GET localhost/nmapscan:8000, он работает нормально.Ниже приведены мои конфигурации в Terraform, а также снимки экрана с консоли.

Terraform:

resource "aws_lb" "myapis" {
  name               = "my-apis"
  internal           = true
  load_balancer_type = "network"
  subnets            = ["${module.vpc.private_subnets}"]

  enable_deletion_protection = false

  tags = {
    Environment = "dev"
  }
}

resource "aws_security_group" "ecs_tasks" {
  name        = "ecs-tasks"
  description = "allow inbound access from the NLB only"
  vpc_id      = "${module.vpc.vpc_id}"

  ingress {
    protocol        = "tcp"
    from_port       = 8000
    to_port         = 8000
    cidr_blocks     = ["10.10.11.0/24", "10.10.12.0/24", "10.10.13.0/24"]
  }

  egress {
    protocol    = "-1"
    from_port   = 0
    to_port     = 0
    cidr_blocks = ["0.0.0.0/0"]
  }
}

resource "aws_lb_target_group" "test" {
  name     = "test-api"
  port     = 8000
  protocol = "TCP"
  target_type = "ip"
  vpc_id   = "${module.vpc.vpc_id}"

  stickiness{
    enabled = false
    type = "lb_cookie"
  }
  health_check{
    interval = 30
    port     = 8000
    protocol = "tcp"
    healthy_threshold = 2
    unhealthy_threshold = 2
  }
}

resource "aws_lb_listener" "test" {
  load_balancer_arn = "${aws_lb.myapis.id}"
  port              = "8000"
  protocol          = "TCP"

  default_action {
    target_group_arn = "${aws_lb_target_group.test.id}"
    type             = "forward"
  }
}

resource "aws_api_gateway_vpc_link" "myapi" {
  name        = "my_api_link"
  description = "VPC link for API NLB"
  target_arns = ["${aws_lb.myapis.arn}"]
}

resource "aws_api_gateway_rest_api" "GOAPI" {
  name        = "GO"
  description = "REST API for GO APIs"
}

resource "aws_api_gateway_resource" "test" {
  rest_api_id = "${aws_api_gateway_rest_api.GOAPI.id}"
  parent_id   = "${aws_api_gateway_rest_api.GOAPI.root_resource_id}"
  path_part   = "nmapscan"
}

resource "aws_api_gateway_method" "testmethod" {
  rest_api_id   = "${aws_api_gateway_rest_api.GOAPI.id}"
  resource_id   = "${aws_api_gateway_resource.test.id}"
  http_method   = "GET"
  authorization = "NONE"
}

resource "aws_api_gateway_integration" "integrationtest" {
  connection_type = "VPC_LINK"
  connection_id   = "${aws_api_gateway_vpc_link.myapi.id}"
  type = "HTTP"
  integration_http_method = "GET"
  rest_api_id = "${aws_api_gateway_rest_api.GOAPI.id}"
  resource_id = "${aws_api_gateway_resource.test.id}"
  http_method = "${aws_api_gateway_method.testmethod.http_method}"
  uri = "${format("https://%s:8000/", aws_lb.myapis.dns_name)}"
}

resource "aws_api_gateway_method_response" "test-200" {
  rest_api_id = "${aws_api_gateway_rest_api.GOAPI.id}"
  resource_id = "${aws_api_gateway_resource.test.id}"
  http_method = "${aws_api_gateway_method.testmethod.http_method}"
  status_code = "200"

  response_models = {
    "application/json" = "Empty"
  }
}

resource "aws_api_gateway_integration_response" "testintegrationresponse" {
  rest_api_id = "${aws_api_gateway_rest_api.GOAPI.id}"
  resource_id = "${aws_api_gateway_resource.test.id}"
  http_method = "${aws_api_gateway_method.testmethod.http_method}"

  status_code = "${aws_api_gateway_method_response.test-200.status_code}"

  response_templates = {
    "application/json" = ""
  }
}

resource "aws_api_gateway_deployment" "testdeploy" {
  depends_on = ["aws_api_gateway_integration.integrationtest"]

  rest_api_id = "${aws_api_gateway_rest_api.GOAPI.id}"
  stage_name = "v1"
}

resource "aws_ecs_cluster" "goapi" {
  name = "goapis"
}

data "aws_iam_role" "ecs_task_execution_role" {
  name = "ecsTaskExecutionRole"
}

resource "aws_ecs_task_definition" "test" {
  family                   = "test"
  requires_compatibilities = ["FARGATE"]
  network_mode = "awsvpc"
  cpu = 256
  memory = 512
  execution_role_arn = "${data.aws_iam_role.ecs_task_execution_role.arn}"

  container_definitions = "${file("test-service.json")}"
}

resource "aws_ecs_service" "test" {
  name            = "test-service"
  cluster         = "${aws_ecs_cluster.goapi.id}"
  task_definition = "${aws_ecs_task_definition.test.arn}"
  launch_type     = "FARGATE"
  desired_count   = 1

  network_configuration {
    subnets         = ["${module.vpc.private_subnets}"]
    security_groups = ["${aws_security_group.ecs_tasks.id}"]
  }
  load_balancer {
    target_group_arn = "${aws_lb_target_group.test.id}"
    container_name   = "test-service"
    container_port   = 8000
  }

    depends_on = [
    "aws_lb_listener.test",
  ]
}

Task Definiton:

[   
  {
    "name": "test-service",
    "image": "12345678910.dkr.ecr.us-east-1.amazonaws.com/myimages:latest",
    "cpu": 256,
    "memory": 512,
    "essential": true,
    "portMappings": [
      {
        "containerPort": 8000,
        "hostPort": 8000
      }
    ]
  }
]

Screenshots:

enter image description here

enter image description here

1 Ответ

0 голосов
/ 25 сентября 2019

РЕДАКТИРОВАТЬ Похоже, что ответ пришел около здесь , возможно, стоит осудить это сообщение.

Если вы не успешно SIGV4 Подписание ваших запросов с аутентификацией IAM на вашемПри запросе метода или при сопоставлении пользовательских ответов шлюза в случае сбоев аутентификации, API-шлюз не будет возвращать 404, а также не будет NLB, поэтому этот ответ должен приходить из-за NLB в этом стеке.Вы сможете подтвердить это, просмотрев журналы API Gateway CloudWatch (включить полные данные запросов / ответов на этапе).

ПРИМЕЧАНИЕ. Вы должны сопоставить идентификатор запроса в своем CloudWatch.регистрирует в заголовке ответа API GW "x-amzn-requesttid", например:

x-amzn-requesttid: 7cc765bb-4086-45f4-9450-1a2a3c4e67d5

В журналах вы должны увидеть что-то вроде «Отправка запроса ...» или строку об ответе, который он получает от этого запроса.Это указывает на то, что API-шлюз получил запрос, отправил его бэкэнд-интеграции и получил взамен 404.

Я бы сказал, что следующие шаги - реализовать отладочную регистрацию в вашей интеграции для регистрации поступающих запросов.в, и свойства этих запросов, чтобы вы могли определить, где разбивка.Похоже, запрос на URI, на который ваше приложение не настроено отвечать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...