View a markdown version of this page

CloudWatch Logs へのサーバーアクセスログの配信 - Amazon Simple Storage Service

CloudWatch Logs へのサーバーアクセスログの配信

Amazon CloudWatch Logs が提供するログ配信を使用して、Amazon S3 サーバーアクセスログを Amazon CloudWatch Logs ロググループに配信できます。ログが CloudWatch Logs に保存されたら、CloudWatch Logs Insights でクエリを実行し、アカウントとリージョン間で集約して AWS Key Management Service (AWS KMS) で暗号化し、オプションで Apache Iceberg 形式で Amazon S3 Tables に配信して SQL 分析を行うことができます。また、ログを JSON または Apache Parquet 形式で Amazon S3 に配信したり、Amazon Data Firehose 経由でルーティングしたりすることもできます。

Amazon S3 API ではなく CloudWatch Logs API を使用して配信を設定します。ソースバケットごとにロググループを指定します。複数のバケットが同じロググループを共有することも、各バケットが独自のロググループに配信することもできます。

ヒント

同じバケットに複数のターゲットを設定できます。例えば、インタラクティブなクエリのために CloudWatch Logs ロググループに配信し、同時に Parquet 形式で Amazon S3 に配信して、低コストで長期保存できます。

注記

CloudWatch Logs が提供するログ配信では、Apache Parquet 出力形式を含む配信先として Amazon Data Firehose と Amazon S3 もサポートされています。このページでは、SQL 分析用の S3 Tables 統合もサポートする CloudWatch Logs ロググループのターゲットについて説明します。Firehose と Amazon S3 のターゲットの詳細については、「Amazon CloudWatch Logs ユーザーガイド」の「AWS サービスからのログ記録を有効にする」を参照してください。

注記

代わりに Amazon S3 汎用バケットにサーバーアクセスログを配信する方法については、「Amazon S3 サーバーアクセスログを有効にします。」を参照してください。

前提条件

配信を設定する前に、以下が必要です。

  • Amazon S3 汎用バケット (ログに記録するソースバケット)。

  • ソースバケットと同じ AWS リージョン の CloudWatch Logs ロググループ。

  • 呼び出し元に対する IAM アクセス許可。少なくとも、次のアクセス権限が必要です。

    • logs:PutDeliverySource

    • logs:PutDeliveryDestination

    • logs:CreateDelivery

    • s3:AllowVendedLogDeliveryForResource (ソースバケット上)

    S3 Tables 統合を有効にする計画の場合は、以下も必要です。

    • observabilityadmin:CreateS3TableIntegration

    • logs:AssociateSourceToS3TableIntegration

    • s3tables:CreateTableBucket

    • s3tables:PutTableBucketEncryption

    • s3tables:PutTableBucketPolicy

配信の設定 (AWS CLI)

AWS Command Line Interface を使用して CloudWatch Logs へのサーバーアクセスログ配信を設定するには、次の 3 つのステップを実行します。

  1. 配信ソースを作成します。これにより、Amazon S3 バケットが CloudWatch Logs のログソースとして登録されます。

    aws logs put-delivery-source \ --name my-sal-source \ --resource-arn arn:aws:s3:::my-bucket \ --log-type S3_SERVER_ACCESS_LOGS
  2. 配信先を作成します。これにより、ログが配信される CloudWatch Logs ロググループが指定されます。

    aws logs put-delivery-destination \ --name my-sal-destination \ --delivery-destination-configuration '{"destinationResourceArn": "arn:aws:logs:us-east-1:123456789012:log-group:my-sal-logs"}'
  3. 配信を作成します。これにより、ソースがターゲットにリンクされ、ログの配信が開始されます。

    aws logs create-delivery \ --delivery-source-name my-sal-source \ --delivery-destination-arn arn:aws:logs:us-east-1:123456789012:delivery-destination:my-sal-destination

これらのステップを完了すると、Amazon S3 は CloudWatch Logs ロググループへのサーバーアクセスログの配信を開始します。設定の伝播には 15~20 分かかります。伝播後、ログ配信は通常数時間以内に開始されます。新しいリクエストのみがログに記録されます。履歴データのバックフィルはありません。

配信の設定 (Amazon S3 コンソール)

  1. Amazon S3 コンソール (https://console.aws.amazon.com/s3/) にサインインします。

  2. 左側のナビゲーションペインで、[バケット] を選択します。

  3. ログ記録を有効にするソースバケットの名前を選択します。

  4. [プロパティ] タブを選択します。

  5. [CloudWatch Logs へのサーバーアクセスログ配信] セクションで、[編集] を選択します。

  6. [有効化] を選択します。

  7. 配信先として CloudWatch Logs ロググループを選択または作成します。

  8. (オプション) Apache Iceberg 形式で S3 Tables にログを配信するには、[S3 Tables 統合を有効にする] を選択します。

  9. [Save changes] (変更の保存) をクリックします。

保存後、[CloudWatch Logs へのサーバーアクセスログの配信] セクションに、有効なロググループが表示されます。

配信の設定 (CloudFormation)

AWS CloudFormation を使用して、CloudWatch Logs へのサーバーアクセスログ配信の設定を自動化できます。次のテンプレートは、IAM ロール、CloudWatch Logs ロググループ、配信ソース、配信先、および配信に必要なリソースを作成します。

AWSTemplateFormatVersion: '2010-09-09' Description: S3 Access Logs delivery to CloudWatch Logs Parameters: SourceBucketArn: Type: String Description: ARN of the S3 bucket to enable access logging LogGroupName: Type: String Default: /aws/s3/access-logs Description: CloudWatch Log Group name for SAL delivery Resources: SALLogGroup: Type: AWS::Logs::LogGroup Properties: LogGroupName: !Ref LogGroupName RetentionInDays: 180 SALDeliverySource: Type: AWS::Logs::DeliverySource Properties: Name: !Sub '${AWS::StackName}-sal-source' ResourceArn: !Ref SourceBucketArn LogType: S3_SERVER_ACCESS_LOGS SALDeliveryDestination: Type: AWS::Logs::DeliveryDestination Properties: Name: !Sub '${AWS::StackName}-sal-destination' DestinationResourceArn: !GetAtt SALLogGroup.Arn SALDelivery: Type: AWS::Logs::Delivery Properties: DeliverySourceName: !Ref SALDeliverySource DeliveryDestinationArn: !GetAtt SALDeliveryDestination.Arn

S3 Tables 統合の有効化 (オプション)

S3 Tables 統合を有効にすると、CloudWatch Logs はサーバーアクセスログを Apache Iceberg 形式でアカウントの aws-cloudwatch マネージドテーブルバケットに自動的に配信します。その後、Amazon Athena、Amazon Redshift、または Iceberg 互換ツールを使用して、このデータをクエリできます。

S3 Tables 統合では、ストレージやテーブルのメンテナンスに追加料金はかかりません。CloudWatch Logs の取り込みとクエリリクエストに対してのみ、S3 Tables の料金が発生します。

  1. S3 Tables 統合を作成します (リージョンごと、アカウントごとに 1 回)。

    aws observabilityadmin create-s3-table-integration \ --role-arn arn:aws:iam::123456789012:role/CWLogsS3TableIntegrationRole \ --encryption '{"SseAlgorithm": "AES256"}'

    IAM ロールは logs.amazonaws.com サービスプリンシパルを信頼し、logs:integrateWithS3Table アクセス許可を付与する必要があります。以下に示しているのは、信頼ポリシーの例です。

    { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": "logs.amazonaws.com" }, "Action": "sts:AssumeRole", "Condition": { "StringEquals": { "aws:SourceAccount": "123456789012" }, "ArnLike": { "aws:SourceArn": "arn:aws:logs:us-east-1:123456789012:log-group:log-group-name" } } } ] }

    このロールには以下のアクセス許可ポリシーも必要です。

    { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "logs:integrateWithS3Table", "Resource": "arn:aws:logs:us-east-1:123456789012:log-group:log-group-name", "Condition": { "StringEquals": { "aws:ResourceAccount": "123456789012" } } } ] }
  2. 配信ソースを統合に関連付けます。

    aws logs associate-source-to-s3-table-integration \ --integration-arn integration-arn \ --data-source '{"name":"amazon_s3","type":"server_access"}'

これらのステップの後、CloudWatch Logs は aws-cloudwatch マネージドテーブルバケットを作成し、Iceberg 形式でログの配信を開始します。通常、データは CloudWatch Logs への最初の配信から 1 時間以内に表示されます。

S3 Tables 統合のクエリについては、「S3 Tables でのアクセスログのクエリ」を参照してください。

クロスアカウントおよびクロスリージョン集約

CloudWatch Logs 配信パスは、次の 2 つのオプションを使用して、クロスアカウントログとクロスリージョンログの集約をサポートします。

  • CloudWatch クロスアカウントオブザーバビリティを使用すると、データをコピーすることなく、アカウント間でログをクエリできます。

  • CloudWatch Logs の一元化により、複数のアカウントとリージョンからのログを中央ロググループに統合できます。オプションで、サブスクリプションフィルターを使用して選択的転送を行うことができます。

マルチアカウント設定の場合、管理者は AWS Organizations で CloudWatch Telemetry Config 有効化ルールを使用して、メンバーアカウント間でサーバーアクセスログの配信を自動的に有効にできます。

注記

現在、有効化ルールは S3 Tables 統合の自動有効化をサポートしていません。統合は、アカウントごとに個別に有効にする必要があります。

暗号化

ロググループで AWS KMS の暗号化を設定することで、CloudWatch Logs に配信されるサーバーアクセスログを暗号化できます。サーバーアクセスログがそのロググループに配信されると、AWS KMS キーで暗号化されます。これは、SSE-S3 暗号化のみをサポートする Amazon S3 汎用バケット配信パスのキー制限に対処します。

AWS KMS で暗号化されたロググループと S3 Tables の統合を有効にする場合は、次のサービスプリンシパルに AWS KMS キーポリシーで追加のアクセス許可を付与する必要があります。

{ "Version": "2012-10-17", "Statement": [ { "Sid": "EnableCWSystemTablesKeyUsage", "Effect": "Allow", "Principal": { "Service": "systemtables.cloudwatch.amazonaws.com" }, "Action": [ "kms:DescribeKey", "kms:GenerateDataKey", "kms:Decrypt" ], "Resource": "arn:aws:kms:us-east-1:123456789012:key/key-id", "Condition": { "StringEquals": { "aws:SourceAccount": "123456789012" } } }, { "Sid": "EnableS3TablesMaintenanceKeyUsage", "Effect": "Allow", "Principal": { "Service": "maintenance.s3tables.amazonaws.com" }, "Action": [ "kms:GenerateDataKey", "kms:Decrypt" ], "Resource": "arn:aws:kms:us-east-1:123456789012:key/key-id", "Condition": { "StringLike": { "kms:EncryptionContext:aws:s3:arn": "table-bucket-arn/*" } } } ] }

systemtables.cloudwatch.amazonaws.com プリンシパルは、CloudWatch Logs が S3 Tables にログを書き込むために使用されます。maintenance.s3tables.amazonaws.com プリンシパルは、圧縮などの Iceberg オペレーションのために S3 Tables によって使用されます。

配信の無効化

CloudWatch Logs へのサーバーアクセスログの配信を停止するには、配信または配信ソースを削除します。

  • 配信の削除 – ログ配信を停止しますが、配信ソース設定はそのまま維持します。ソースを再設定しなくても、後で新しい配信を作成できます。

    aws logs delete-delivery \ --id delivery-id
  • 配信ソースの削除 – ソース設定を完全に削除します。CloudWatch Logs 配信に関連付けられたバケットが不要になった場合に使用します。

    aws logs delete-delivery-source \ --name delivery-source-name

以前に配信されたログは、ロググループと S3 Tables の統合 (有効になっている場合) に残ります。配信を削除しても、既存のログデータは削除されません。