2016-08-19 32 views
11

W AWS API Gateway, mam punkt końcowy zdefiniowano jako „/ Users/{} userid/someAction”, a ja staram się odtworzyć to z terraformW aplikacji Terraform, w jaki sposób określasz punkt końcowy bramy API za pomocą zmiennej w ścieżce żądania?

chciałbym zacząć mając jakieś połączonego łańcucha gateway_resource jak tak ...

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" 
} 

W którym następnie określam metodę aws_api_gateway_method i wszystko inne.

Jak zdefiniować ten punkt końcowy w trybie terraform? Dokumentacja terraform i przykłady nie obejmują tego przypadku użycia.

Odpowiedz

14

Musisz określić zasób, którego path_part jest parametrem chcesz użyć:

// 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}" 
} 

Następnie należy utworzyć metodę i umożliwić parametr ścieżki:

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 
    } 
} 

I wreszcie cię można pomyślnie utworzyć mapowanie w ramach integracji:

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" 
    } 
} 

Musi tam być metoda - i przy włączonym parametrze - aby działało odwzorowanie integracji.

+1

Bardzo dobrze zrobione. Dziękuję Ci!! – knaak

+1

Czy nie dotyczy to tylko części 'users/{userId}' pytania OP? Obecnie stoi ten sam problem co oryginalne pytanie: udało się uzyskać 'resource/{resourceId}' działa, ale nie 'resource/{resourceId}/someAction'. Próbowałem utworzyć inny zasób w ramach zasobu '{pathId}', z własną metodą i integracją, ale otrzymałem komunikat "Brakujące token uwierzytelnienia" - co prowadzi mnie do podejrzeń, że tak naprawdę nic nie stworzyło. – yoaquim

0

Nie mogę komentować z powodu mniejszej reputacji, ale dodając do powyższej odpowiedzi, możesz zmienić parametr parent_id, aby wskazywał na aws_api_gateway_resource, który ma parametr dynamiczny.