BLOG

사용자 지정 도메인 이름에 대한 API Gateway 사용자 지정 액세스 로그 분석
작성일: 2020-03-27

본 게시물의 원문은 AWS에서 클라우드 서포트 엔지니어를 역임하고 있는Taka Matsumoto에 의해 작성되었습니다.

 

Amazon API Gateway에서 사용자 지정 도메인 이름을 사용하려는 경우, 해당 도메인 이름으로 전송되는 요청에 대한 인사이트가 유용한 정보가 될 수 있습니다. Gateway는 요청 로그를 Amazon CloudWatch Logs로 전달할 수 있는 CloudWatch metrics와 옵션을 제공하지만, 사용자 지정 도메인 이름에 사전 정의된 매트릭이나 로그는 없습니다. 단일 API에 매핑된 사용자 지정 도메인 이름이 두 개 이상인 경우, 도메인 이름 별로 요청의 수량과 유형을 이해하면 요청 패턴을 파악하는데 도움이 될 수 있습니다.

 

API Gateway에서 사용자 지정 액세스 로깅 옵션을 이용하면 CloudWatch Logs Insights를 사용해 분석할 수 있는 사용자 정의 로그를 CloudWatch Logs로 전달 할 수 있습니다. 이번 블로그 게시글에선 API 사용자 지정 액세스 로깅을 위해 CloudWatch 로그 그룹을 생성하고, 분석을 위해 CloudWatch Logs Insights를 사용하는 방법을 단계별로 안내해 드리겠습니다.

 

 

개요

본 튜토리얼에서는 사용자 지정 액세스 로깅을 위한 CloudWatch 로그 그룹을 생성합니다. 그 후 사용자 지정 도메인 이름과 연결된 API 단계를 위한 사용자 정의 액세스 로깅을 실행합니다. 이에 사용될 IAM 역할은 CloudWatch, IAM, API Gateway에서 관련 리소스를 생성하고 업데이트 할 수 있어야 합니다. 또한 리전은 미국 동부 버지니아 북부(N. Virginia)로 설정합니다.

 

오늘 다룰 내용은 다음과 같습니다.

  1. CloudWatch 로그 그룹 생성
  2. 액세스 로깅을 위한 IAM 역할 생성
  3. 사용자 지정 액세스 로깅 사용
  4. 맞춤 도메인 이름을 사용한 API테스트
  5. CloudWatch Logs Insights에서의 로그 분석

 

  1. CloudWatch 로그 그룹 생성

API 단계에 대한 사용자 정의 액세스 로그를 실행하기 전에 CloudWatch 로그 그룹을 생성하여 사용자 정의 로그를 제공하십시오. 아래의 단계를 수행하여 APIGateway_CustomDomainLogs라는 로그 그룹을 생성하십시오.

  1. CloudWatch Logs console로 이동하십시오.
  2. Create log group을 클릭한 뒤에 이름을 APIGatewat_CustomDomainLogs로 설정하십시오. 로그 그룹을 생성에 대한 상세 내용은 Working with Log Groups and Log Streams를 확인해 주시기 바랍니다..

 

  1. 액세스 로그인을 위한IAM 역할 생성

API Gateway에서 CloudWatch Logs로 로그를 전송하려면 IAM 역할을 사용해야 합니다. API Gateway에 로그인할 수 있는 IAM역할이 아직 없는 경우 새 IAM역할을 생성하십시오.

  1. IAM console 콘솔로 이동하십시오
  2. Roles 아래 Create Role을 선택하십시오.
  3. API Gateway를 선택하고 Next:Permissions를 선택하십시오.
  4. 첨부 된 IAM 정책(AmazonAPIGatewayPushToCloudWatchLogs)은 가만히 두고 Next:Tags를 선택하십시오.
  5. 이번 튜토리얼에서는 태그가 필요하지 않습니다. 빈칸으로 두고 Next:Review 선택하십시오.
  6. 역할 이름을 APIGatewayCloudWatchLogsRole 로 지정하고 Create role를 선택하십시오.

 

  1. 사용자 지정 액세스 로그인

이제 사용자 정의 액세스 로깅을 실행하십시오. 사용자 지정 도메인 이름을 통해 호출하는 API 단계 중 하나를 선택하십시오.

  1. API Gateway에 CloudWatch 로그 역할이 설정되어 있지 않다면, API Gateway 설정 페이지로 이동하여 CloudWatch 로그 역할 ARN을 추가하십시오. IAM 역할과 ARN은 다음 형식을 따릅니다:

arn:aws:iam::123456789012:role/APIGatewayCloudWatchLogsRole.

  1. API 사용자 지정 도메인 이름을 가진 API의 경우 스테이지 페이지로 이동하여 Logs/Tracing 탭을 선택하십시오.
  2. 다음 필드 값을 입력하십시오:
  • CloudWatch Group의 경우 ARN을 추가하십시오. (예시: arn:aws:logs:us-east-1:123456789012:log-group:APIGateway_CustomDomainLogs)
  • Log 포멧인 경우 다음을 입력하십시오.

“RequestId”: “$context.requestId”,

    “DomainName”: “$context.domainName”,

   “APIId”: “$context.apiId”,

    “RequestPath”: “$context.path”,

    “RequestTime”: “$context.requestTime”,

    “SourceIp”: “$context.identity.sourceIp”,

    “ResourcePath”: “$context.resourcePath”,

    “Stage”: “$context.stage”

}

4. Save Changes를 선택하십시오.

Set up API Logging Using the API Gateway Console(API 게이트웨이 콘솔을 사용하여 API 로깅 설정하기)에서 사용자 지정 액세스 로깅 설정에 대해 더 자세히 배울 수 있습니다. 로그 형식 구성에서 $context 변수는 도메인 이름과 다른 API 요청 정보를 검색합니다. 이에 대한 상세 내용은 $context Variables for Data Models, Authorizers, Mapping Templates, and CloudWatch Access Logging(데이터 모델, Authorizer, 매핑 템플릿 및 CloudWatch 액세스 로깅을 위한 $context 변수)에 대하여 자세한 내용을 확인해 주시기 바랍니다.

 

 

  1. 사용자 지정 도메인을 사용한 API 호출 테스트

사용자 지정 로깅을 사용하도록 설정한 후에는 사용자 지정 도메인 이름을 사용하여 API를 합니다. 로그는 지정된 CloudWatch 로그 그룹에 곧 나타납니다. CloudWatch 로그 스트림의 샘플 응답은 다음과 같습니다.

{

    “RequestId”: “1b1ebe20-817f-11e9-a796-f5e0ffdcdac7”,

    “DomainName”: “test.example.com”,

    “APIId”: “12345abcde”,

    “RequestPath”: “/dev”,

    “RequestTime”: “28/May/2019:19:30:52 +0000”,

    “SourceIp”: “1.2.3.4”,

    “ResourcePath”: “/”,

    “Stage”: “dev”

}

 

 

  1. CloudWatch Logs Insights에서의 로그 분석

사용자 지정 액세스 로그를 설정한 후, 사용자 지정 도메인 이름을 사용하여 더 많은 인사이트를 얻을 수 있습니다.

  1. CloudWatch Logs Insight 콘솔로 이동하십시오
  2. 로그 그룹 텍스트 필드에서 CloudWatch log group를 선택한 뒤 APIGateway_CustomDomainLogs를 선택하십시오.
  3. 다음의 쿼리를 입력하십시오.

fields @timestamp, @message

| filter DomainName like /(?i)(test.example.com)/

이 쿼리는 test.example.com 이라는 사용자 지정 도메인에 대한 로그 항목 목록을 변환할 수 있습니다. 이 때 여러분의 사용자 지정 도메인 이름으로 값을 바꿔야 본인의 계정에서 실행할 수 있습니다.

 

네트워크 보안에서 웹 소켓 사용을 허용하지 않으면 CloudWatch Logs Insight 콘솔에 액세스할 수 없습니다. 대신 API를 사용하여 CloudWatch Logs Insights 쿼리 기능을 사용할 수 있습니다. 다음은  AWS CLI를 사용하는 몇 가지 예제 쿼리입니다.

 

  1. aws logs start-query 샘플 명령어

aws logs start-query –log-group-name APIGateway_CustomDomainLogs –start-time 1557085225000 –end-time 1559763625000 –query-string ‘fields @timestamp, @message | filter DomainName like /(?i)(test.example.com)/’

응답 예시:

{

    “queryId”: “a1234567-bfde-47c7-9d44-41ebed011c66”

}

aws logs start-query의 시작 쿼리 명령어에 관하여 자세한내용은 링크를 확인하십시오.

 

  1. aws logs get-query-results 쿼리 결과를 검색하기 위해 실행합니다. Aws logs get-query-result의 샘플 명령어 결과는 다음과 같습니다.

aws logs get-query-results –query-id a1234567-bfde-47c7-9d44-41ebed011c66

응답은 다음과 같습니다.

{

    “results”: [

        [

            {

                “field”: “@timestamp”,

                “value”: “2019-05-28 19:30:52.494”

            },

            {

                “field”: “@message”,

                “value”: “{\”RequestId\”: \”12345678-7cb3-11e9-8896-c30af5588427\”,\”DomainName\”:\”test.exmaple.com\”}”

            },

            {

                “field”: “@ptr”,

                “value”: “CmEKKAokOTYxNTQyNjM4MjQzOkFQSUdhdGV3YXlfQ3VzdG9tRG9tYWluEAISNRoYAgXM/KQtAAAAAA0L2foABc5YFyAAAAHSIAEoxviFhK4tMM+HhoSuLTgCQOoBSN4OUN4KEAAYAQ==”

            }

        ]

    ],

    “statistics”: {

        “recordsMatched”: 1.0,

        “recordsScanned”: 1.0,

        “bytesScanned”: 153.0

    },

    “status”: “Complete”

}

 

다른 쿼리를 사용하여 로그의 다른 속성을 기준으로 결과를 필터링할 수 있습니다. aws logs get-query-results링크를 통해 get-query-results 명령어를 더 자세히 배우실 수 있습니다.오.

 

 

글을 마치며….

이 블로그 게시물에서는 API Gateway에서 CloudWatch Logs로 사용자 지정 액세스 로그를 제공하는 방법을 보여 준다. 또한 CloudWatch Logs Insight를 사용하여 사용자 지정 도메인 이름 메트릭용 로그에 대한 쿼리를 실행하는 과정을 보여줌으로써 사용자 지정 도메인 이름 사용량에 대한 인사이트를 제공하는 방법에 대해 설명해 드렸습니다.

 

쿼리 구문에 대해 더욱 자세히 알고 싶으시다면 CloudWatch Logs Insights Query Syntax을 참고해 주시기 바랍니다.

 

원문URL: https://aws.amazon.com/ko/blogs/compute/analyzing-api-gateway-custom-access-logs-for-custom-domain-names/

 

** 메가존 클라우드 TechBlog는 AWS BLOG 영문 게재 글 중에서 한국 사용자들에게 유용한 정보 및 콘텐츠를 우선적으로 번역하여 내부 엔지니어 검수를 받아서, 정기적으로 게재하고 있습니다. 추가로 번역 및 게재를 희망하는 글에 대해서 관리자에게 메일 또는 SNS 페이지에 댓글을 남겨주시면, 우선적으로 번역해서 전달해드리도록 하겠습니다.