

기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.

# Mail Manager 로깅
<a name="eb-logging"></a>

Mail Manager 로깅은 Mail Manager 작업에 대한 자세한 가시성을 제공합니다. 로깅 기능은 수신 엔드포인트의 초기 수신부터 구성된 규칙 세트 및 규칙에 따른 메시지 처리까지의 메시지 흐름을 추적합니다.

Mail Manager는 다음 리소스에 대한 로깅을 제공합니다.
+ 수신 엔드포인트
+ 규칙 세트

Mail Manager는 Amazon CloudWatch Logs 서비스를 사용하여 로그를 전송하며 로그는 *CloudWatch Logs*, *Amazon S3* 또는 *Amazon Data Firehose* 대상 중 하나로 전송할 수 있습니다.

## Mail Manager 로그 전송 설정
<a name="setting-up-log-delivery"></a>

작동하는 로그 전송은 다음 세 가지 요소로 구성됩니다.
+ **DeliverySource** - 수신 엔드포인트 또는 규칙 세트 등 로그를 전송하는 리소스를 나타내는 논리적 객체입니다.
+ **DeliveryDestination** - 실제 전송 대상(CloudWatch Logs, S3 또는 Firehose)을 나타내는 논리적 객체입니다.
+ **전송** – 전송 소스를 전송 대상에 연결합니다.

이 섹션에서는 Mail Manager 로깅을 사용하는 데 필요한 권한과 함께 이러한 객체를 생성하는 방법을 설명합니다.

### 사전 조건
<a name="logging-prerequisites"></a>

Mail Manager 로깅을 설정하기 전에 다음을 완료했는지 확인합니다.

1. [수신 엔드포인트](eb-ingress.md) 또는 [규칙 세트](eb-rules.md)를 생성했습니다.

1. Mail Manager 리소스에서 전송 대상으로 로그를 보내는 데 필요한 CloudWatch Logs 및 SES Mail Manager 권한이 있습니다.

#### 필수 권한
<a name="logging-permissions"></a>

*Amazon CloudWatch Logs 사용 설명서*의 [추가 권한이 필요한 로깅[V2]](https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/AWS-logs-and-resource-policy.html#AWS-vended-logs-permissions-V2) 섹션에 설명된 대로 공급된 로그 권한을 설정하고 전송 대상에 해당하는 권한을 적용해야 합니다.
+ [CloudWatch Logs로 전송된 로그](https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/AWS-logs-and-resource-policy.html#AWS-logs-infrastructure-V2-CloudWatchLogs)
+ [Amazon S3로 보낸 로그](https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/AWS-logs-and-resource-policy.html#AWS-logs-infrastructure-V2-S3)
+ [Firehose로 전송된 로그](https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/AWS-logs-and-resource-policy.html#AWS-logs-infrastructure-V2-Firehose)

또한 Mail Manager에서 로그 전송을 구성하려면 다음과 같은 사용자 권한이 필요합니다.
+ `ses:AllowVendedLogDeliveryForResource` - Mail Manager가 예제와 같이 특정 리소스에 대해 사용자를 대신하여 CloudWatch Logs에 로그를 전송할 수 있도록 허용하는 데 필요합니다.

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "AllowSesMailManagerLogDelivery",
            "Effect": "Allow",
            "Action": [
                "ses:AllowVendedLogDeliveryForResource"
            ],
            "Resource": [
            "arn:aws:ses:us-east-1:111122223333:mailmanager-ingress-point/inp-xxxxx",
            "arn:aws:ses:us-east-1:111122223333:mailmanager-rule-set/rs-xxxx"
            ]
        }
    ]
}
```

------

### SES 콘솔에서 로깅 활성화
<a name="enable-logging-console"></a>

콘솔을 사용하여 Mail Manager 리소스에 대한 로깅 활성화:

1. [https://console.aws.amazon.com/ses/](https://console.aws.amazon.com/ses/)에서 SES 콘솔을 엽니다.

1. 탐색 창의 **Mail Manager**에서 **수신 엔드포인트** 또는 **규칙 세트**를 선택하고 로깅에 활성화하려는 특정 리소스를 선택합니다.

1. 리소스의 세부 정보 페이지에서 **로그 전송 추가**를 확장하고 **CloudWatch Logs**, **S3** 또는 **Firehose**로 전송을 선택합니다.

1. 선택한 대상에 대한 **전송 추가** 대화 상자에서 프롬프트에 따라 대상 유형에 맞는 로그 전송 옵션을 구성합니다.

1. (선택 사항) **추가 설정**을 확장하여 레코드, 출력 형식, 필드 구분 기호 및 대상 유형과 관련된 기타 파라미터의 필드를 사용자 지정합니다.

### CloudWatch Logs API를 사용하여 로깅 활성화
<a name="enable-logging-api"></a>

CloudWatch Logs API를 사용하여 Mail Manager 리소스에 대한 로깅을 활성화하려면 다음을 수행해야 합니다.

1. [https://docs.aws.amazon.com/AmazonCloudWatchLogs/latest/APIReference/API_PutDeliverySource.html](https://docs.aws.amazon.com/AmazonCloudWatchLogs/latest/APIReference/API_PutDeliverySource.html)를 사용하여 DeliverySource를 생성합니다.

1. [https://docs.aws.amazon.com/AmazonCloudWatchLogs/latest/APIReference/API_PutDeliveryDestination.html](https://docs.aws.amazon.com/AmazonCloudWatchLogs/latest/APIReference/API_PutDeliveryDestination.html)을 사용하여 DeliveryDestination을 생성합니다.

1. [https://docs.aws.amazon.com/AmazonCloudWatchLogs/latest/APIReference/API_CreateDelivery.html](https://docs.aws.amazon.com/AmazonCloudWatchLogs/latest/APIReference/API_CreateDelivery.html)를 사용하여 정확히 하나의 전송 소스와 하나의 전송 대상을 페어링하는 방법으로 전송을 생성합니다.

*Amazon CloudWatch Logs 사용 설명서*의 *추가 권한이 필요한 로깅[V2]* 섹션에서 특정 로깅 대상에 필요한 모든 권한이 포함된 IAM 역할 및 권한 정책의 예를 볼 수 있으며, *CloudWatch Logs*, *S3* 또는 [Firehose](https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/AWS-logs-and-resource-policy.html#AWS-vended-logs-permissions-V2)와 같은 특정 로깅 대상 리소스에 대한 업데이트를 허용하는 등 로깅 대상에 대한 IAM 역할 및 권한 정책 예를 따를 수 있습니다.

**참고**  
DeliverySource를 생성할 때 [https://docs.aws.amazon.com/AmazonCloudWatchLogs/latest/APIReference/API_PutDeliverySource.html#API_PutDeliverySource_RequestSyntax](https://docs.aws.amazon.com/AmazonCloudWatchLogs/latest/APIReference/API_PutDeliverySource.html#API_PutDeliverySource_RequestSyntax)은 수신 엔드포인트 ARN 또는 규칙 세트 ARN일 수 있습니다. DeliverySource에 따라 [https://docs.aws.amazon.com/AmazonCloudWatchLogs/latest/APIReference/API_PutDeliverySource.html#API_PutDeliverySource_RequestSyntax](https://docs.aws.amazon.com/AmazonCloudWatchLogs/latest/APIReference/API_PutDeliverySource.html#API_PutDeliverySource_RequestSyntax)은 다음과 같을 수 있습니다.  
**수신 엔드포인트 ARN** – `APPLICATION_LOGS` 또는 `TRAFFIC_POLICY_DEBUG_LOGS`
**규칙 세트 ARN** - `APPLICATION_LOGS`

## 로그 해석
<a name="interpreting-logs"></a>

로그는 Mail Manager에서 처리되는 수신된 메시지의 흐름에 대한 추가 인사이트를 얻는 데 사용할 수 있습니다.

다음 예제에서는 각 리소스 및 로그 유형에 대한 로그의 다양한 필드를 자세히 설명합니다.

**Topics**
+ [수신 엔드포인트 로그 - `APPLICATION_LOGS`](#ingress-endpoint-logs-app)
+ [수신 엔드포인트 로그 - `TRAFFIC_POLICY_DEBUG_LOGS`](#ingress-endpoint-logs-traffic)
+ [규칙 세트 로그 - `APPLICATION_LOGS`](#rule-set-logs)

### 수신 엔드포인트 로그 - `APPLICATION_LOGS`
<a name="ingress-endpoint-logs-app"></a>

로그는 메시지별로 생성됩니다.

```
{
  "resource_arn": "arn:aws:ses:us-east-1:1234567890:mailmanager-ingress-point/inp-xxxxx",
  "event_timestamp": 1728562395042,
  "ingress_point_type": "OPEN" | "AUTH" | "MTLS",
  "ingress_point_name": "MyIngressPoint",
  "message_id": "0000llcki1jmushh817gr586f963a5inhkvnh81",
  "message_size_bytes": 100000,
  "rule_set_id": "rs-xxxx",
  "sender_ip_address": "1.2.3.4",
  "smtp_mail_from": "someone@domain.com",
  "smtp_helo": "domain.com",
  "tls_protocol": "TLSv1.2",
  "tls_cipher_suite": "TLS_AES_256_GCM_SHA384",
  "recipients": ["me@mydomain.com", "you@mydomain.com", "they@mydomain.com"],
  "ingress_point_metadata": {
       // Only applies to AUTH Ingress endpoint
       "password_version": "",
       "secrets_manager_arn": "",
       // Only applies to MTLS Ingress endpoint
       "client_certificate_details": {
           "common_names": ["mail.example.com"],
           "serial_number": "0A:DE:EB:89:42:FB:1C:67",
           "subject_alternative_names": ["mail.example.com", "smtp.example.com"],
           "issuer": "CN=Example CA,O=Example Corp,C=US",
           "not_before": "2025-01-15T00:00:00Z",
           "not_after": "2026-01-15T23:59:59Z"
       },
       "trust_store_monitoring": {
           "ca_invalid_or_near_expiry": [
               {
                   "subject": "CN=Example CA,O=Example Corp,C=US",
                   "not_before": "2023-06-01T00:00:00Z",
                   "not_after": "2025-05-15T23:59:59Z"
               },
               ...
           ],
           "crl_invalid_or_near_expiry": [
               {
                   "issuer": "CN=Example CA,O=Example Corp,C=US",
                   "this_update": "2025-03-01T00:00:00Z",
                   "next_update": "2025-04-01T00:00:00Z"
               },
               ...
           ]
       }
  }
}
```

**참고**  
로그는 수신 엔드포인트에서 수락한 메시지에 대해서만 생성됩니다. 수신되는 모든 메시지를 거부하는 수신 엔드포인트는 애플리케이션 로그를 게시하지 않습니다.

**참고**  
`trust_store_monitoring` 목록(`ca_invalid_or_near_expiry` 및 `crl_invalid_or_near_expiry`)은 각각 최대 10개의 항목을 반환합니다. “거의 만료됨”은 인증서 또는 CRL이 90일 이내에 만료됨을 의미합니다.

#### CloudWatch Logs Insights 쿼리 예제
<a name="ingress-endpoint-app-queries"></a>

sender@domain.com에서 메시지 쿼리:

```
fields @timestamp, @message, @logStream, @log
| filter smtp_mail_from like /sender@domain.com/
| sort @timestamp desc
| limit 10000
```

크기가 5,000바이트보다 큰 메시지 쿼리:

```
fields @timestamp, @message, @logStream, @log
| filter message_size_bytes > 5000
| sort @timestamp desc
| limit 10000
```

### 수신 엔드포인트 로그 - `TRAFFIC_POLICY_DEBUG_LOGS`
<a name="ingress-endpoint-logs-traffic"></a>

로그는 수신자별로 생성됩니다.

```
{
    "resource_arn": "arn:aws:ses:us-east-1:1234567890:mailmanager-ingress-point/inp-xxxxx",
    "event_timestamp": 1728562395042,
    "ingress_point_type": "OPEN" | "AUTH",
    "ingress_point_id": "inp-xxxx",
    "ingress_point_session_id": "xxxx",
    "traffic_policy_id": "tp-xxxx",
    "traffic_policy_evaluation": [
           // Array of policy evaluations
           {
                "action": "ALLOW" | "DENY",
                "conditions": [
                // Array of conditions
                {
                    "expression": {
                        "attribute": "RECIPIENT",
                        "operator": "CONTAINS",
                        "value": ["@domain.com", "@mydomain.com"]
                    },
                    "expressionResult": true | false
                }],
                "policyStatementMatched": true | false
            },
            // If no policy statement match then default action will be applied
            {
                "action": "ALLOW" | "DENY",
                "policyStatementMatched": true,
                "type": "DefaultAction",
                "scope": "Recipient"
            },
            // Only present if the email was too large according to the traffic policy
            {
                "action": "DENY",
                "allowedMessageSize": 41943040,
                "receivedMessageSize": 42495384,
                "scope": "Data"
            }
    ],
    "traffic_policy_verdict": "REJECT" | "ACCEPT",
    "sender_ip_address": "1.2.3.4",
    "smtp_mail_from": "someone@domain.com",
    "smtp_helo": "domain.com",
    "tls_protocol": "TLSv1.2",
    "recipient": "me@mydomain.com",
    "tls_cipher_suite": "TLS_AES_256_GCM_SHA384"
}
```

**참고**  
로그는 수락 또는 거부 여부에 관계없이 수신 엔드포인트에서 트래픽 정책에 의해 평가되는 모든 메시지에 대해 생성됩니다.
동일한 메시지(동일한 SMTP 대화 내)에 속하는 모든 수신자 트래픽 정책 평가는 공통된 `ingress_point_session_id`를 공유합니다. 이 ID는 메시지 수락 후까지 `message_id`를 사용할 수 없으므로 상관관계 식별자 역할을 합니다.
`traffic_policy_evaluation` 콘텐츠는 구성에 따라 다르며 결과가 결정되면 조기에 종료될 수 있습니다.

#### CloudWatch Logs Insights 쿼리 예제
<a name="ingress-endpoint-traffic-queries"></a>

sender@domain.com에서 메시지 쿼리:

```
fields @timestamp, @message, @logStream, @log
| filter smtp_mail_from like /sender@domain.com/
| sort @timestamp desc
| limit 10000
```

특정 `ingress_point_session_id`에 속하는 쿼리 메시지:

```
fields @timestamp, @message, @logStream, @log
| filter ingress_point_session_id = 'xxx'
| sort @timestamp desc
| limit 10000
```

거부된 메시지 쿼리:

```
fields @timestamp, @message, @logStream, @log
| filter traffic_policy_verdict = 'REJECT'
| sort @timestamp desc
| limit 10000
```

### 규칙 세트 로그 - `APPLICATION_LOGS`
<a name="rule-set-logs"></a>

로그는 작업당 메시지별로 생성됩니다. 즉, 규칙 세트의 규칙에서 작업이 메시지를 처리할 때마다 로그 레코드가 생성됩니다.

```
{
   "resource_arn": "arn:aws:ses:us-east-1:1234567890:mailmanager-rule-set/rs-xxxx",
   "event_timestamp": 1732298258254,
   "message_id": "0000llcki1jmushh817gr586f963a5inhkvnh81",
   "rule_set_name": "MyRuleSet",
   "rule_name": "MyRule",
   "rule_index": 1,
   "recipients_matched": ["recipient1@domain.com", "recipient2@domain.com"],
   "action_metadata": {
       "action_name": "WRITE_TO_S3" | "DROP" | "RELAY" | "DELIVER_TO_MAILBOX" | etc.,
       "action_index": 2,
       "action_status": "SUCCESS" | "FAILURE" | "IN_PROGRESS",
       "action_failure": "Access denied"
   }
}
```
+ `recipients_matched` - 작업이 수행되는 규칙의 조건과 일치하는 수신자입니다.
+ `rule_index` - 규칙 세트 내의 규칙 순서입니다.
+ `action_index` - 규칙 내 작업의 순서입니다.
+ `action_status` - 지정된 메시지에 대해 작업을 수행한 결과를 나타냅니다.
+ `action_failure` - 작업의 실패 세부 정보를 나타냅니다(작업이 실패할 때만 적용됨). 예를 들어, 제공된 역할에 작업을 수행할 수 있는 충분한 권한이 없는 경우입니다.

또한 규칙 조건이 메시지와 일치하지 않는 경우, 즉 메시지가 규칙에 의해 처리되지 않는 경우 단일 로그가 게시되어 메시지가 규칙 세트에 의해 처리되었지만 이에 대해 수행된 작업이 없음을 나타냅니다.

```
{
   "resource_arn": "arn:aws:ses:us-east-1:1234567890:mailmanager-rule-set/rs-xxxx",
   "event_timestamp": 1732298258254,
   "message_id": "0000llcki1jmushh817gr586f963a5inhkvnh81",
   "rule_set_name": "MyRuleSet",
   "rule_name": "MyRule",
   "rule_index": 1,
   "recipients_matched": [],
}
```

#### CloudWatch Logs Insights 쿼리 예제
<a name="rule-set-queries"></a>

특정 message-id에 대한 쿼리(규칙 세트를 통한 메시지 흐름 표시):

```
fields @timestamp, @message, @logStream, @log
| filter message_id = 'message-id-123'
| sort @timestamp desc
| limit 10000
```

실패한 WRITE\$1TO\$1S3 작업에 대한 쿼리:

```
fields @timestamp, @message, @logStream, @log
| filter action_metadata.action_name = 'WRITE_TO_S3'
    and action_metadata.action_status = 'FAILURE'
| sort @timestamp desc
| limit 10000
```

규칙 세트의 두 번째 규칙에 의해 처리되지 않은 메시지에 대한 쿼리(메시지가 규칙 조건을 충족하지 않음):

```
fields @timestamp, @message, @logStream, @log
| filter recipients_matched = '[]'
    and rule_index = 2
| sort @timestamp desc
| limit 10000
```