Есть ли альтернатива использованию атрибута "body" для использования OpenAPI / Swagger с "aws_api_gateway_rest_api"? - PullRequest
0 голосов
/ 03 мая 2020

Я использую terraform для создания "aws_api_gateway_rest_api". Я хотел бы использовать OpenAPI / Swagger для определения API. Прямо сейчас я использую «template_file» для генерации окончательного OpenAPI JSON в качестве атрибута тела. Примерно так:

resource "aws_api_gateway_rest_api" "myapi" {
  name        = "MYAPI"
  endpoint_configuration {
    types = ["REGIONAL"]
  }
  binary_media_types = [
    "application/json"
  ]
  body = "${data.template_file.swagger.rendered}"
}

Это работает нормально, если у меня также нет авторизатора:

resource "aws_api_gateway_authorizer" "cognito_authorizer" {
  name            = "cognito-authorizer"
  rest_api_id     = aws_api_gateway_rest_api.myapi.id
  identity_source = "method.request.header.Authorization"
  type            = "COGNITO_USER_POOLS"
  provider_arns   = ["${aws_cognito_user_pool.pool.arn}"]
}

Ссылка на авторизатор в файле определения API по имени:

"security": [
                    {
                        "cognito-authorizer": [
                            "cognito-authorizer"
                        ]
                    }
                ],

Очевидная проблема заключается в том, что terraform развертывает ресурсы и методы API до , когда был создан авторизатор:

  1. Создайте API и все ресурсы, методы (на которые ссылается Authorizer нет существует еще)
  2. Создать авторизатор

Terraform "apply" не показывает никаких проблем, но в развернутых методах API нет авторизатора.

Проблема существует только при использовании атрибута "body". Если я определяю ресурсы API, методы и интеграции непосредственно в terraform, зависимости можно разрешить очень хорошо, так как порядок создания:

  1. Создать ресурс API
  2. Создать авторизатор
  3. Создание ресурсов, методов и интеграций (ссылочный авторизатор существует)

Мне нужен ресурс terraform, который выполняет те же функции, что и атрибут body, но отдельно от создания API. Есть ли альтернатива использованию атрибута "body" для использования OpenAPI / Swagger с "aws_api_gateway_rest_api"?

1 Ответ

0 голосов
/ 04 мая 2020

Возможно создание авторизаторов с использованием OpenAPI, поэтому их не нужно создавать в terraform. Я случайно узнал об этом, используя функцию экспорта в консоли при попытке конвертировать мои api. json в OpenAPI 3.0. В OpenAPI 3.0 объявление выглядит как фрагмент кода из моего файла шаблона ниже. У меня есть два авторизатора, один из вопроса и пользовательский, который я включаю сюда, так как он может кому-то помочь:

"components": {
    "securitySchemes": {
      "cognito-authorizer": {
        "type": "apiKey",
        "name": "Authorization",
        "in": "header",
        "x-amazon-apigateway-authtype": "cognito_user_pools",
        "x-amazon-apigateway-authorizer": {
          "providerARNs": [
            "${cognito_userpool}"
          ],
          "type": "cognito_user_pools"
        }
      },
      "tenant_authorizer": {
        "type": "apiKey",
        "name": "Authorization",
        "in": "header",
        "x-amazon-apigateway-authtype": "custom",
        "x-amazon-apigateway-authorizer": {
          "authorizerUri": "${authorizer_uri}",
          "authorizerCredentials": "${authorizer_credentials}",
          "authorizerResultTtlInSeconds": 300,
          "type": "token"
        }
      }
    }
  }
...