9

でaws_api_gateway_integrationのための要求テンプレートを指定するには、次のパラメータがサポートされています。<a href="https://www.terraform.io/docs/providers/aws/r/api_gateway_integration.html">Terraform documentation for AWS_API_GATEWAY_INTEGRATION</a>でテラフォーム

  • をrest_api_idは
  • http_method
  • タイプ
  • URI
  • をintegration_http_method RESOURCE_ID

彼らはこの例を与える:

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

しかし、私はあなたがUIでできるように、マッピングテンプレート(同様にラムダ・インテグレーション)を指定したいと思います:

enter image description here

をしかし、私はTerraformでそれをする方法がない。それは可能ですか?

注:私が現在やっていることはapplyその他の構成(ラムダ、S3、IAMなど...)INGの、そしてその後、手動でマッピングテンプレートを追加する(と同様にラムダの積分型)されます。

しかし、私はterraform applyに他の設定(例:s3)を適用するたびに、Terraformはマッピングテンプレートと統合タイプを元に戻します。

"元に戻す" 計画は、次のようになります。

(あなたがのparams uritypeintegration_http_methodrequest_templatesを使用する必要があります):、ここで働くconfigです

~ 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" => "" 

答えて

11

this issueに基づいて、

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

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

私はこれのためにどこでも見てきた、どうもありがとうございました。私はヘッダーを網羅的に列挙しようとしていました。 – jstlaurent

1

、統合タイプは「AWS」になります。

ラムダインテグレーションの作成について説明しているthe AWS documentationです。

これは、Terraformを使用してこれを行う方法を示すa GitHub postです。

希望に役立ちます!ご不明な点がありましたらお知らせください。

1

あなたはむしろあなたが行うことができます別のテンプレートに比べて、それはインライン持たせたい場合は:

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 
} 
関連する問題