Развертывание API-шлюза с помощью Terraform на основе файла Swagger - PullRequest
0 голосов
/ 05 января 2019

Я хочу развернуть свой шлюз API с помощью terraform, используя файл swagger для описания моего API. Swagger.yaml выглядит так:

swagger: '2.0'
info:
  version: '1.0'
  title: "CodingTips"
schemes:
  - https
paths:
  "/api":
    get:
      description: "Get coding tips"
      produces:
        - application/json
      x-amazon-apigateway-integration: ${apiIntegration}
      responses:
        '200':
          description: "Codingtips were successfully requested"

Terraform дает мне BadRequestException, говоря, что The REST API doesn't contain any methods.

Из-за этого я думаю, что он пытается развернуть API REST, не дожидаясь создания методов и интеграций этого API.

Это заставило меня задуматься о том, чтобы добавить DEPENDS_ON к aws_api_gateway_deployment. Однако я не знаю, от чего зависеть, так как я не определяю метод и ресурс интеграции с помощью сваггера. Они должны автоматически вычитаться из определения чванства.

Думал ли я в правильном направлении, и если да, то от чего я должен зависеть aws_api_gateway_deployment? Или что-то не так с тем, как я пытаюсь развернуть этот API.

Мой apigateway.tf файл выглядит так:

resource "aws_api_gateway_rest_api" "codingtips-api-gateway" {
  name        = "ServerlessExample"
  description = "Terraform Serverless Application Example"
  body        = "${data.template_file.codingtips_api_swagger.rendered}"
}

locals{
  "get_codingtips_arn" = "${aws_lambda_function.get-tips-lambda.invoke_arn}"

  "x-amazon-coding-tips-apigateway-integration" = <<EOF
#
uri = "${local.get_codingtips_arn}"
passthroughBehavior: when_no_match
httpMethod: POST
type: aws_proxy
credentials: "${aws_iam_role.api_gateway_role.arn}"
EOF
}

data "template_file" codingtips_api_swagger{
  template = "${file("./swagger.yaml")}"

  vars {
    apiIntegration = "${indent(8, local.x-amazon-coding-tips-apigateway-integration)}"
  }
}

resource "aws_api_gateway_deployment" "codingtips-api-gateway-deployment" {
  rest_api_id = "${aws_api_gateway_rest_api.codingtips-api-gateway.id}"
  stage_name  = "test"
}

Как мне починить BadRequestException: The REST API doesn't contain any methods?

1 Ответ

0 голосов
/ 05 января 2019

Я узнал, что случилось. Это синтаксическая ошибка в блоке locals{}. uri = должно быть uri:. Использование двоеточия вместо знака равенства. Блок выглядит следующим образом:

locals{
  "get_codingtips_arn" = "${aws_lambda_function.get-tips-lambda.invoke_arn}"

  "x-amazon-codingtips-get-apigateway-integration" = <<EOF
# comment for new line
uri: "${aws_lambda_function.get-tips-lambda.invoke_arn}"
passthroughBehavior: when_no_match
httpMethod: POST
type: aws_proxy
EOF
}

Исследуя это, я обнаружил, что он читается легче, когда вы задаете x-amazon-apigateway-integration в swagger.yaml следующим образом:

swagger: '2.0'
info:
  version: '1.0'
  title: "CodingTips"
schemes:
  - https
paths:
  "/api":
    get:
      description: "Get coding tips"
      produces:
        - application/json
      responses:
        '200':
          description: "The codingtips request was successful."
      x-amazon-apigateway-integration:
        uri: ${uri_arn}
        passthroughBehavior: "when_no_match"
        httpMethod: "POST"
        type: "aws_proxy"

Блоки data{} и locals{} в вашей терраформе выглядят следующим образом:

data "template_file" codingtips_api_swagger{
  template = "${file("swagger.yaml")}"

  vars {
    uri_arn = "${local.get_codingtips_arn}"
  }
}

locals {
  "get_codingtips_arn" = "${aws_lambda_function.get-tips-lambda.invoke_arn}"
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...