Datadog Lambda 함수를 사용하여 AWS 서비스 로그 전송

AWS 서비스 로그는 Datadog Forwarder Lambda 함수를 사용하여 수집할 수 있습니다. 이 Lambda 함수는 S3 버킷, CloudWatch 로그 그룹 및 EventBridge 이벤트를 트리거로 사용하며, 수집된 로그를 Datadog으로 전달합니다.

AWS 서비스 로그 수집을 시작하려면 다음 단계를 수행합니다.

  1. AWS 계정에서 Datadog Forwarder Lambda 함수를 설정합니다. AWS 서비스에서 2. 로깅을 활성화합니다(대부분의 AWS 서비스는 S3 버킷 또는 CloudWatch 로그 그룹에 기록할 수 있습니다). 전달할 새로운 로그가 있을 때 Forwarder Lambda가 실행되도록 3. 트리거를 설정합니다. 트리거를 구성하는 방법은 두 가지가 있습니다.

참고:

  • AWS PrivateLink를 사용하여 전용 연결을 통해 로그를 전송할 수 있습니다.
  • CloudFormation은 모든 리소스에 대해 KMS:Decrypt 권한을 포함하는 IAM 정책을 생성하며, 이는 AWS Security Hub의 권장 모범 사례와 일치하지 않습니다. 이 권한은 Lambda 함수 설정 과정에서 KMS로 암호화된 S3 버킷의 객체를 복호화하는 데 사용되며, S3 버킷을 암호화하는 데 사용된 KMS 키는 예측할 수 없습니다. 설치가 성공적으로 완료된 후 이 권한을 안전하게 삭제할 수 있습니다.

AWS 서비스에서 로깅 활성화

S3 버킷이나 CloudWatch 로그 그룹으로 로그를 생성하는 모든 AWS 서비스가 지원됩니다. 아래 표에서 가장 많이 사용되는 서비스의 설정 지침을 확인하세요.

AWS 서비스AWS 서비스 로깅 활성화AWS 로그를 Datadog에 전송
API GatewayAmazon API Gateway 로그 활성화수동자동 로그 수집.
AppSyncAWS AppSync 로그 활성화수동자동 로그 수집.
Batch-자동 로그 수집.
Bedrock Agentcore-자동 로그 수집.
CloudfrontAmazon CloudFront 로그 활성화수동자동 로그 수집.
CloudTrailAWS CloudTrail 로그 활성화수동자동 로그 수집. Cloud SIEM용 AWS CloudTrail을 설정하는 경우 Cloud SIEM용 AWS 설정을 참조하세요.
CodeBuildAWS CodeBuild 로그 활성화수동자동 로그 수집.
DMSAWS 데이터베이스 마이그레이션 서비스 로그 활성화수동자동 로그 수집.
DocumentDBAmazon DocumentDB 로그 활성화수동자동 로그 수집.
DynamoDBAmazon DynamoDB 로그 활성화수동 로그 수집.
EC2-Datadog Agent를 사용하여 로그를 Datadog에 전송합니다.
ECS-Docker Agent를 사용하여 로그 수집 또는 자동 로그 수집.
EKSAmazon EKS 로그 활성화수동자동 로그 수집.
Elastic Load Balancing(ELB)Amazon ELB 로그 활성화수동자동 로그 수집.
GlueAWS Glue 로그 활성화수동자동 로그 수집.
IoT CoreAmazon IoT Core 로그 활성화자동 로그 수집.
Lambda-수동자동 로그 수집.
MWAAAmazon MWAA 로그 활성화수동자동 로그 수집.
Network FirewallAWS 네트워크 방화벽 로그 활성화수동자동 로그 수집.
PCS-자동 로그 수집.
RDSAmazon RDS 로그 활성화수동 로그 수집.
RedShiftAmazon Redshift 로그 활성화수동자동 로그 수집.
Redshift Serverless-자동 로그 수집.
Route 53Amazon Route 53 DNS 쿼리 로깅Resolver 쿼리 로깅 활성화수동자동 로그 수집.
S3Amazon S3 로그 활성화수동자동 로그 수집.
SNSSNS에서는 로그를 제공하지 않지만, SNS 서비스를 통과하는 로그 및 이벤트를 처리할 수 있습니다수동 로그 수집.
SSM-자동 로그 수집.
Step FunctionsAmazon Step Functions 로그 활성화수동 로그 수집.
Verified AccessVerified Access 로그 활성화수동자동 로그 수집.
VPCAmazon VPC 로그 활성화수동자동 로그 수집.
VPNAWS VPN 로그 활성화수동자동 로그 수집.
웹 애플리케이션 방화벽AWS WAF 로그 활성화수동자동 로그 수집.

트리거 설정

Datadog Forwarder Lambda 함수에 트리거를 구성하는 방법은 두 가지가 있습니다.

  • 자동: Datadog이 선택된 AWS 서비스의 로그 위치를 자동으로 검색하여 Datadog Forwarder Lambda 함수에 트리거를 추가합니다. Datadog이 트리거 목록을 최신 상태로 유지합니다.
  • 수동: 각 트리거를 직접 설정합니다.

트리거 자동 설정

Datadog은 Datadog Forwarder Lambda 함수의 트리거를 자동으로 구성하여 AWS 로그를 수집할 수 있습니다. 그러나 자동 구독은 서로 다른 AWS 계정이나 리전에서 트리거를 생성하는 것을 지원하지 않습니다. 로그가 다른 AWS 계정의 S3 버킷에 게시되는 경우에는 이 제한을 우회하기 위해 S3 버킷과 동일한 계정에서 수동으로 트리거를 생성하는 것이 권장됩니다.

지원되는 로그 소스 및 위치:

소스위치
Apache Airflow(MWAA)CloudWatch
API Gateway 액세스 로그CloudWatch
API Gateway 실행 로그CloudWatch
애플리케이션 ELB 액세스 로그S3
AppSync LogsCloudWatch
BatchCloudWatch
Bedrock Agentcore LogsS3, CloudWatch
클래식 ELB 액세스 로그S3
CloudFront 액세스 로그S3
Cloudtrail 로그S3, CloudWatch
CodeBuild 로그S3, CloudWatch
DMS 로그CloudWatch
DocumentDB 로그CloudWatch
ECS 로그CloudWatch
EKS 컨트롤 플레인 로그CloudWatch
EKS Container Insights 로그CloudWatch
Glue Jobs 로그CloudWatch
Lambda 로그CloudWatch
Lambda@Edge 로그Cloudwatch
IoT Core 로그CloudWatch
네트워크 방화벽 로그S3, CloudWatch
PCS 로그CloudWatch
Redshift 로그S3, CloudWatch
Redshift Serverless 로그CloudWatch
RDS 로그CloudWatch
Route53 DNS 쿼리 로그CloudWatch
Route53 Resolver 쿼리 로그S3, CloudWatch
S3 액세스 로그S3
SSM 명령 로그CloudWatch
Step 함수CloudWatch
Verified Access 로그S3, CloudWatch
VPC Flow 로그S3, CloudWatch
VPN 로그CloudWatch
웹 애플리케이션 방화벽S3, CloudWatch

참고: 구독 필터는 DatadogForwarder에 의해 CloudWatch 로그 그룹에 자동으로 생성되며, DD_LOG_SUBSCRIPTION_FILTER_<LOG_GROUP_NAME> 형식으로 이름이 지정됩니다.

  1. 아직 설정하지 않았다면 Datadog 로그 수집 AWS Lambda 함수를 설정하세요.

  2. Datadog-AWS 통합에 사용되는 IAM 역할의 정책에 다음 권한이 포함되어 있는지 확인하세요. 이 권한들이 사용되는 방식에 대한 자세한 내용은 아래 설명에서 찾을 수 있습니다.

    "airflow:GetEnvironment",
    "airflow:ListEnvironments",
    "appsync:ListGraphqlApis",
    "batch:DescribeJobDefinitions",
    "cloudfront:GetDistributionConfig",
    "cloudfront:ListDistributions",
    "cloudtrail:GetTrail",
    "cloudtrail:ListTrails",
    "codebuild:BatchGetProjects",
    "codebuild:ListProjects",
    "dms:DescribeReplicationInstances",
    "ec2:DescribeFlowLogs",
    "ec2:DescribeVerifiedAccessInstanceLoggingConfigurations",
    "ec2:DescribeVpnConnections",
    "ecs:DescribeTaskDefinition",
    "ecs:ListTaskDefinitionFamilies",
    "eks:DescribeCluster",
    "eks:ListClusters",
    "elasticloadbalancing:DescribeLoadBalancerAttributes",
    "elasticloadbalancing:DescribeLoadBalancers",
    "glue:BatchGetJobs",
    "glue:GetJobs",
    "glue:GetJob",
    "glue:ListJobs",
    "iot:GetV2LoggingOptions",
    "lambda:GetPolicy",
    "lambda:InvokeFunction",
    "lambda:List*",
    "logs:DeleteSubscriptionFilter",
    "logs:DescribeDeliveries",
    "logs:DescribeDeliverySources",
    "logs:DescribeLogGroups",
    "logs:DescribeSubscriptionFilters",
    "logs:GetDeliveryDestination",
    "logs:PutSubscriptionFilter",
    "network-firewall:DescribeLoggingConfiguration",
    "network-firewall:ListFirewalls",
    "rds:DescribeDBClusters",
    "rds:DescribeDBInstances",
    "redshift-serverless:ListNamespaces",
    "redshift:DescribeClusters",
    "redshift:DescribeLoggingStatus",
    "route53:ListQueryLoggingConfigs",
    "route53resolver:ListResolverQueryLogConfigs",
    "s3:GetBucketLocation",
    "s3:GetBucketLogging",
    "s3:GetBucketNotification",
    "s3:ListAllMyBuckets",
    "s3:PutBucketNotification",
    "ssm:GetServiceSetting",
    "ssm:ListCommands",
    "states:DescribeStateMachine",
    "states:ListStateMachines",
    "wafv2:ListLoggingConfigurations"
    
    AWS PermissionDescription
    airflow:ListEnvironmentsList all MWAA environment names.
    airflow:GetEnvironmentGet information about a MWAA environment.
    appsync:ListGraphqlApisList all GraphQL Apis.
    batch:DescribeJobDefinitionsList all Batch job definitions.
    cloudfront:GetDistributionConfigGet the name of the S3 bucket containing CloudFront access logs.
    cloudfront:ListDistributionsList all CloudFront distributions.
    cloudtrail:GetTrailGet Trail logging information.
    cloudtrail:ListTrailsList all Cloudtrail trails.
    codebuild:BatchGetProjectsList all CodeBuild projects.
    codebuild:ListProjectsGet information on CodeBuild projects.
    dms:DescribeReplicationInstancesList all replication instances for DMS.
    ec2:DescribeFlowLogsList all Flow log configurations.
    ec2:DescribeVerifiedAccessInstanceLoggingConfigurationsList all Verified Access instance logging configurations.
    ec2:DescribeVpnConnectionsList all VPN connections.
    ecs:DescribeTaskDefinitionDescribe ECS task definition.
    ecs:ListTaskDefinitionFamiliesList all task definition families.
    elasticloadbalancing:
    DescribeLoadBalancers
    List all load balancers.
    elasticloadbalancing:
    DescribeLoadBalancerAttributes
    Get the name of the S3 bucket containing ELB access logs.
    glue:BatchGetJobsGet information about multiple Glue jobs.
    glue:GetJobGet information about a Glue job.
    glue:GetJobsList all Glue jobs.
    glue:ListJobsList all Glue job names.
    eks:DescribeClusterDescribe an EKS cluster.
    eks:ListClustersList all EKS clusters.
    iot:GetV2LoggingOptionsGet IoT V2 logging options.
    lambda:InvokeFunctionInvoke a Lambda function.
    lambda:List*List all Lambda functions.
    lambda:GetPolicyGet the Lambda policy when triggers are to be removed.
    logs:PutSubscriptionFilterAdd a Lambda trigger based on CloudWatch Log events.
    logs:DeleteSubscriptionFilterRemove a Lambda trigger based on CloudWatch Log events.
    logs:DescribeLogGroupsDescribe CloudWatch log groups.
    logs:DescribeDeliveriesDescribe CloudWatch log deliveries.
    logs:DescribeDeliverySourcesDescribe CloudWatch log delivery sources.
    logs:DescribeSubscriptionFiltersList the subscription filters for the specified log group.
    logs:GetDeliveryDestinationGet a CloudWatch log delivery destination.
    network-firewall:DescribeLoggingConfigurationGet the logging configuration of a firewall.
    network-firewall:ListFirewallsList all Network Firewall firewalls.
    rds:DescribeDBClustersList all RDS clusters.
    rds:DescribeDBInstancesList all RDS instances.
    redshift:DescribeClustersList all Redshift clusters.
    redshift:DescribeLoggingStatusGet the name of the S3 bucket containing Redshift Logs.
    redshift-serverless:ListNamespacesList all Redshift Serverless namespaces.
    route53:ListQueryLoggingConfigsList all DNS query logging configurations for Route 53.
    route53resolver:ListResolverQueryLogConfigsList all Resolver query logging configurations for Route 53.
    s3:GetBucketLoggingGet the name of the S3 bucket containing S3 access logs.
    s3:GetBucketLocationGet the region of the S3 bucket containing S3 access logs.
    s3:GetBucketNotificationGet existing Lambda trigger configurations.
    s3:ListAllMyBucketsList all S3 buckets.
    s3:PutBucketNotificationAdd or remove a Lambda trigger based on S3 bucket events.
    ssm:GetServiceSettingGet the SSM service setting for customer script log group name.
    ssm:ListCommandsList all SSM commands.
    states:ListStateMachinesList all Step Functions.
    states:DescribeStateMachineGet logging details about a Step Function.
    wafv2:ListLoggingConfigurationsList all logging configurations of the Web Application Firewall.
  3. AWS 통합 페이지에서 로그를 수집할 AWS 계정을 선택하고 Log Collection 탭을 클릭합니다.

  4. Datadog Forwarder Lambda 섹션에서 이전 단계에서 생성한 Lambda의 ARN을 입력한 다음 Add를 클릭합니다. Lambda 함수는 아래 표에 이름, 버전 및 리전과 함께 표시됩니다.

  5. Log Autosubscription 섹션의 Log Sources에서 로그를 수집할 AWS 서비스를 활성화합니다. 스위치를 켜면 로그 수집이 시작됩니다. 특정 서비스의 로그 수집을 중지하려면 해당 로그 소스를 비활성화합니다.

  6. (선택 사항) Log Source Tag Filters 섹션에서 각 로그 소스에 대해 리소스 태그를 기준으로 로그 수집을 필터링할 수 있습니다. 드롭다운 메뉴에서 로그 소스를 선택하고 key:value 형식의 태그를 추가하여 수집하는 리소스의 로그를 제한합니다. 참고: 리소스 태그는 Datadog 플랫폼 규칙에 맞추어 자동으로 소문자로 변환됩니다. 태그 필터는 불일치를 방지하기 위해 소문자로 정의하세요.

  7. 여러 리전에 로그가 존재하는 경우 각 리전에 추가 Datadog Forwarder Lambda 함수를 생성하고 Datadog Forwarder Lambda 섹션에 추가해야 합니다.

  8. 특정 Lambda 함수로부터의 모든 AWS 로그 수집을 중지하려면 표에서 해당 Lambda 위에 마우스를 올리고 삭제 아이콘을 클릭합니다. 해당 함수에 연결된 모든 트리거가 제거됩니다.

  9. 이 초기 설정 후 몇 분 내에 Datadog Log Explorer에 AWS 로그가 나타납니다.

트리거 수동 설정

CloudWatch 로그 그룹에서 로그 수집

CloudWatch 그룹에서 로그를 수집하는 경우 다음 방법 중 하나를 사용하여 Datadog Forwarder Lambda 함수 트리거를 설정합니다.

  1. AWS 콘솔에서 Lambda로 이동합니다.
  2. Functions를 클릭하고 Datadog Forwarder를 선택합니다.
  3. Add trigger를 클릭하고 CloudWatch Logs를 선택합니다.
  4. 드롭다운 메뉴에서 로그 그룹을 선택합니다.
  5. 필터의 이름을 입력하고 필요에 따라 필터 패턴을 지정합니다.
  6. Add를 클릭합니다.
  7. Datadog Log 섹션으로 이동하여 로그 그룹으로 전송된 새로운 로그 이벤트를 확인합니다.

Terraform 사용자의 경우, 트리거를 프로비저닝하고 관리하기 위해 aws_cloudwatch_log_subscription_filter 리소스를 사용할 수 있습니다. 아래 샘플 코드를 참조하세요.

data "aws_cloudwatch_log_group" "some_log_group" {
  name = "/some/log/group"
}

resource "aws_lambda_permission" "lambda_permission" {
  action        = "lambda:InvokeFunction"
  function_name = "datadog-forwarder" # this is the default but may be different in your case
  principal     = "logs.amazonaws.com" # or logs.amazonaws.com.cn for China*
  source_arn    = data.aws_cloudwatch_log_group.some_log_group.arn
}

resource "aws_cloudwatch_log_subscription_filter" "datadog_log_subscription_filter" {
  name            = "datadog_log_subscription_filter"
  log_group_name  = <CLOUDWATCH_LOG_GROUP_NAME> # for example, /some/log/group
  destination_arn = <DATADOG_FORWARDER_ARN> # for example,  arn:aws:lambda:us-east-1:123:function:datadog-forwarder
  filter_pattern  = ""
}

* All use of Datadog Services in (or in connection with environments within) mainland China is subject to the disclaimer published in the Restricted Service Locations section on our website.

AWS CloudFormation 사용자의 경우, CloudFormation AWS::Logs::SubscriptionFilter 리소스를 사용하여 트리거를 프로비저닝하고 관리할 수 있습니다. 아래 샘플 코드를 참조하세요.

샘플 코드는 AWS SAMServerless Framework에서도 작동합니다. Serverless Framework의 경우, 코드를 serverless.ymlresources 섹션 아래에 배치하세요.

Resources:
  MyLogSubscriptionFilter:
    Type: "AWS::Logs::SubscriptionFilter"
    Properties:
      DestinationArn: "<DATADOG_FORWARDER_ARN>"
      LogGroupName: "<CLOUDWATCH_LOG_GROUP_NAME>"
      FilterPattern: ""

S3 버킷에서 로그 수집

S3 버킷에서 로그를 수집하는 경우, 다음 방법 중 하나를 사용하여 Datadog Forwarder Lambda 함수 트리거를 설정합니다.

  1. Lambda 함수가 설치되면 AWS 콘솔에서 로그가 포함된 S3 버킷에 트리거를 수동으로 추가합니다.

    트리거 추가
  2. 버킷을 선택한 다음 AWS 안내를 따릅니다.

    Integration Lambda
  3. S3 버킷에 올바른 이벤트 유형을 설정합니다.

    Object Created

완료되면 Datadog Log 섹션으로 이동하여 로그를 탐색해 보세요!

Terraform 사용자의 경우, aws_s3_bucket_notification 리소스를 사용하여 트리거를 프로비저닝하고 관리할 수 있습니다. 아래 샘플 코드를 참조하세요.

resource "aws_s3_bucket_notification" "my_bucket_notification" {
  bucket = my_bucket
  lambda_function {
    lambda_function_arn = "<DATADOG_FORWARDER_ARN>"
    events              = ["s3:ObjectCreated:*"]
    filter_prefix       = "AWSLogs/"
    filter_suffix       = ".log"
  }
}

CloudFormation 사용자의 경우, S3 버킷에 대해 CloudFormation NotificationConfiguration을 사용하여 트리거를 설정할 수 있습니다. 아래 샘플 코드를 참조하세요.

Resources:
  Bucket:
    Type: AWS::S3::Bucket
    Properties:
      BucketName: "<MY_BUCKET>"
      NotificationConfiguration:
        LambdaConfigurations:
        - Event: 's3:ObjectCreated:*'
          Function: "<DATADOG_FORWARDER_ARN>"

스크러빙 및 필터링

Lambda 함수에서 전송된 로그에서 이메일이나 IP 주소를 스크러빙하거나 Lambda 파라미터에서 사용자 지정 스크러빙 규칙을 정의할 수 있습니다. 필터링 옵션을 사용하여 특정 패턴과 일치하는 로그만 전송하거나, 해당 패턴과 일치하지 않는 로그를 제외할 수도 있습니다.

추가 자료