9

W Terraform documentation for AWS_API_GATEWAY_INTEGRATION, obsługiwane są następujące parametry:Określanie szablonu prośba o aws_api_gateway_integration w terraform

  • rest_api_id
  • RESOURCE_ID
  • http_method
  • typu
  • uri
  • integration_http_method

Dają poniższym przykładzie:

resource "aws_api_gateway_integration" "MyDemoIntegration" { 
    rest_api_id = "${aws_api_gateway_rest_api.MyDemoAPI.id}" 
    resource_id = "${aws_api_gateway_resource.MyDemoResource.id}" 
    http_method = "${aws_api_gateway_method.MyDemoMethod.http_method}" 
    type = "MOCK" 
} 

Ale chciałbym, aby określić szablon Mapping (jak również integrację lambda), jak można z UI:

enter image description here

jednak Nie widzę możliwości zrobienia tego z Terraform. Czy to możliwe?

Uwaga: Co Jestem obecnie robi się apply ing resztę konfiguracji (lambda, S3, iam etc ...), a następnie dodając szablon mapowania ręcznie potem (jak również rodzaj integracji lambda) .

Ale za każdym razem, gdy mogę terraform apply zastosować inną konfigurację (np. S3), Terraform powraca do szablonu mapowania i typu integracji.

z "powrotu" plan wygląda następująco:

~ aws_api_gateway_integration.post_hit_integration 
    request_templates.#:    "1" => "0" 
    request_templates.application/json: "{\n \"body\" : $input.json('$'),\n \"headers\": {\n #foreach($param in $input.params().header.keySet())\n \"$param\": \"$util.escapeJavaScript($input.params().header.get($param))\" #if($foreach.hasNext),#end\n \n #end \n },\n \"stage\" : \"$context.stage\"\n}" => "" 
    uri:        "arn:aws:apigateway:eu-west-1:lambda:path/2015-03-31/functions/arn:aws:lambda:eu-west-1:000000000000:function:create_hit/invocations" => "" 

Odpowiedz

11

podstawie this issue, tutaj jest config, który działa:

(Trzeba korzystać params uri, type, integration_http_method i request_templates)

# API 
resource "aws_api_gateway_rest_api" "my_api" { 
    name = "my_api" 
    description = "My Api for adding pets" 
} 

# Resource 
resource "aws_api_gateway_resource" "pets_resource" { 
    rest_api_id = "${aws_api_gateway_rest_api.my_api.id}" 
    parent_id = "${aws_api_gateway_rest_api.my_api.root_resource_id}" 
    path_part = "pets" 
} 

# Method 
resource "aws_api_gateway_method" "post_pet_method" { 
    rest_api_id = "${aws_api_gateway_rest_api.my_api.id}" 
    resource_id = "${aws_api_gateway_resource.pets_resource.id}" 
    http_method = "POST" 
    authorization = "NONE" 
} 

# Integration 
resource "aws_api_gateway_integration" "post_pet_integration" { 
    rest_api_id = "${aws_api_gateway_rest_api.my_api.id}" 
    resource_id = "${aws_api_gateway_resource.pets_resource.id}" 
    http_method = "${aws_api_gateway_method.post_pet_method.http_method}" 
    uri = "arn:aws:apigateway:${var.region}:lambda:path/2015-03-31/functions/${aws_lambda_function.create_pet.arn}/invocations" 
    type = "AWS"       # Documentation not clear 
    integration_http_method = "POST"  # Not documented 
    request_templates = {     # Not documented 
    "application/json" = "${file("api_gateway_body_mapping.template")}" 
    } 
} 

Zawartość: api_gate way_body_mapping.template:

{ 
    "body" : $input.json('$'), 
    "headers": { 
    #foreach($param in $input.params().header.keySet()) 
    "$param": "$util.escapeJavaScript($input.params().header.get($param))" #if($foreach.hasNext),#end 

    #end 
    }, 
    "stage" : "$context.stage" 
} 
+0

Szukałem wszędzie za to bardzo dziękuję. Miałem zamiar zacząć wyczerpująco wyliczać nagłówki. – jstlaurent

1

Jeśli używasz funkcji Lambda jako punktu końcowego, typ integracji byłoby „AWS”.

Oto the AWS documentation, który wyjaśnia tworzenie integracji Lambda.

Oto a GitHub post, który pokazuje, w jaki sposób można to zrobić za pomocą Terraform.

Nadzieję, że pomaga! Daj nam znać, jeśli masz jakieś pytania.

1

Jeśli chcesz mieć go inline zamiast w osobnym szablonie można zrobić:

request_templates = {     
    "application/json" = <<REQUEST_TEMPLATE 
    { 
    "body" : $input.json('$'), 
    "headers": { 
    #foreach($param in $input.params().header.keySet()) 
    "$param": "$util.escapeJavaScript($input.params().header.get($param))" #if($foreach.hasNext),#end 

    #end 
    }, 
    "stage" : "$context.stage" 
    } 
    REQUEST_TEMPLATE 
}