AWS CloudTrail로 AWS Lambda API 호출 로깅

AWS CloudTrail로 AWS Lambda API 호출 로깅

AWS Lambda는 사용자, 역할, AWS 서비스가 수행한 작업의 기록을 제공하는 AWS CloudTrail과 통합되어 있습니다. CloudTrail은 Lambda에 대한 API 호출을 이벤트로 캡처합니다. 캡처되는 호출에는 Lambda 콘솔의 호출과 Lambda API 작업에 대한 코드 호출이 포함됩니다. CloudTrail이 수집한 정보를 사용해 Lambda에 이루어진 요청, 요청이 이루어진 IP 주소, 요청 시점, 추가 세부 정보를 확인할 수 있습니다.

출처: AWS Lambda 개발자 안내서

본문

모든 이벤트 또는 로그 항목에는 요청을 생성한 주체에 대한 정보가 포함됩니다. 자격 증명 정보는 다음을 확인하는 데 도움이 됩니다.

  • 요청이 루트 사용자 또는 사용자 자격 증명으로 이루어졌는지 여부.
  • 요청이 IAM Identity Center 사용자를 대신해 이루어졌는지 여부.
  • 요청이 역할 또는 페더레이션 사용자의 임시 보안 자격 증명으로 이루어졌는지 여부.
  • 요청이 다른 AWS 서비스에 의해 이루어졌는지 여부.

계정을 만들 때 AWS 계정에서 CloudTrail이 활성화되며 CloudTrail Event history에 자동으로 접근할 수 있습니다. CloudTrail Event history는 AWS 리전에서 기록된 지난 90일의 관리 이벤트에 대한 보기·검색·다운로드·불변 기록을 제공합니다. 자세한 내용은 AWS CloudTrail User Guide의 'Working with CloudTrail Event history'를 참고하세요. Event history를 보는 데는 CloudTrail 요금이 없습니다.

90일이 지난 뒤에도 AWS 계정의 이벤트 지속 기록을 보려면 트레일(trail)이나 CloudTrail Lake 이벤트 데이터 스토어를 만드세요.

트레일은 CloudTrail이 로그 파일을 Amazon S3 버킷으로 전달할 수 있게 합니다. AWS Management Console로 만든 모든 트레일은 멀티 리전입니다. AWS CLI로 단일 리전 또는 멀티 리전 트레일을 만들 수 있습니다. 계정의 모든 AWS 리전에서 활동을 캡처하므로 멀티 리전 트레일을 만드는 것이 권장됩니다. 단일 리전 트레일을 만들면 트레일의 AWS 리전에서 기록된 이벤트만 볼 수 있습니다. 트레일에 대한 자세한 내용은 AWS CloudTrail User Guide의 'Creating a trail for your AWS account'와 'Creating a trail for an organization'을 참고하세요.

트레일을 만들면 CloudTrail이 지속적인 관리 이벤트의 사본 한 부를 Amazon S3 버킷에 무료로 전달할 수 있지만 Amazon S3 스토리지 요금은 부과됩니다. CloudTrail 요금에 대한 자세한 내용은 AWS CloudTrail Pricing을, Amazon S3 요금은 Amazon S3 Pricing을 참고하세요.

CloudTrail Lake를 사용하면 이벤트에 SQL 기반 쿼리를 실행할 수 있습니다. CloudTrail Lake는 기존 이벤트를 행 기반 JSON 형식에서 Apache ORC 형식으로 변환합니다. ORC는 빠른 데이터 검색에 최적화된 컬럼형 저장 형식입니다. 이벤트는 고급 이벤트 선택기(advanced event selectors)를 적용해 선택한 기준에 따른 불변 이벤트 모음인 이벤트 데이터 스토어로 집계됩니다. 이벤트 데이터 스토어에 적용하는 선택기는 어떤 이벤트가 유지되고 쿼리 가능한지 제어합니다. CloudTrail Lake에 대한 자세한 내용은 AWS CloudTrail User Guide의 'Working with AWS CloudTrail Lake'를 참고하세요.

CloudTrail Lake 이벤트 데이터 스토어와 쿼리에는 비용이 발생합니다. 이벤트 데이터 스토어를 만들 때 이벤트 데이터 스토어에 사용할 요금 옵션을 선택합니다. 요금 옵션은 이벤트 수집·저장 비용과 이벤트 데이터 스토어의 기본·최대 보존 기간을 결정합니다. CloudTrail 요금에 대한 자세한 내용은 AWS CloudTrail Pricing을 참고하세요.

CloudTrail의 Lambda 데이터 이벤트

데이터 이벤트는 리소스에서 또는 리소스에 대해 수행된 리소스 작업(예: Amazon S3 객체 읽기·쓰기)에 대한 정보를 제공합니다. 이것을 데이터 플레인(data plane) 작업이라고도 합니다. 데이터 이벤트는 종종 대용량 활동입니다. 기본적으로 CloudTrail은 대부분의 데이터 이벤트를 로그하지 않으며 CloudTrail Event history도 이를 기록하지 않습니다.

지원되는 서비스에 대해 기본적으로 로그되는 CloudTrail 데이터 이벤트 중 하나는 LambdaESMDisabled입니다. 이 이벤트를 사용해 Lambda 이벤트 소스 매핑 문제를 해결하는 방법에 대한 자세한 내용은 'CloudTrail로 비활성화된 Lambda 이벤트 소스 문제 해결'을 참고하세요.

데이터 이벤트에는 추가 요금이 적용됩니다. CloudTrail 요금에 대한 자세한 내용은 AWS CloudTrail Pricing을 참고하세요.

CloudTrail 콘솔, AWS CLI, CloudTrail API 작업으로 AWS::Lambda::Function 리소스 유형에 대한 데이터 이벤트를 로그할 수 있습니다. 데이터 이벤트를 로그하는 방법에 대한 자세한 내용은 AWS CloudTrail User Guide의 'Logging data events with the AWS Management Console'과 'Logging data events with the AWS Command Line Interface'를 참고하세요.

다음 표는 데이터 이벤트를 로그할 수 있는 Lambda 리소스 유형을 나열합니다. Data event type (console) 열은 CloudTrail 콘솔의 Data event type 목록에서 선택할 값을 보여줍니다. resources.type value 열은 AWS CLI 또는 CloudTrail API로 고급 이벤트 선택기를 구성할 때 지정할 resources.type 값을 보여줍니다. Data APIs logged to CloudTrail 열은 리소스 유형에 대해 CloudTrail에 로그되는 API 호출을 보여줍니다.

Data event type (console) resources.type value Data APIs logged to CloudTrail
Lambda AWS::Lambda::Function Invoke

고급 이벤트 선택기를 구성해 eventName, readOnly, resources.ARN 필드로 필터링해 자신에게 중요한 이벤트만 로그할 수 있습니다. 다음 예제는 특정 함수에 대한 이벤트만 로그하는 데이터 이벤트 구성의 JSON 보기입니다. 이 필드에 대한 자세한 내용은 AWS CloudTrail API Reference의 AdvancedFieldSelector를 참고하세요.

[
  {
    "name": "function-invokes",
    "fieldSelectors": [
      {
        "field": "eventCategory",
        "equals": [
          "Data"
        ]
      },
      {
        "field": "resources.type",
        "equals": [
          "AWS::Lambda::Function"
        ]
      },
      {
        "field": "resources.ARN",
        "equals": [
          "arn:aws:lambda:us-east-1:111122223333:function:hello-world"
        ]
      }
    ]
  }
]

CloudTrail의 Lambda 관리 이벤트

관리 이벤트는 AWS 계정의 리소스에 수행되는 관리 작업에 대한 정보를 제공합니다. 이것을 컨트롤 플레인(control plane) 작업이라고도 합니다. 기본적으로 CloudTrail은 관리 이벤트를 로그합니다.

Lambda는 CloudTrail 로그 파일에서 다음 작업을 관리 이벤트로 로그하는 것을 지원합니다.

CloudTrail 로그 파일에서 eventName에 날짜와 버전 정보가 포함될 수 있지만 여전히 같은 공용 API 작업을 가리킵니다. 예를 들어 GetFunction 작업은 GetFunction20150331v2로 나타납니다. 다음 목록은 이벤트 이름이 API 작업 이름과 다른 경우를 지정합니다.

  • AddLayerVersionPermission
  • AddPermission (이벤트 이름: AddPermission20150331v2)
  • CreateAlias (이벤트 이름: CreateAlias20150331)
  • CreateEventSourceMapping (이벤트 이름: CreateEventSourceMapping20150331)
  • CreateFunction (이벤트 이름: CreateFunction20150331) (CreateFunction의 CloudTrail 로그에는 Environment와 ZipFile 파라미터가 생략됩니다.)
  • CreateFunctionUrlConfig
  • DeleteAlias (이벤트 이름: DeleteAlias20150331)
  • DeleteCodeSigningConfig
  • DeleteEventSourceMapping (이벤트 이름: DeleteEventSourceMapping20150331)
  • DeleteFunction (이벤트 이름: DeleteFunction20150331)
  • DeleteFunctionConcurrency (이벤트 이름: DeleteFunctionConcurrency20171031)
  • DeleteFunctionUrlConfig
  • DeleteProvisionedConcurrencyConfig
  • GetAlias (이벤트 이름: GetAlias20150331)
  • GetEventSourceMapping
  • GetFunction
  • GetFunctionUrlConfig
  • GetFunctionConfiguration
  • GetLayerVersionPolicy
  • GetPolicy
  • ListEventSourceMappings
  • ListFunctions
  • ListFunctionUrlConfigs
  • PublishLayerVersion (이벤트 이름: PublishLayerVersion20181031) (PublishLayerVersion의 CloudTrail 로그에는 ZipFile 파라미터가 생략됩니다.)
  • PublishVersion (이벤트 이름: PublishVersion20150331)
  • PutFunctionConcurrency (이벤트 이름: PutFunctionConcurrency20171031)
  • PutFunctionCodeSigningConfig
  • PutFunctionEventInvokeConfig
  • PutProvisionedConcurrencyConfig
  • PutRuntimeManagementConfig
  • RemovePermission (이벤트 이름: RemovePermission20150331v2)
  • TagResource (이벤트 이름: TagResource20170331v2)
  • UntagResource (이벤트 이름: UntagResource20170331v2)
  • UpdateAlias (이벤트 이름: UpdateAlias20150331)
  • UpdateCodeSigningConfig
  • UpdateEventSourceMapping (이벤트 이름: UpdateEventSourceMapping20150331)
  • UpdateFunctionCode (이벤트 이름: UpdateFunctionCode20150331v2) (UpdateFunctionCode의 CloudTrail 로그에는 ZipFile 파라미터가 생략됩니다.)
  • UpdateFunctionConfiguration (이벤트 이름: UpdateFunctionConfiguration20150331v2) (UpdateFunctionConfiguration의 CloudTrail 로그에는 Environment 파라미터가 생략됩니다.)
  • UpdateFunctionEventInvokeConfig
  • UpdateFunctionUrlConfig

CloudTrail로 비활성화된 Lambda 이벤트 소스 문제 해결

UpdateEventSourceMapping API 작업으로 이벤트 소스 매핑의 상태를 변경하면 그 API 호출이 CloudTrail에서 관리 이벤트로 로그됩니다. 이벤트 소스 매핑은 오류로 인해 Disabled 상태로 직접 전환될 수도 있습니다.

다음 서비스에 대해 이벤트 소스가 Disabled 상태로 전환되면 Lambda는 LambdaESMDisabled 데이터 이벤트를 CloudTrail에 게시합니다.

  • Amazon Simple Queue Service(Amazon SQS)
  • Amazon DynamoDB
  • Amazon Kinesis

Lambda는 다른 이벤트 소스 매핑 유형에 대해서는 이 이벤트를 지원하지 않습니다.

지원되는 서비스의 이벤트 소스 매핑이 Disabled 상태로 전환될 때 알림을 받으려면 LambdaESMDisabled CloudTrail 이벤트를 사용해 Amazon CloudWatch에 경보를 설정하세요. CloudWatch 경보 설정에 대해 자세히 알아보려면 'Creating CloudWatch alarms for CloudTrail events: examples'를 참고하세요.

LambdaESMDisabled 이벤트 메시지의 serviceEventDetails 엔티티에는 다음 오류 코드 중 하나가 포함됩니다.

  • 요청에 지정된 리소스가 존재하지 않습니다.
  • 이벤트 소스에 연결된 함수가 존재하지 않습니다.
  • 이벤트 소스 또는 함수에 제공된 리전 이름이 유효하지 않습니다.
  • 권한이 설정되지 않았거나 잘못 구성되었습니다.
  • 함수 코드가 컴파일되지 않았거나, 복구할 수 없는 예외가 발생했거나, 잘못된 배포가 발생했습니다.

Lambda 이벤트 예제

이벤트는 모든 소스의 단일 요청을 나타내며 요청된 API 작업, 작업 날짜·시간, 요청 파라미터 등에 대한 정보를 포함합니다. CloudTrail 로그 파일은 공용 API 호출의 순서 있는 스택 트레이스가 아니므로 이벤트는 특정 순서로 나타나지 않습니다.

다음 예제는 GetFunction과 DeleteFunction 작업에 대한 CloudTrail 로그 항목을 보여줍니다.

eventName에는 "GetFunction20150331" 같은 날짜와 버전 정보가 포함될 수 있지만 여전히 같은 공용 API를 가리킵니다.

{
  "Records": [
    {
      "eventVersion": "1.03",
      "userIdentity": {
        "type": "IAMUser",
        "principalId": "A1B2C3D4E5F6G7EXAMPLE",
        "arn": "arn:aws:iam::111122223333:user/myUserName",
        "accountId": "111122223333",
        "accessKeyId": "«redacted:AKIA…»",
        "userName": "myUserName"
      },
      "eventTime": "2015-03-18T19:03:36Z",
      "eventSource": "lambda.amazonaws.com",
      "eventName": "GetFunction",
      "awsRegion": "us-east-1",
      "sourceIPAddress": "127.0.0.1",
      "userAgent": "Python-httplib2/0.8 (gzip)",
      "errorCode": "AccessDenied",
      "errorMessage": "User: arn:aws:iam::111122223333:user/myUserName is not authorized to perform: lambda:GetFunction on resource: arn:aws:lambda:us-west-2:111122223333:function:other-acct-function",
      "requestParameters": null,
      "responseElements": null,
      "requestID": "7aebcd0f-cda1-11e4-aaa2-e356da31e4ff",
      "eventID": "e92a3e85-8ecd-4d23-8074-843aabfe89bf",
      "eventType": "AwsApiCall",
      "recipientAccountId": "111122223333"
    },
    {
      "eventVersion": "1.03",
      "userIdentity": {
        "type": "IAMUser",
        "principalId": "A1B2C3D4E5F6G7EXAMPLE",
        "arn": "arn:aws:iam::111122223333:user/myUserName",
        "accountId": "111122223333",
        "accessKeyId": "«redacted:AKIA…»",
        "userName": "myUserName"
      },
      "eventTime": "2015-03-18T19:04:42Z",
      "eventSource": "lambda.amazonaws.com",
      "eventName": "DeleteFunction20150331",
      "awsRegion": "us-east-1",
      "sourceIPAddress": "127.0.0.1",
      "userAgent": "Python-httplib2/0.8 (gzip)",
      "requestParameters": {
        "functionName": "basic-node-task"
      },
      "responseElements": null,
      "requestID": "a2198ecc-cda1-11e4-aaa2-e356da31e4ff",
      "eventID": "20b84ce5-730f-482e-b2b2-e8fcc87ceb22",
      "eventType": "AwsApiCall",
      "recipientAccountId": "111122223333"
    }
  ]
}

CloudTrail 레코드 내용에 대한 정보는 AWS CloudTrail User Guide의 'CloudTrail record contents'를 참고하세요.

더 알아보기 (Learn more)