간단한 REST API 게이트웨이 선언 - Terraform
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"
}
그러나 다음과 같은 선택적 요소가 많이 있습니다.
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 요소는 노출하려는 모든 경로를 정의합니다.
예를 들어 보겠습니다.
다음과 같은 경로가 있습니다.
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
}
}
그것이 당신을 도울 수 있기를 바랍니다!
Reference
이 문제에 관하여(간단한 REST API 게이트웨이 선언 - Terraform), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/mxglt/declare-a-simple-rest-api-gateway-terraform-5ci5텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)