

# Amazon S3로 Lambda 함수 로그 전송
<a name="logging-with-s3"></a>

Lambda 콘솔을 사용하여 Amazon S3로 직접 로그를 전송하도록 Lambda 함수를 구성할 수 있습니다. 이 기능은 장기 로그 스토리지를 위한 비용 효과적인 솔루션을 제공하며 Athena와 같은 서비스를 사용하여 강력한 분석 옵션을 활성화합니다.

**참고**  
Lambda 콘솔, AWS CLI, AWS CloudFormation 및 모든 AWS SDK를 사용하여 Amazon S3로 Lambda 함수 로그가 전송되도록 구성할 수 있습니다.

## 요금
<a name="logging-s3-pricing"></a>

요금에 대한 자세한 내용은 [Amazon CloudWatch 요금](https://aws.amazon.com/cloudwatch/pricing/#Vended_Logs)을 참조하세요.

## Amazon S3 로그 대상에 필요한 권한
<a name="logging-s3-permissions"></a>

Lambda 콘솔을 사용하여 Amazon S3를 함수의 로그 대상으로 구성할 때 다음이 필요합니다.

1. Lambda에서 CloudWatch Logs를 사용하는 데 [필요한 IAM 권한](https://docs.aws.amazon.com/lambda/latest/dg/monitoring-cloudwatchlogs.html#monitoring-cloudwatchlogs-prereqs)

1. [Amazon S3로 Lambda 함수 로그를 전송하도록 CloudWatch Logs 구독 필터 설정](#using-cwl-subscription-filter-lambda-s3)을 수행합니다. 이 필터는 Amazon S3 버킷으로 전송되는 로그 이벤트를 정의합니다.

## Amazon S3로 Lambda 함수 로그를 전송하도록 CloudWatch Logs 구독 필터 설정
<a name="using-cwl-subscription-filter-lambda-s3"></a>

CloudWatch Logs에서 Amazon S3로 로그를 전송하려면 구독 필터를 생성해야 합니다. 이 필터는 Amazon S3 버킷으로 전송되는 로그 이벤트를 정의합니다. Amazon S3 버킷은 로그 그룹과 동일한 리전에 있어야 합니다.

### Amazon S3에 대한 구독 필터를 생성하려면 다음을 수행하세요.
<a name="create-subscription-filter-s3"></a>

1. Amazon Simple Storage Service(Amazon S3) 버킷을 생성합니다. CloudWatch Logs를 위해 특별히 생성한 버킷을 사용하는 것이 좋습니다. 그러나 기존 버킷을 사용하고 싶으면 2단계로 건너뛸 수 있습니다.

   다음 명령을 실행하여 자리 표시자 리전을 사용하고자 하는 리전으로 바꿉니다.

   ```
   aws s3api create-bucket --bucket amzn-s3-demo-bucket2 --create-bucket-configuration LocationConstraint=region
   ```
**참고**  
`amzn-s3-demo-bucket2`는 예시 Amazon S3 버킷 이름입니다. *예약*되어 있습니다. 이 절차를 수행하려면 고유한 Amazon S3 버킷 이름으로 바꿔야 합니다.

   다음은 예 출력입니다.

   ```
   {
       "Location": "/amzn-s3-demo-bucket2"
   }
   ```

1. Amazon S3 버킷에 데이터를 입력하는 데 필요한 권한을 CloudWatch Logs에 부여하는 IAM 역할을 생성합니다. 이 정책에는 혼동된 대리자 보안 문제를 방지하는 데 도움이 되는 aws:SourceArn 글로벌 조건 컨텍스트 키가 포함되어 있습니다. 자세한 내용은 [혼동된 대리자 방지](https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/Subscriptions-confused-deputy.html)를 참조하세요.

   1. 텍스트 편집기를 사용하여 신뢰 정책을 다음과 같은 `~/TrustPolicyForCWL.json` 파일로 생성합니다.

      ```
      {
          "Statement": {
              "Effect": "Allow",
              "Principal": { "Service": "logs.amazonaws.com" },
              "Condition": { 
                  "StringLike": {
                      "aws:SourceArn": "arn:aws:logs:region:123456789012:*"
                  } 
               },
              "Action": "sts:AssumeRole"
          } 
      }
      ```

   1. create-role 명령을 사용하여 신뢰 정책 파일을 지정하는 IAM 역할을 생성합니다. 이후 단계에서 필요할 수 있기 때문에 반환된 Role.Arn 값을 적어둡니다.

      ```
      aws iam create-role \
       --role-name CWLtoS3Role \
       --assume-role-policy-document file://~/TrustPolicyForCWL.json
      {
          "Role": {
              "AssumeRolePolicyDocument": {
                  "Statement": {
                      "Action": "sts:AssumeRole",
                      "Effect": "Allow",
                      "Principal": {
                          "Service": "logs.amazonaws.com"
                      },
                      "Condition": { 
                          "StringLike": {
                              "aws:SourceArn": "arn:aws:logs:region:123456789012:*"
                          } 
                      }
                  }
              },
              "RoleId": "AAOIIAH450GAB4HC5F431",
              "CreateDate": "2015-05-29T13:46:29.431Z",
              "RoleName": "CWLtoS3Role",
              "Path": "/",
              "Arn": "arn:aws:iam::123456789012:role/CWLtoS3Role"
          }
      }
      ```

1. CloudWatch Logs가 계정에서 수행할 수 있는 작업을 정의하는 권한 정책을 생성합니다. 먼저 텍스트 편집기를 사용하여 권한 정책을 `~/PermissionsForCWL.json` 파일로 생성합니다.

   ```
   {
     "Statement": [
       {
         "Effect": "Allow",
         "Action": ["s3:PutObject"],
         "Resource": ["arn:aws:s3:::amzn-s3-demo-bucket2/*"]
       }
     ]
   }
   ```

   다음 `put-role-policy` 명령을 사용하여 권한 정책을 역할에 연결합니다.

   ```
   aws iam put-role-policy --role-name CWLtoS3Role --policy-name Permissions-Policy-For-S3 --policy-document file://~/PermissionsForCWL.json
   ```

1. `Delivery` 로그 그룹을 생성하거나 기존 `Delivery` 로그 그룹을 사용합니다.

   ```
   aws logs create-log-group --log-group-name my-logs --log-group-class DELIVERY --region REGION_NAME
   ```

1. `PutSubscriptionFilter`를 사용하여 대상을 설정합니다.

   ```
   aws logs put-subscription-filter
   --log-group-name my-logs
   --filter-name my-lambda-delivery
   --filter-pattern ""
   --destination-arn arn:aws:s3:::amzn-s3-demo-bucket2
   --role-arn arn:aws:iam::123456789012:role/CWLtoS3Role
   --region REGION_NAME
   ```

## Amazon S3로 Lambda 함수 로그 전송
<a name="logging-s3-setup"></a>

Lambda 콘솔에서 새 함수를 생성한 후 Amazon S3로 직접 함수 로그를 전송할 수 있습니다. 이렇게 하려면 다음 단계를 완료하세요.

1. AWS Management Console에 로그인하고 Lambda 콘솔을 엽니다.

1. 함수 이름을 선택합니다.

1. **구성** 탭을 선택합니다.

1. **모니터링 및 운영 도구** 탭을 선택합니다.

1. ‘로깅 구성’ 섹션에서 **편집**을 선택합니다.

1. ‘로그 콘텐츠’ 섹션에서 로그 형식을 선택합니다.

1. ‘로그 대상’ 섹션에서 다음 단계를 완료합니다.

   1. 대상 서비스를 선택합니다.

   1. **새 로그 그룹 생성**을 선택하거나 **기존 로그 그룹**을 사용합니다.
**참고**  
Amazon S3 대상에 대한 기존 로그 그룹을 선택하는 경우 해당 로그 그룹이 `Delivery` 로그 그룹 유형인지 확인합니다.

   1. 함수 로그의 대상으로 Amazon S3 버킷을 선택합니다.

   1. CloudWatch `Delivery` 로그 그룹이 나타납니다.

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

**참고**  
콘솔에 제공된 IAM 역할에 필요한 권한이 없으면 대상 설정이 실패합니다. 이 문제를 해결하려면 [Amazon S3 로그 대상에 필요한 권한](#logging-s3-permissions)을 참조하세요.

## 교차 계정 로깅
<a name="cross-account-logging-s3"></a>

다른 AWS 계정의 Amazon S3 버킷으로 로그를 전송하도록 Lambda를 구성할 수 있습니다. 이렇게 하려면 대상을 설정하고 두 계정 모두에서 적절한 권한을 구성해야 합니다.

필요한 IAM 역할과 정책을 포함하여 교차 계정 로깅을 설정하는 방법에 대한 자세한 지침은 CloudWatch Logs 설명서의 [Setting up a new cross-account subscription](https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/CrossAccountSubscriptions.html)을 참조하세요.