web-dev-qa-db-fra.com

Dans Terraform, comment spécifiez-vous un point de terminaison API Gateway avec une variable dans le chemin de demande?

Dans AWS API Gateway, j'ai un point de terminaison défini comme "/ users/{userId}/someAction" et j'essaie de le recréer avec terraform.

Je voudrais commencer à avoir une sorte de chaîne liée gateway_resource comme si ...

resource "aws_api_gateway_resource" "Users" {
  rest_api_id = "${var.rest_api_id}" 
  parent_id = "${var.parent_id}" 
  path_part = "users"
}

//{userId} here?

resource "aws_api_gateway_resource" "SomeAction" {
  rest_api_id = "${var.rest_api_id}" 
  parent_id = "${aws_api_gateway_resource.UserIdReference.id}"
  path_part = "someAction"
}

Dans lequel je définis ensuite aws_api_gateway_method et tout le reste.

Comment définir ce point de terminaison dans terraform? La documentation et les exemples de terraform ne couvrent pas ce cas d'utilisation.

19
iquestionshard

Vous devez définir un ressource dont path_part est le paramètre que vous souhaitez utiliser:

// List
resource "aws_api_gateway_resource" "accounts" {
    rest_api_id = "${var.gateway_id}"
    parent_id   = "${aws_api_gateway_resource.finance.id}"
    path_part   = "accounts"
}

// Unit
resource "aws_api_gateway_resource" "account" {
  rest_api_id = "${var.gateway_id}"
  parent_id   = "${aws_api_gateway_resource.accounts.id}"
  path_part   = "{accountId}"
}

Ensuite, vous créez les paramètres méthode et enable the path:

resource "aws_api_gateway_method" "get-account" {
  rest_api_id   = "${var.gateway_id}"
  resource_id   = "${var.resource_id}"
  http_method   = "GET"
  authorization = "NONE"

  request_parameters {
    "method.request.path.accountId" = true
  }
}

Et enfin, vous pouvez créer avec succès le mappage dans la intégration :

resource "aws_api_gateway_integration" "get-account-integration" {
    rest_api_id             = "${var.gateway_id}"
    resource_id             = "${var.resource_id}"
    http_method             = "${aws_api_gateway_method.get-account.http_method}"
    type                    = "HTTP"
    integration_http_method = "GET"
    uri                     = "/integration/accounts/{id}"
    passthrough_behavior    = "WHEN_NO_MATCH"

    request_parameters {
        "integration.request.path.id" = "method.request.path.accountId"
    }
}

La méthode doit être présente - et avec le paramètre activé - pour que le mappage d'intégration fonctionne.

28
pesama

Je ne peux pas commenter à cause de moins de réputation, mais en ajoutant à la réponse ci-dessus, vous pouvez changer le parent_id pour qu'il pointe vers le aws_api_gateway_resource qui contient le paramètre dynamique.

1
naren