내용으로 건너뛰기

API Gateway를 다른 AWS 서비스의 프록시로 사용하려면 어떻게 해야 하나요?

8분 분량
0

Amazon API Gateway를 다른 AWS 서비스의 프록시로 사용하고 다른 서비스를 API Gateway와 통합하고 싶습니다.

해결 방법

참고: AWS Command Line Interface(AWS CLI) 명령 실행 시 오류가 발생하는 경우, AWS CLI 오류 문제 해결을 참고하십시오. 또한 최신 AWS CLI 버전을 사용하고 있는지 확인하십시오.

AWS 서비스 API는 HTTPS 요청을 수행할 수 있는 REST API입니다. 다른 서비스를 API Gateway와 통합하려면 API Gateway에서 서비스 API로 HTTPS 요청을 빌드하십시오. 이 방법을 사용하면 모든 요청 파라미터가 올바르게 매핑됩니다.

이 해결 방법은 API Gateway를 사용하여 Amazon Simple Notification Service(Amazon SNS) Publish API와 통합할 때의 예제 설정을 설명합니다. API Gateway를 다른 서비스와 통합할 때 사용할 방법의 개요로 다음 예제를 사용하십시오.

필요한 도구 및 리소스 설정

환경을 구성하고 사용 사례에 필요한 모든 AWS 리소스를 만드십시오. Amazon SNS 예제 설정의 경우 다음 단계를 완료하십시오.

  1. AWS CLI를 설치합니다.

  2. Amazon SNS 주제를 만듭니다. 주제의 Amazon 리소스 이름(ARN)을 기록해 둡니다.

  3. 주제에 대한 구독을 만듭니다.

  4. AWS Identity and Access Management(IAM) 콘솔을 연 다음, AWS 서비스 프록시 실행 역할을 만듭니다. Amazon SNS 예제 설정의 경우 sns:Publish 작업을 허용합니다. 자세한 내용은 API Gateway의 REST API에 대한 액세스 제어 및 관리를 참조하십시오.

  5. API Gateway REST API를 만들려면 테스트 리소스를 사용합니다. 자세한 내용과 예제는 Amazon API Gateway 자습서 및 워크숍을 참조하십시오.

  6. REST API를 가져오려면 다음 OpenAPI 2.0(Swagger) 정의 예제를 사용합니다.

    {  "swagger": "2.0",
      "info": {
        "version": "2019-10-09T14:10:24Z",
        "title": "aws-service-integration"
      },
      "basePath": "/dev",
      "schemes": [
        "https"
      ],
      "paths": {
        "/test": {
          "post": {
            "produces": [
              "application/json"
            ],
            "parameters": [
              {
                "name": "Message",
                "in": "query",
                "required": true,
                "type": "string"
              },
              {
                "name": "TopicArn",
                "in": "query",
                "required": true,
                "type": "string"
              }
            ],
            "responses": {
              "200": {
                "description": "200 response",
                "schema": {
                  "$ref": "#/definitions/Empty"
                }
              }
            },
            "x-amazon-apigateway-integration": {
              "credentials": "arn:aws:iam::account-id:role/apigateway-sns-role",
              "uri": "arn:aws:apigateway:your-region:sns:action/Publish",
              "responses": {
                "default": {
                  "statusCode": "200"
                }
              },
              "requestParameters": {
                "integration.request.header.Content-Type": "'application/x-www-form-urlencoded'"
              },
              "requestTemplates": {
                "application/json": {
                  "Fn::Sub": "Action=Publish&TopicArn=$util.urlEncode('${**YOUR-TOPIC-ARN**}')&Message=$util.urlEncode($input.body)##"
                }
              },
              "passthroughBehavior": "when_no_match",
              "httpMethod": "POST",
              "type": "aws"
            }
          }
        }
      },
      "definitions": {
        "Empty": {
          "type": "object",
          "title": "Empty Schema"
        }
      }
    }

    참고: arn:aws:iam::account-id:role/apigateway-sns-role을 IAM 역할의 ARN으로 바꾸고 YOUR-TOPIC-ARN을 SNS 주제의 ARN으로 바꾸십시오.

위 옵션은 Amazon SNS 예제 설정에 대한 설정을 미리 구성합니다. REST API를 만들려면 your-region을 AWS 리전으로 바꾸십시오. 자세한 내용은 OpenAPI란 무엇입니까?를 참조하십시오.

HTTPS 요청 예제 가져오기

통합하는 서비스 API의 HTTPS 요청 예제는 API Gateway에서 요청 파라미터를 매핑하는 데 도움이 될 수 있습니다.

Amazon SNS Publish API의 경우 해당 서비스의 API 참조에서 요청 예제를 참조하십시오.
HTTPS 요청을 가져오려면 다음 예제 요청을 실행합니다.

https://sns.us-west-2.amazonaws.com/?Action=Publish&TargetArn=arn%3Aaws%3Asns%3Aus-west-2%3A803981987763%3Aendpoint%2FAPNS\_SANDBOX%2Fpushapp%2F98e9ced9-f136-3893-9d60-776547eafebb&Message=%7B%22default%22%3A%22This+is+the+default+Message%22%2C%22APNS\_SANDBOX%22%3A%22%7B+%5C%22aps%5C%22+%3A+%7B+%5C%22alert%5C%22+%3A+%5C%22You+have+got+email.%5C%22%2C+%5C%22badge%5C%22+%3A+9%2C%5C%22sound%5C%22+%3A%5C%22default%5C%22%7D%7D%22%7D
&Version=2010-03-31
&AUTHPARAMS

- 또는 -
API 직접 호출에서 예제를 생성합니다. AWS CLI를 사용하여 서비스 API를 직접적으로 호출한 다음, 출력을 분석합니다. 통합하려는 서비스 API에 대한 관련 AWS CLI 명령을 확인한 다음, —debug 옵션을 사용하여 테스트 요청을 실행합니다.

API 직접 호출에서 예제를 생성하려면 다음 publish 명령을 실행합니다.

aws sns publish --topic-arn arn:aws:sns:us-east-1:123456789012:test --message "hi" --debug

참고: arn:aws:sns:us-east-1:123456789012:test를 Amazon SNS 주제의 ARN으로 바꾸십시오.

출력 예시:

2018-11-22 11:56:39,647 - MainThread - botocore.client - DEBUG - Registering retry handlers for service: sns2018-11-22 11:56:39,648 - MainThread - botocore.hooks - DEBUG - Event before-parameter-build.sns.Publish: calling handler <function generate\_idempotent\_uuid at 0x11093d320>2018-11-22 11:56:39,649 - MainThread - botocore.endpoint - DEBUG - Making request for OperationModel(name=Publish) (verify\_ssl=True) with params: {'body': {'Action': u'Publish', u'Message': u'hello', 'Version': u'2010-03-31', u'TopicArn': u'arn:aws:sns:us-east-1:123456789012:test'}, 'url': u'https://sns.us-east-1.amazonaws.com/', 'headers': {'Content-Type': 'application/x-www-form-urlencoded; charset=utf-8', 'User-Agent': 'aws-cli/1.15.74 Python/2.7.14 Darwin/16.7.0 botocore/1.9.23'}, 'context': {'auth\_type': None, 'client\_region': 'us-east-1', 'has\_streaming\_input': False, 'client\_config': <botocore.config.Config object at 0x1118437d0>}, 'query\_string': '', 'url\_path': '/', 'method': u'POST'}
2018-11-22 11:56:39,650 - MainThread - botocore.hooks - DEBUG - Event request-created.sns.Publish: calling handler <bound method RequestSigner.handler of <botocore.signers.RequestSigner object at 0x111843750>>
2018-11-22 11:56:39,650 - MainThread - botocore.hooks - DEBUG - Event choose-signer.sns.Publish: calling handler <function set\_operation\_specific\_signer at 0x11093d230>
2018-11-22 11:56:39,650 - MainThread - botocore.auth - DEBUG - Calculating signature using v4 auth.
2018-11-22 11:56:39,651 - MainThread - botocore.auth - DEBUG - CanonicalRequest:
POST
/

content-type:application/x-www-form-urlencoded; charset=utf-8
host:sns.us-east-1.amazonaws.com
x-amz-date:20181122T062639Z
content-type;host;x-amz-date

출력에는 HTTPS 요청, 전달된 헤더가 포함되며 요청은 POST HTTP 메서드입니다.

API Gateway API용 메서드 만들기

다음 단계를 완료하십시오.

  1. API Gateway 콘솔을 엽니다.
  2. 탐색 창에서 API를 선택한 다음, API의 이름을 선택합니다.
  3. 리소스 창에서 리소스를 선택합니다. Amazon SNS 예제 설정의 경우 만든 테스트 리소스를 선택합니다.
  4. 메서드 생성을 선택합니다.
  5. 새 창에서 다음을 수행합니다.
    HTTPS 요청 예제에서 서비스 API가 사용하는 메서드를 선택합니다.
    Amazon SNS 예제 설정의 경우 POST를 선택합니다.
    통합 유형에서 AWS 서비스를 선택합니다.
    AWS 리전에서 통합하려는 서비스 API와 연결된 리소스의 AWS 리전을 선택합니다.
    Amazon SNS 예제 설정의 경우 SNS 주제의 리전을 선택합니다.
    AWS 서비스에서 API Gateway와 통합할 서비스를 선택합니다. 예를 들어 Simple Notification Service(SNS) 서비스를 사용합니다.
    AWS 하위 도메인에 AWS 서비스에서 사용하는 하위 도메인을 입력합니다. 서비스 문서를 참조하여 하위 도메인의 가용성을 확인합니다.
    Amazon SNS 예제 설정의 경우 필드를 비워 둡니다.
    HTTP 메서드에서 통합하려는 AWS 서비스 API에 해당하는 메서드를 선택합니다.
    Amazon SNS 예제 설정의 경우 POST를 선택합니다.
    작업 유형에서 통합할 서비스 API가 지원되는 작업인 경우 작업 이름 사용을 선택합니다. 서비스의 API 참조에서 지원되는 작업 목록을 확인합니다.
    Amazon SNS의 경우 작업을 참조하십시오.
    작업에 서비스 API의 이름을 입력합니다. Amazon SNS 예제 설정의 경우 게시를 입력합니다.
    -또는-
    AWS 서비스 API가 요청의 리소스 경로를 예상하는 경우 작업 유형에서 경로 재정의 사용을 선택합니다. 예를 들어, Amazon Polly ListLexicons API의 경우 **경로 재정의(선택 사항)**에 /v1/lexicons를 입력합니다.
    실행 역할의 경우 생성한 IAM 역할의 ARN을 입력합니다.
  6. 메서드 생성을 선택합니다.

메서드 요청에 대한 파라미터 만들기

통합할 서비스 API의 필수 및 선택적 요청 파라미터를 결정합니다. 이러한 파라미터를 식별하려면 앞서 받은 HTTPS 요청 예제를 참조하거나 서비스 API에 대한 API 참조를 확인하십시오. 예를 들어 게시를 참조하십시오.

다음 단계를 완료하십시오.

  1. API Gateway 콘솔을 엽니다.
  2. 탐색 창에서 API를 선택한 다음, API의 이름을 선택합니다.
  3. 리소스 페이지에서 메서드 유형을 선택합니다.
  4. 메서드 요청 탭을 선택한 다음, 편집을 선택합니다.
  5. 요청 검사기 드롭다운 목록을 선택하고 본문, 문자열 파라미터 및 헤더 검증을 선택합니다.
  6. URL 쿼리 문자열 파라미터를 확장하고 쿼리 문자열 추가를 선택합니다.
  7. 이름에 통합하려는 서비스 API의 요청 파라미터 이름을 입력합니다. Amazon SNS 예제 설정의 경우 TopicArn이라는 파라미터와 Message라는 파라미터를 만듭니다.
  8. (선택 사항) 파라미터가 필요한 경우 필수 아래의 확인란을 선택합니다.
  9. 저장을 선택합니다.

자세한 내용은 API Gateway 콘솔을 사용하여 메서드 설정을 참조하십시오.

참고: 일부 서비스 API의 경우 통합 요청에 필수 파라미터 외에 필수 헤더와 본문을 전송해야 합니다. 통합 요청 창의 HTTP 요청 헤더요청 본문 아래에서 헤더와 본문을 만들 수 있습니다.

예를 들어, Amazon Rekognition ListCollections API를 통합하는 경우 헤더 X-Amz-Target: RekognitionService.ListCollections를 만드십시오.

코드 요청 예시:

POST https://rekognition.us-west-2.amazonaws.com/ HTTP/1.1    Host: rekognition.us-west-2.amazonaws.com    Accept-Encoding: identity
    Content-Length: 2
    X-Amz-Target: RekognitionService.ListCollections
    X-Amz-Date: 20170105T155800Z
    User-Agent: aws-cli/1.11.25 Python/2.7.9 Windows/8 botocore/1.4.82
    Content-Type: application/x-amz-json-1.1
    Authorization: AWS4-HMAC-SHA256 Credential=XXXXXXXX/20170105/us-west-2/rekognition/aws4_request,
      SignedHeaders=content-type;host;x-amz-date;x-amz-target, Signature=XXXXXXXX

    {}

Amazon Simple Queue Service(Amazon SQS) SendMessage API와 통합하는 경우 매핑 표현식 method.request.body.JSONPath_EXPRESSION을 사용하는 요청 본문을 매핑합니다. (JSONPath_EXPRESSION을 요청 본문의 JSON 필드에 대한 JSONPath 표현식으로 바꾸십시오.)

코드 요청 예시:

{'url_path': '/', 'query_string': '', 'method': 'POST','headers': {'Content-Type': 'application/x-www-form-urlencoded; charset=utf-8', 'User-Agent': 'aws-cli/1.16.81 Python/3.6.5 Darwin/18.7.0 botocore/1.12.183'},
'body': {'Action': 'SendMessage', 'Version': '2012-11-05', 'QueueUrl': 'https://sqs.ap-southeast-2.amazonaws.com/123456789012/test01', 'MessageBody': 'Hello'},
'url': 'https://ap-southeast-2.queue.amazonaws.com/', 'context': {'client_region': 'ap-southeast-2', 'client_config': <botocore.config.Config object at 0x106862da0>, 'has_streaming_input': False, 'auth_type': None}}

통합 요청에 대한 파라미터 만들기

메서드 요청에 대해 만든 파라미터를 통합 요청의 파라미터에 매핑합니다.

다음 단계를 완료하십시오.

  1. API Gateway 콘솔을 엽니다.
  2. 탐색 창에서 API를 선택한 다음, API의 이름을 선택합니다.
  3. 리소스 페이지에서 메서드 유형을 선택합니다.
  4. 통합 요청 탭을 선택한 후 편집을 선택합니다.
  5. URL 쿼리 문자열 파라미터를 확장한 다음, 쿼리 문자열 파라미터 추가를 선택합니다.
  6. 이름에 통합하려는 서비스 API의 요청 파라미터 이름을 입력합니다.
    참고: 이름은 대소문자를 구분하며 서비스 API에 필요한 것과 정확히 일치해야 합니다.
  7. 다음에서 매핑됨method.request.querystring.param_name을 입력합니다. param_name을 방법 요청에 대해 생성한 해당 매개변수의 이름으로 교체합니다. 예를 들면 method.request.querystring.TopicArn입니다.
  8. 메서드 요청에 대해 만든 각 파라미터에 해당하는 통합 요청의 파라미터를 만듭니다.
  9. 저장을 선택합니다.

참고: 메서드 요청에 필요한 헤더와 본문을 만든 경우 이를 통합 요청에 매핑하십시오. 메서드 요청에 필요한 헤더와 본문을 만들려면 HTTP 헤더매핑 템플릿 아래의 통합 요청 창으로 이동합니다.

자세한 내용은 API Gateway 콘솔을 사용하여 API 통합 요청 설정을 참조하십시오.

(선택 사항) 통합 구성 확인

통합 설정이 올바르게 구성되었는지 확인하려면 다음 get-integration 명령을 실행합니다.

aws apigateway get-integration --rest-api-id 1234123412 --resource-id y9h6rt --http-method POST

Amazon SNS 예제 설정의 경우 출력은 다음 코드 예제와 유사합니다.

{    "integrationResponses": {        "200": {
            "responseTemplates": {
                "application/json": null
            },
            "statusCode": "200"
        }
    },
    "passthroughBehavior": "WHEN_NO_MATCH",
    "timeoutInMillis": 29000,
    "uri": "arn:aws:apigateway:us-east-2:sns:action/Publish",
    "httpMethod": "POST",
    "cacheNamespace": "y9h6rt",
    "credentials": "arn:aws:iam::1234567890:role/apigateway-sns-role",
    "type": "AWS",
    "requestParameters": {
        "integration.request.querystring.TopicArn": "method.request.querystring.TopicArn",
        "integration.request.querystring.Message": "method.request.querystring.Message"
    },
    "cacheKeyParameters": []
}

더 큰 메시지 페이로드의 경우 API에서 다음과 같은 Amazon SNS 통합을 실행합니다.

"requestParameters": {       "integration.request.header.Content-Type": "'application/x-www-form-urlencoded'"
},
"requestTemplates" : {
    "application/json" : "Action=Publish&TopicArn=$util.urlEncode('<ourTopicArn>')&Message=$util.urlEncode($input.body)"
}

참고: Amazon SNS는 최대 헤더 크기인 16KB를 지원합니다. 요청을 통합에 전송하기 전에 요청 매핑 템플릿을 사용하여 수신 HTTP 요청을 다른 형식으로 변환하십시오. Amazon SNS 주제 ARN이 매핑 템플릿에 하드코딩되어 있으므로 클라이언트는 요청 시 SNS 주제 ARN을 전달하지 않습니다.

통합 구성을 확인하려면 다음 단계를 완료하십시오.

  1. API Gateway 콘솔을 엽니다.
  2. 탐색 창에서 API를 선택한 다음, API의 이름을 선택합니다.
  3. 리소스 페이지에서 메서드 유형을 선택한 다음, 테스트 탭을 선택합니다.
  4. 테스트 방법 페이지에서 다음 단계를 완료합니다.
    쿼리 문자열에 요청 파라미터와 쿼리 문자열 값이 포함된 쿼리 문자열을 입력합니다.
    Amazon SNS 통합의 경우 **TopicArn= arn:aws:sns:us-east-1:123456789012:test&Message="Hello"**를 입력합니다. arn:aws:sns:us-east-1:123456789012:test를 Amazon SNS 주제의 ARN으로 바꾸십시오.
    매핑 템플릿을 사용하는 Amazon SNS 통합의 경우 요청 본문에 메시지 페이로드 JSON 데이터를 입력한 다음, 테스트를 선택합니다.
    참고: 페이로드는 구성에 따라 달라집니다.
  5. 성공적인 응답을 받으면 REST API를 배포합니다.

관련 정보

튜토리얼: AWS 통합을 사용하여 REST API 만들기

API Gateway의 REST API 메서드

API Gateway의 REST API 통합

API Gateway의 REST API에 대한 파라미터 매핑 예제