

# API Gateway에서 HTTP API 로깅 구성
<a name="http-api-logging"></a>

로깅을 활성화하여 CloudWatch Logs에 로그를 기록할 수 있습니다. [로깅 변수](http-api-logging-variables.md)를 사용하여 로그의 내용을 사용자 지정할 수 있습니다.

보안 태세를 개선하려면 HTTP API의 모든 단계에 대해 CloudWatch Logs에 로그를 작성하는 것이 좋습니다. 다양한 규정 준수 프레임워크를 준수하기 위해 이 작업을 수행해야 할 수 있습니다. 자세한 내용은 *AWS Security Hub 사용 설명서*에서 [Amazon API Gateway 제어](https://docs.aws.amazon.com/securityhub/latest/userguide/apigateway-controls.html)를 참조하세요.

HTTP API에 대한 로깅을 활성화하려면 다음을 수행해야 합니다.

1. 사용자가 로깅을 활성화하는 데 필요한 권한을 가지고 있는지 확인합니다.

1. CloudWatch Logs 로그 그룹을 생성합니다.

1. API 단계에 대한 CloudWatch Logs 로그 그룹의 ARN을 제공합니다.

## 로깅을 활성화하는 권한
<a name="http-api-logging.permissions"></a>

API에 대한 로깅을 활성화하려면 사용자는 다음과 같은 권한을 가지고 있어야 합니다.

**Example**    
****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "logs:DescribeLogGroups",
                "logs:DescribeLogStreams",
                "logs:GetLogEvents",
                "logs:FilterLogEvents"
            ],
            "Resource": "arn:aws:logs:{{us-east-2}}:{{123456789012}}:log-group:*"
        },
        {
            "Effect": "Allow",
            "Action": [
                "logs:CreateLogDelivery",
                "logs:PutResourcePolicy",
                "logs:UpdateLogDelivery",
                "logs:DeleteLogDelivery",
                "logs:CreateLogGroup",
                "logs:DescribeResourcePolicies",
                "logs:GetLogDelivery",
                "logs:ListLogDeliveries"
            ],
            "Resource": "*"
        }
    ]
}
```

## 로그 그룹 생성 및 HTTP API에 대한 로깅 활성화
<a name="http-api-enable-logging"></a>

AWS Management Console 또는 AWS CLI를 사용하여 로그 그룹을 생성하고 액세스 로깅을 활성화할 수 있습니다.

------
#### [ AWS Management Console ]

1.  로그 그룹 생성.

   콘솔을 사용하여 로그 그룹을 생성하는 방법을 알아보려면 [Amazon CloudWatch Logs 사용 설명서의 로그 그룹 생성](https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/Working-with-log-groups-and-streams.html)을 참조하세요.

1. [https://console.aws.amazon.com/apigateway](https://console.aws.amazon.com/apigateway)에서 API Gateway 콘솔에 로그인합니다.

1. HTTP API를 선택합니다.

1. 기본 탐색 패널의 **Monitor**(모니터링) 탭에서 **Logging**(로깅) 선택합니다.

1. 로깅을 활성화할 단계를 선택하고 **Select**(선택)를 선택합니다.

1. **Edit**(편집)을 선택하여 액세스 로깅을 활성화합니다.

1. **Access logging**(액세스 로깅)을 활성화하고 CloudWatch Logs를 입력한 다음 로그 형식을 선택합니다.

1. **저장**을 선택합니다.

------
#### [ AWS CLI ]

다음 [create-log-group](https://docs.aws.amazon.com/cli/latest/reference/logs/create-log-group.html) 명령은 로그 그룹을 생성합니다.

```
aws logs create-log-group --log-group-name {{my-log-group}}
```

로깅을 활성화하려면 로그 그룹의 Amazon 리소스 이름(ARN)이 필요합니다. ARN 형식은 arn:aws:logs:{{region}}: {{account-id}}:log-group:{{log-group-name}}입니다.

다음 [update-stage](https://docs.aws.amazon.com/cli/latest/reference/apigatewayv2/update-stage.html) 명령은 HTTP API의 `$default` 스테이지에 대한 로깅을 활성화합니다.

```
aws apigatewayv2 update-stage --api-id {{abcdef}} \
    --stage-name '{{$default}}' \
    --access-log-settings '{"DestinationArn": "arn:aws:logs:{{region}}:{{account-id}}:log-group:{{log-group-name}}", "Format": "$context.identity.sourceIp - - [$context.requestTime] \"$context.httpMethod $context.routeKey $context.protocol\" $context.status $context.responseLength $context.requestId"}'
```

------

## 로그 형식 예
<a name="http-api-enable-logging.examples"></a>

일반적으로 사용되는 몇 가지 액세스 로그 형식의 예제가 API Gateway 콘솔에 표시되며 다음과 같이 나열됩니다.
+ `CLF`([Common Log Format](https://httpd.apache.org/docs/current/logs.html#common)):

  ```
  $context.identity.sourceIp - - [$context.requestTime] "$context.httpMethod $context.routeKey $context.protocol" $context.status $context.responseLength $context.requestId $context.extendedRequestId
  ```
+  `JSON`: 

  ```
  { "requestId":"$context.requestId", "ip": "$context.identity.sourceIp", "requestTime":"$context.requestTime", "httpMethod":"$context.httpMethod","routeKey":"$context.routeKey", "status":"$context.status","protocol":"$context.protocol", "responseLength":"$context.responseLength", "extendedRequestId": "$context.extendedRequestId" }
  ```
+ `XML`: 

  ```
  <request id="$context.requestId"> <ip>$context.identity.sourceIp</ip> <requestTime>$context.requestTime</requestTime> <httpMethod>$context.httpMethod</httpMethod> <routeKey>$context.routeKey</routeKey> <status>$context.status</status> <protocol>$context.protocol</protocol> <responseLength>$context.responseLength</responseLength> <extendedRequestId>$context.extendedRequestId</extendedRequestId> </request>
  ```
+ `CSV`(쉼표로 분리된 값):

  ```
  $context.identity.sourceIp,$context.requestTime,$context.httpMethod,$context.routeKey,$context.protocol,$context.status,$context.responseLength,$context.requestId,$context.extendedRequestId
  ```