간단한 REST API 게이트웨이 선언 - Terraform

12753 단어
최근에 Terraform을 사용하여 AWS에서 REST API 게이트웨이를 만들어야 했습니다. 설명서는 훌륭하지만 무엇을 해야 하는지 이해하기 위해 페이지를 탐색하면서 시간이 좀 걸렸습니다. 여기 그 연구의 이력서가 있습니다.

Note : For HTTP and Websockets API Gateway, there is another of the Terraform scripts.




기본 - API Gateway Rest API



Terraform Documentation

최소한의 형태로 게이트웨이는 매우 간단합니다.

resource "aws_api_gateway_rest_api" "example" {
  name = "example"
}


그러나 다음과 같은 선택적 요소가 많이 있습니다.

  • description : API에 대한 빠른 설명

  • body : OpenAPI Specification 으로 노출된 API 서비스를 노출합니다.

  • endpoint_configuration : 끝점 구성 유형 정의
    끝점 구성을 선택하는 방법: https://docs.aws.amazon.com/en_en/apigateway/latest/developerguide/api-gateway-api-endpoint-types.html
  • ...

  • resource "aws_api_gateway_rest_api" "example" {
      body = jsonencode({
        openapi = "3.0.1"
        info = {
          title   = "example"
          version = "1.0"
        }
        paths = {
          "/path1" = {
            get = {
              x-amazon-apigateway-integration = {
                httpMethod           = "GET"
                payloadFormatVersion = "1.0"
                type                 = "HTTP_PROXY"
                uri                  = "https://ip-ranges.amazonaws.com/ip-ranges.json"
              }
            }
          }
        }
      })
    
      description = "Example of an API Gateway"
      name        = "example"
    
      endpoint_configuration {
        types = ["REGIONAL"]
      }
    }
    
    



    수신 정책 - API Gateway Rest API 정책



    Terraform documentation

    인그레스 정책의 정의는 인그레스 액세스를 관리하는 데 도움이 될 수 있습니다. 보안 그룹을 API 게이트웨이에 적용할 수 없기 때문에 정말 유용할 수 있습니다.

    이 예에서는 IP 범위 10.0.0.0/24 및 10.10.0.0/24에 대한 API 게이트웨이만 엽니다.

    resource "aws_api_gateway_rest_api_policy" "test" {
      rest_api_id = aws_api_gateway_rest_api.test.id
    
      policy = <<EOF
    {
        Version = "2012-10-17",
        Statement = [{
            Effect = "Deny",
            Principal = "*",
            Action = "execute-api:Invoke",
            Resource = "execute-api:/*/*/*"
          },
          {
            Effect = "Allow",
            Principal = "*",
            Action = "execute-api:Invoke",
            Resource = "execute-api:/*/*/*",
            Condition = {
              NotIpAddress = {
                "aws:SourceIp" = ["10.0.0.0/24", "10.10.0.0/24"]
              }
            }
          }
        ]
      }
    EOF
    



    노출된 리소스 정의



    경로 선언 - API 게이트웨이 리소스



    Terraform documentation

    Resource 요소는 노출하려는 모든 경로를 정의합니다.

    예를 들어 보겠습니다.

    다음과 같은 경로가 있습니다.
  • /사용자
  • /추가
  • /목록

  • /카드
  • /재생
  • /보내기


  • 두/users 경로는 동일한 서비스의 메서드를 노출하지만 각/card는 서로 다른 메서드를 노출합니다.

    이를 위해서는 먼저/users에 대한 리소스와/cards에 대한 리소스를 만들어야 합니다.

    resource "aws_api_gateway_resource" "usersResource" {
      rest_api_id = aws_api_gateway_rest_api.MyDemoAPI.id
      parent_id   = aws_api_gateway_rest_api.MyDemoAPI.root_resource_id # In this case, the parent id should the gateway root_resource_id.
      path_part   = "users"
    }
    
    resource "aws_api_gateway_resource" "cardsResource" {
      rest_api_id = aws_api_gateway_rest_api.MyDemoAPI.id
      parent_id   = aws_api_gateway_rest_api.MyDemoAPI.root_resource_id
      path_part   = "cards"
    }
    


    그런 다음 서로 다른 끝점을 노출하는 각 하위 경로에 대해 다른 리소스를 만들어야 했습니다. (각 사용자 경로에 대해 다른 리소스를 수행할 수 있습니다.)

    resource "aws_api_gateway_resource" "playCardResource" {
      rest_api_id = aws_api_gateway_rest_api.MyDemoAPI.id
      parent_id   = aws_api_gateway_resource.cardsResource.id # In this case, the parent id should be the parent aws_api_gateway_resource id.
      path_part   = "play"
    }
    
    resource "aws_api_gateway_resource" "sendCardResource" {
      rest_api_id = aws_api_gateway_rest_api.MyDemoAPI.id
      parent_id   = aws_api_gateway_resource.cardsResource.id
      path_part   = "send"
    }
    



    메서드 선언 - API 게이트웨이 메서드



    Terraform documentation

    각 경로에 사용 가능한 모든 메서드를 선언합니다.

    /cards/send에 대해 GET 메서드만 허용하는 예

    resource "aws_api_gateway_method" "MyDemoMethod" {
      rest_api_id   = aws_api_gateway_rest_api.MyDemoAPI.id
      resource_id   = aws_api_gateway_resource.sendCardResource.id
      http_method   = "GET"
      authorization = "NONE"
    }
    


    원하는 경우 Cognito 또는 IAM으로 자동 인증을 확인하는 방법을 정의할 수 있습니다.


    엔드포인트 통합 - API 게이트웨이 통합



    Terraform Documentation

    이제 다양한 서비스와 엔드포인트를 통합합니다. 다음은 다른 예입니다.

    람다




    resource "aws_api_gateway_integration" "integration" {
      rest_api_id             = aws_api_gateway_rest_api.api.id
      resource_id             = aws_api_gateway_resource.resource.id
      http_method             = aws_api_gateway_method.method.http_method
      integration_http_method = "POST"
      type                    = "AWS_PROXY"
      uri                     = aws_lambda_function.lambda.invoke_arn
    }
    


    HTTP




    resource "aws_api_gateway_integration" "test" {
      rest_api_id = aws_api_gateway_rest_api.api_gateway_pmt_apis.id
      resource_id = aws_api_gateway_resource.api_gateway_ressource_all.id
      http_method = aws_api_gateway_method.aws_api_gateway_method_root.http_method
    
      type                    = "HTTP"
      uri                     = "https://www.google.de"
      integration_http_method = "GET"
    }
    


    모조품



    이 요소는 프런트엔드 서비스에 대한 메서드를 빠르게 노출하려는 경우에 매우 유용할 수 있습니다. 그러나 목을 완전히 정의하려면 두 개의 다음 요소가 필요합니다.

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



    모의 HTTP 응답 선언 - API 게이트웨이 메서드 응답



    Terraform Documentation

    통합을 조롱하려면 해당 응답을 선언해야 합니다.

    resource "aws_api_gateway_method_response" "response_200" {
      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
      status_code = "200"
    }
    



    모의 HTTP 응답 본문 선언 - API Gateway 통합 응답



    Terraform Documentation

    resource "aws_api_gateway_integration_response" "MyDemoIntegrationResponse" {
      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
      status_code = aws_api_gateway_method_response.response_200.status_code
    
      # Transforms the backend JSON response to XML
      response_templates = {
        "application/xml" = <<EOF
    #set($inputRoot = $input.path('$'))
    <?xml version="1.0" encoding="UTF-8"?>
    <message>
        $inputRoot.body
    </message>
    EOF
      }
    }
    



    그것이 당신을 도울 수 있기를 바랍니다!

    좋은 웹페이지 즐겨찾기