Amazon S3 サーバーアクセスログを有効にします。 - Amazon Simple Storage Service

Amazon S3 サーバーアクセスログを有効にします。

サーバーアクセスのログには、Amazon S3 バケットに対するリクエストの詳細が記録されます。サーバーアクセスのログは、多くのアプリケーションに役立ちます。例えば、アクセスのログ情報は、セキュリティやアクセスの監査に役立ちます。この情報は、顧客基盤の把握や Amazon S3 の請求の理解にもつながります。

デフォルトでは、Amazon S3 によってサーバーアクセスログは収集されません。ログ記録を有効にすると、Amazon S3 は、ソースバケットのアクセスログを選択された送信先バケット(ターゲットバケット) に配信します。ソースと送信先バケットの両方が同じ AWS リージョン にあり、同じ AWS アカウント が所有している必要があります。

アクセスログのレコードには、バケットに対するリクエストの詳細が取り込まれます。この情報には、リクエストタイプ、リクエストで指定したリソース、リクエストを処理した日時などが含まれます。ログ記録の基本の詳細については、サーバーアクセスログによるリクエストのログ記録 を参照してください。

重要
  • Amazon S3 バケットに対してサーバーアクセスログ記録を有効にしても追加料金はかかりません。ただし、システムが配信するいずれのログファイルの格納に対しても通常の料金がかかります (ログはいつでも削除できます)。ログファイルの配信にデータ転送料金はかかりません。ただし、ログファイルへのアクセスには通常のデータ転送料金がかかります。

  • 送信先バケットでサーバーアクセスのログ記録が有効になっているべきではありません。ログの保存先のバケットとして、ソースバケットと同じリージョンにあるユーザー所有のバケットを指定できます。これにはソースバケット自体も含まれます。ただし、ソースバケットにログを配信すると、ログの無限ループが発生するため、お勧めしません。ログを管理しやすくするため、アクセスログは別のバケットに保存することをお勧めします。詳細については、「ログ配信を有効にするにはどうすればよいですか?」を参照してください。

  • S3 オブジェクトロックが有効になっている S3 バケットは、サーバーアクセスログの送信先バケットとして使用できません。送信先バケットにはデフォルト保持期間設定を指定できません。

  • 送信先バケットでは [リクエスタ支払い] を有効にすることはできません。

  • 送信先バケットでデフォルトのバケット暗号化を使用できるのは、256 ビットの高度暗号化標準 (AES-256) を使用する Amazon S3 マネージドキー S3 によるサーバー側の暗号化を使用する場合のみです。AWS Key Management Service (AWS KMS) キーを使用したデフォルトのサーバー側の暗号化 (SSE−KMS) はサポートされていません。

Amazon S3 コンソール、Amazon S3 API、AWS Command Line Interface (AWS CLI)、AWS SDK を使用して、サーバーアクセスのログ記録を有効または無効にできます。

ログ配信許可

Amazon S3 は特別なログ配信アカウントを使用してサーバーアクセスログを書き込みます。このような書き込みは、通常のアクセスコントロールの制約に従います。アクセスログを配信するには、ロギングサービスプリンシパル (logging.s3.amazonaws.com) に送信先バケットへのアクセス権を付与する必要があります。

Amazon S3 にログ配信アクセス許可を付与するには、送信先バケットの S3 オブジェクト所有権の設定に応じて、バケットポリシーまたはバケットアクセスコントロールリスト (ACL) を使用できます。ただし、ACL の代わりにバケットポリシーを使用することをお勧めします。

S3 オブジェクト所有権のバケット所有者強制設定

送信先バケットが、オブジェクト所有権のバケット所有者強制設定を使用している場合、ACL は無効になり、アクセス許可への影響はなくなります。この場合は、送信先バケットのバケットポリシーを更新して、アクセスログ配信用のログ記録サービスプリンシパルへのアクセス権を付与する必要があります。S3 ログ配信グループへのアクセスを許可すると、バケット ACL を更新できません。また、送信先権限 (別名ターゲット権限) PutBucketLogging を設定に含めることもできません。

アクセスログ配信用の既存のバケット ACL をバケットポリシーに移行する方法については、「サーバーアクセスのログ記録用の S3 ログ配信グループへのアクセスを付与する」を参照してください。オブジェクトの所有権の詳細については、「オブジェクトの所有権の制御とバケットの ACL の無効化。」を参照してください。新しいバケットを作成するとき、ACL はデフォルトでは無効になっています。

バケットポリシーを使用したアクセスの付与

送信先バケットでバケットポリシーを使用してアクセスを許可するには、バケットポリシーを更新して、ログ記録サービスプリンシパルに s3:PutObject アクセス許可を付与します。Amazon S3 コンソールを使用してサーバーアクセスのログ記録を有効にすると、コンソールは、送信先バケットのバケットポリシーを自動的に更新して、ログ記録サービスプリンシパルにこのようなアクセス許可を付与します。プログラムでサーバーアクセスのログ記録を有効にする場合、送信先バケットのバケットポリシーを手動で更新して、アクセスログ配信用のログ記録サービスプリンシパルへのアクセス権を付与する必要があります。

ログ記録サービスプリンシパルのリソースへのアクセスを制限するバケットポリシーの例については、「バケットポリシーを使用して、ロギングサービスプリンシパルに許可を付与」を参照してください。

バケット ACL を使用したアクセスの付与

代わりに、バケット ACL を使用して、アクセスログ配信のアクセスを許可できます。S3 ログ配信グループに WRITEREAD_ACP の許可を付与する許可エントリーをバケット ACL に追加します。ただし、バケット ACL を使用して S3 ログ配信グループへのアクセスを許可することはお勧めしません。詳細については、「オブジェクトの所有権の制御とバケットの ACL の無効化。」を参照してください。アクセスログ配信用の既存のバケット ACL をバケットポリシーに移行する方法については、「サーバーアクセスのログ記録用の S3 ログ配信グループへのアクセスを付与する」を参照してください。ログ記録サービスプリンシパルのリソースへのアクセスを制限する ACL の例については、「バケット ACL を使用して、ログ配信グループにアクセス許可を付与します。」を参照してください。

バケットポリシーを使用して、ロギングサービスプリンシパルに許可を付与

このバケットポリシーの例は、s3:PutObject アクセス許可をログ記録サービスプリンシパル (logging.s3.amazonaws.com) に付与します。このバケットポリシーを実行するには、user input placeholders をユーザー自身の情報に置き換えます。次のポリシーでは、example-s3-destination-bucket はサーバーアクセスログが配信される送信先バケットで、example-s3-source-bucket は送信元バケットです。EXAMPLE-LOGGING-PREFIX は、ログオブジェクトに使用するオプションの送信先のプレフィックス (別称 ターゲットプレフィックス) です。SOURCE-ACCOUNT-ID は、AWS アカウント ソースバケットを所有するグループです。

注記

バケットポリシーに Deny ステートメントがある場合は、それらが Amazon S3 からのアクセスログの配信を防止していないことを確認します。

{ "Version": "2012-10-17", "Statement": [ { "Sid": "S3ServerAccessLogsPolicy", "Effect": "Allow", "Principal": { "Service": "logging.s3.amazonaws.com" }, "Action": [ "s3:PutObject" ], "Resource": "arn:aws:s3:::example-s3-destination-bucket/EXAMPLE-LOGGING-PREFIX*", "Condition": { "ArnLike": { "aws:SourceArn": "arn:aws:s3:::example-s3-source-bucket" }, "StringEquals": { "aws:SourceAccount": "SOURCE-ACCOUNT-ID" } } } ] }

バケット ACL を使用して、ログ配信グループにアクセス許可を付与します。

注記

セキュリティ上のベストプラクティスとして、Amazon S3 はすべての新しいバケットのアクセスコントロールリスト (ACL) をデフォルトで無効にします。Amazon S3 コンソールでの ACL アクセス権限の詳細については、「ACL の設定」を参照してください。

バケット ACL を使用してログ配信グループに許可を付与することはできますが、この方法はお勧めしません。ただし、送信先バケットが、オブジェクト所有権のバケット所有者強制設定を使用している場合、バケット ACL や オブジェクト ACL を設定することはできません。また、送信先権限 (別名ターゲット権限) PutBucketLogging を設定に含めることもできません。代わりに、ロギングサービスプリンシパル (logging.s3.amazonaws.com) にアクセス許可を付与するために、バケットポリシーを使用する必要があります。詳細については、「ログ配信許可」を参照してください。

バケット ACL では、ログ配信グループは次の URL で示されます。

http://acs.amazonaws.com/groups/s3/LogDelivery

WRITEREAD_ACP (ACL 読み取り) アクセス許可を付与するには、送信先バケット ACL に次の権限を追加します。

<Grant> <Grantee xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="Group"> <URI>http://acs.amazonaws.com/groups/s3/LogDelivery</URI> </Grantee> <Permission>WRITE</Permission> </Grant> <Grant> <Grantee xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="Group"> <URI>http://acs.amazonaws.com/groups/s3/LogDelivery</URI> </Grantee> <Permission>READ_ACP</Permission> </Grant>

プログラムを使用して ACL アクセス権限を追加する例については、ACL の設定 を参照してください。

重要

バケットで AWS CloudFormation 使用して Amazon S3 サーバーアクセスロギングを有効にし、ACL を使用して S3 ログ配信グループへのアクセスを許可する場合は、CloudFormation テンプレートにも「AccessControl": "LogDeliveryWrite"」を追加する必要があります。このようなアクセス許可はバケット ACL を作成することによってのみ付与できます。CloudFormation ではバケットのカスタム ACL を作成できないため、これを実行することは重要です。CloudFormation で使用できるのは既定 ACL のみです。

サーバーアクセスのログ記録を有効にします

Amazon S3 コンソール、Amazon S3 REST API、AWS SDK、AWS CLI を使用してサーバーアクセスのログ記録を有効にするには、次の手順を実行します。

  1. AWS Management Console にサインインし、Amazon S3 コンソール (https://console.aws.amazon.com/s3/) を開きます。

  2. [バケット] リストで、サーバーアクセスログ記録を有効にするバケットの名前を選択します。

  3. [プロパティ] を選択します。

  4. [サーバーアクセスのログ記録] で、[編集] を選択します。

  5. [Server access logging] (サーバーアクセスのログ記録) で[Enable] (有効) を選択します。

  6. [送信先バケット] の下で、バケットとオプションのプレフィックスを指定します。プレフィックスを指定する場合は、ログを検出しやすくするために、プレフィックスの後にスラッシュ (/) を付けることをお勧めします。

    注記

    スラッシュ (/) を使用したプレフィックスを指定すると、ログオブジェクトが見つけやすくなります。例えば、プレフィックスの値として logs/ を指定すると、次のとおり Amazon S3 で作成する各ログオブジェクトのキーの先頭に logs/ というプレフィックスが付けられます。

    logs/2013-11-01-21-32-16-E568B2907131C0C0

    プレフィックス値 logs を指定すると、ログオブジェクトは次のように表示されます。

    logs2013-11-01-21-32-16-E568B2907131C0C0
  7. [ログオブジェクトキーの形式] の下で、次を設定します。

    • 日付ベース以外のパーティション分割を選択するには、[DestinationPrefix][YYYY]-[MM]-[DD]-[hh]-[mm]-[ss]-[UniqueString] を選択します。

    • 日付ベースでパーティション分割するには、[DestinationPrefix][SourceAccountId]/[SourceRegion]/[SourceBucket]/[YYYY]/[MM]/[DD]/[YYYY]-[MM]-[DD]-[hh]-[mm]-[ss]-[UniqueString] を選択してから、[S3 イベント時刻] または [ログファイルの配信時刻] を選択します。

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

    バケットでサーバーアクセスのログ記録を有効にすると、コンソールはソースバケットでのログ記録を有効にして、送信先バケットのバケットポリシーを更新し、ログ記録サービスプリンシパル (logging.s3.amazonaws.com) に s3:PutObject アクセス許可を付与します。バケットポリシーの詳細については、バケットポリシーを使用して、ロギングサービスプリンシパルに許可を付与 を参照してください。

    ログは 送信先バケットで確認できます。サーバーアクセスのログ記録を有効にすると、ログがターゲットバケットに配信されるまでに数時間かかることがあります。ログ配信の方法と間隔の詳細については、ログを配信する方法 を参照してください。

詳細については、「S3 バケットのプロパティを表示するには」を参照してください。

ログ記録を有効にするには、PutBucketLogging リクエストを送信してソースバケットにログ記録の設定を追加します。リクエストでは、送信先バケット (別名 ターゲットバケット) を指定し、必要に応じて、すべてのログオブジェクトキーに使用するプレフィックスを指定します。

送信先バケットとして example-s3-destination-bucket を、プレフィックスとして logs/ を指定する例は次のとおりです。

<BucketLoggingStatus xmlns="http://doc.s3.amazonaws.com/2006-03-01"> <LoggingEnabled> <TargetBucket>example-s3-destination-bucket</TargetBucket> <TargetPrefix>logs/</TargetPrefix> </LoggingEnabled> </BucketLoggingStatus>

送信先バケットとして example-s3-destination-bucket を、プレフィックスとして logs/ を、ログオブジェクトキーの形式として EventTime を指定する例は次のとおりです。

<BucketLoggingStatus xmlns="http://doc.s3.amazonaws.com/2006-03-01"> <LoggingEnabled> <TargetBucket>example-s3-destination-bucket</TargetBucket> <TargetPrefix>logs/</TargetPrefix> <TargetObjectKeyFormat> <PartitionedPrefix> <PartitionDateSource>EventTime</PartitionDateSource> </PartitionedPrefix> </TargetObjectKeyFormat> </LoggingEnabled> </BucketLoggingStatus>

ログオブジェクトはログ配信アカウントが作成および所有し、バケット所有者はログオブジェクトへの完全な許可を付与されます。必要に応じて、送信先権限 (別名ターゲット権限) をして、他のユーザーがログにアクセスできるようにアクセス許可を付与できます。詳細については、「PutBucketLogging」を参照してください。

注記

送信先バケットが、オブジェクト所有権のバケット所有者強制設定を使用している場合、送信先権限を使用してその他のユーザーにアクセス許可を付与することはできません。その他のユーザーにアクセス許可を付与するには、送信先バケットのバケットポリシーを更新します。詳細については、「ログ配信許可」を参照してください。

バケットのログ記録設定を取得するには、GetBucketLogging API オペレーションを使用します。

ログ記録設定を削除するには、PutBucketLogging リクエストで空の BucketLoggingStatus を指定して送信します。

<BucketLoggingStatus xmlns="http://doc.s3.amazonaws.com/2006-03-01"> </BucketLoggingStatus>

バケットでログ記録を有効にするには、Amazon S3 API または AWS SDK ラッパーライブラリを使用できます。

バケットでログ記録を有効化する例は次のとおりです。ソースバケットと送信先 (ターゲット) バケットの 2 つのバケットを作成する必要があります。 この例ではまず、送信先バケットのバケット ACL を更新します。この例では、まず送信先バケットにログを書き込むために必要なアクセス許可をログ配信グループに付与して、次にソースバケットでのログ記録を有効にしています。

このような例では、オブジェクト所有権のバケット所有者の強制設定を使用する送信先バケットでは機能しません。

送信先 (ターゲット) バケットが、オブジェクト所有権にバケット所有者の強制設定を使用している場合、バケット ACL や オブジェクト ACL を設定することはできません。PutBucketLogging 設定には、送信先 (ターゲット) 権限を含めることもできません。ロギングサービスプリンシパル (logging.s3.amazonaws.com) に許可を付与するために、バケットポリシーを使用する必要があります。詳細については、「ログ配信許可」を参照してください。

.NET
AWS SDK for .NET
注記

GitHub には、その他のリソースもあります。AWS コード例リポジトリ で全く同じ例を見つけて、設定と実行の方法を確認してください。

using System; using System.IO; using System.Threading.Tasks; using Amazon.S3; using Amazon.S3.Model; using Microsoft.Extensions.Configuration; /// <summary> /// This example shows how to enable logging on an Amazon Simple Storage /// Service (Amazon S3) bucket. You need to have two Amazon S3 buckets for /// this example. The first is the bucket for which you wish to enable /// logging, and the second is the location where you want to store the /// logs. /// </summary> public class ServerAccessLogging { private static IConfiguration _configuration = null!; public static async Task Main() { LoadConfig(); string bucketName = _configuration["BucketName"]; string logBucketName = _configuration["LogBucketName"]; string logObjectKeyPrefix = _configuration["LogObjectKeyPrefix"]; string accountId = _configuration["AccountId"]; // If the AWS Region defined for your default user is different // from the Region where your Amazon S3 bucket is located, // pass the Region name to the Amazon S3 client object's constructor. // For example: RegionEndpoint.USWest2 or RegionEndpoint.USEast2. IAmazonS3 client = new AmazonS3Client(); try { // Update bucket policy for target bucket to allow delivery of logs to it. await SetBucketPolicyToAllowLogDelivery( client, bucketName, logBucketName, logObjectKeyPrefix, accountId); // Enable logging on the source bucket. await EnableLoggingAsync( client, bucketName, logBucketName, logObjectKeyPrefix); } catch (AmazonS3Exception e) { Console.WriteLine($"Error: {e.Message}"); } } /// <summary> /// This method grants appropriate permissions for logging to the /// Amazon S3 bucket where the logs will be stored. /// </summary> /// <param name="client">The initialized Amazon S3 client which will be used /// to apply the bucket policy.</param> /// <param name="sourceBucketName">The name of the source bucket.</param> /// <param name="logBucketName">The name of the bucket where logging /// information will be stored.</param> /// <param name="logPrefix">The logging prefix where the logs should be delivered.</param> /// <param name="accountId">The account id of the account where the source bucket exists.</param> /// <returns>Async task.</returns> public static async Task SetBucketPolicyToAllowLogDelivery( IAmazonS3 client, string sourceBucketName, string logBucketName, string logPrefix, string accountId) { var resourceArn = @"""arn:aws:s3:::" + logBucketName + "/" + logPrefix + @"*"""; var newPolicy = @"{ ""Statement"":[{ ""Sid"": ""S3ServerAccessLogsPolicy"", ""Effect"": ""Allow"", ""Principal"": { ""Service"": ""logging.s3.amazonaws.com"" }, ""Action"": [""s3:PutObject""], ""Resource"": [" + resourceArn + @"], ""Condition"": { ""ArnLike"": { ""aws:SourceArn"": ""arn:aws:s3:::" + sourceBucketName + @""" }, ""StringEquals"": { ""aws:SourceAccount"": """ + accountId + @""" } } }] }"; Console.WriteLine($"The policy to apply to bucket {logBucketName} to enable logging:"); Console.WriteLine(newPolicy); PutBucketPolicyRequest putRequest = new PutBucketPolicyRequest { BucketName = logBucketName, Policy = newPolicy, }; await client.PutBucketPolicyAsync(putRequest); Console.WriteLine("Policy applied."); } /// <summary> /// This method enables logging for an Amazon S3 bucket. Logs will be stored /// in the bucket you selected for logging. Selected prefix /// will be prepended to each log object. /// </summary> /// <param name="client">The initialized Amazon S3 client which will be used /// to configure and apply logging to the selected Amazon S3 bucket.</param> /// <param name="bucketName">The name of the Amazon S3 bucket for which you /// wish to enable logging.</param> /// <param name="logBucketName">The name of the Amazon S3 bucket where logging /// information will be stored.</param> /// <param name="logObjectKeyPrefix">The prefix to prepend to each /// object key.</param> /// <returns>Async task.</returns> public static async Task EnableLoggingAsync( IAmazonS3 client, string bucketName, string logBucketName, string logObjectKeyPrefix) { Console.WriteLine($"Enabling logging for bucket {bucketName}."); var loggingConfig = new S3BucketLoggingConfig { TargetBucketName = logBucketName, TargetPrefix = logObjectKeyPrefix, }; var putBucketLoggingRequest = new PutBucketLoggingRequest { BucketName = bucketName, LoggingConfig = loggingConfig, }; await client.PutBucketLoggingAsync(putBucketLoggingRequest); Console.WriteLine($"Logging enabled."); } /// <summary> /// Loads configuration from settings files. /// </summary> public static void LoadConfig() { _configuration = new ConfigurationBuilder() .SetBasePath(Directory.GetCurrentDirectory()) .AddJsonFile("settings.json") // Load settings from .json file. .AddJsonFile("settings.local.json", true) // Optionally, load local settings. .Build(); } }
  • API の詳細については、「AWS SDK for .NET API リファレンス」の「PutBucketLogging」を参照してください。

Java
import software.amazon.awssdk.regions.Region; import software.amazon.awssdk.services.s3.S3Client; import software.amazon.awssdk.services.s3.model.BucketLoggingStatus; import software.amazon.awssdk.services.s3.model.LoggingEnabled; import software.amazon.awssdk.services.s3.model.PartitionedPrefix; import software.amazon.awssdk.services.s3.model.PutBucketLoggingRequest; import software.amazon.awssdk.services.s3.model.TargetObjectKeyFormat; // Class to set a bucket policy on a target S3 bucket and enable server access logging on a source S3 bucket. public class ServerAccessLogging { private static S3Client s3Client; public static void main(String[] args) { String sourceBucketName = "SOURCE-BUCKET"; String targetBucketName = "TARGET-BUCKET"; String sourceAccountId = "123456789012"; String targetPrefix = "logs/"; // Create S3 Client. s3Client = S3Client.builder(). region(Region.US_EAST_2) .build(); // Set a bucket policy on the target S3 bucket to enable server access logging by granting the // logging.s3.amazonaws.com principal permission to use the PutObject operation. ServerAccessLogging serverAccessLogging = new ServerAccessLogging(); serverAccessLogging.setTargetBucketPolicy(sourceAccountId, sourceBucketName, targetBucketName); // Enable server access logging on the source S3 bucket. serverAccessLogging.enableServerAccessLogging(sourceBucketName, targetBucketName, targetPrefix); } // Function to set a bucket policy on the target S3 bucket to enable server access logging by granting the // logging.s3.amazonaws.com principal permission to use the PutObject operation. public void setTargetBucketPolicy(String sourceAccountId, String sourceBucketName, String targetBucketName) { String policy = "{\n" + " \"Version\": \"2012-10-17\",\n" + " \"Statement\": [\n" + " {\n" + " \"Sid\": \"S3ServerAccessLogsPolicy\",\n" + " \"Effect\": \"Allow\",\n" + " \"Principal\": {\"Service\": \"logging.s3.amazonaws.com\"},\n" + " \"Action\": [\n" + " \"s3:PutObject\"\n" + " ],\n" + " \"Resource\": \"arn:aws:s3:::" + targetBucketName + "/*\",\n" + " \"Condition\": {\n" + " \"ArnLike\": {\n" + " \"aws:SourceArn\": \"arn:aws:s3:::" + sourceBucketName + "\"\n" + " },\n" + " \"StringEquals\": {\n" + " \"aws:SourceAccount\": \"" + sourceAccountId + "\"\n" + " }\n" + " }\n" + " }\n" + " ]\n" + "}"; s3Client.putBucketPolicy(b -> b.bucket(targetBucketName).policy(policy)); } // Function to enable server access logging on the source S3 bucket. public void enableServerAccessLogging(String sourceBucketName, String targetBucketName, String targetPrefix) { TargetObjectKeyFormat targetObjectKeyFormat = TargetObjectKeyFormat.builder() .partitionedPrefix(PartitionedPrefix.builder().partitionDateSource("EventTime").build()) .build(); LoggingEnabled loggingEnabled = LoggingEnabled.builder() .targetBucket(targetBucketName) .targetPrefix(targetPrefix) .targetObjectKeyFormat(targetObjectKeyFormat) .build(); BucketLoggingStatus bucketLoggingStatus = BucketLoggingStatus.builder() .loggingEnabled(loggingEnabled) .build(); s3Client.putBucketLogging(PutBucketLoggingRequest.builder() .bucket(sourceBucketName) .bucketLoggingStatus(bucketLoggingStatus) .build()); } }

S3 バケットがある各 AWS リージョンに専用のログ記録バケットを作成することをお勧めします。その後、Amazon S3 アクセスログをその S3 バケットに配信します。詳細と例については、「AWS CLI リファレンス」の「put-bucket-logging」を参照してください。

送信先 (ターゲット) バケットが、オブジェクト所有権にバケット所有者の強制設定を使用している場合、バケット ACL や オブジェクト ACL を設定することはできません。PutBucketLogging 設定には、送信先 (ターゲット) 権限を含めることもできません。ロギングサービスプリンシパル (logging.s3.amazonaws.com) に許可を付与するために、バケットポリシーを使用する必要があります。詳細については、「ログ配信許可」を参照してください。

例 − 2 つのリージョンの 5 つのバケットでアクセスログを有効にする

この例では、次の 5 つのバケットがあります。

  • 1-DOC-EXAMPLE-BUCKET1-us-east-1

  • 2-DOC-EXAMPLE-BUCKET1-us-east-1

  • 3-DOC-EXAMPLE-BUCKET1-us-east-1

  • 1-DOC-EXAMPLE-BUCKET1-us-west-2

  • 2-DOC-EXAMPLE-BUCKET1-us-west-2

注記

次の手順の最後のステップでは、ログ記録バケットを作成して、そのバケットでサーバーアクセスのログ記録を有効にするために使用できる bash スクリプトの例が示されています。このようなスクリプトを使用するには、次の手順で説明されるとおり、policy.jsonlogging.json ファイルを作成する必要があります。

  1. 米国西部 (オレゴン) リージョンと米国東部 (バージニア北部) リージョンに 2 つのログ記録先バケットを作成して、次の名前を付けます。

    • DOC-EXAMPLE-BUCKET1-logs-us-east-1

    • DOC-EXAMPLE-BUCKET1-logs-us-west-2

  2. このステップの後半では、次のとおりサーバーアクセスのログ記録を有効にします。

    • 1-DOC-EXAMPLE-BUCKET1-us-east-1 は、プレフィックス DOC-EXAMPLE-BUCKET1-logs-us-east-1 を使用して S3 バケット 1-DOC-EXAMPLE-BUCKET1-us-east-1 にログを記録します。

    • 2-DOC-EXAMPLE-BUCKET1-us-east-1 は、プレフィックス DOC-EXAMPLE-BUCKET1-logs-us-east-1 を使用して S3 バケット 2-DOC-EXAMPLE-BUCKET1-us-east-1 にログを記録します。

    • 3-DOC-EXAMPLE-BUCKET1-us-east-1 は、プレフィックス DOC-EXAMPLE-BUCKET1-logs-us-east-1 を使用して S3 バケット 3-DOC-EXAMPLE-BUCKET1-us-east-1 にログを記録します。

    • 1-DOC-EXAMPLE-BUCKET1-us-west-2 は、プレフィックス DOC-EXAMPLE-BUCKET1-logs-us-west-2 を使用して S3 バケット 1-DOC-EXAMPLE-BUCKET1-us-west-2 にログを記録します。

    • 2-DOC-EXAMPLE-BUCKET1-us-west-2 は、プレフィックス DOC-EXAMPLE-BUCKET1-logs-us-west-2 を使用して S3 バケット 2-DOC-EXAMPLE-BUCKET1-us-west-2 にログを記録します。

  3. バケット ACL またはバケットポリシーを使用して、サーバーアクセスのログ記録の配信の許可を付与します。

    • バケットポリシーの更新 (推奨) – ロギングサービスプリンシパルにアクセス許可を付与するには、次の put-bucket-policy コマンドを使用します。example-s3-destination-bucket-logs を、宛先のバケットの名前に置き換えます。

      aws s3api put-bucket-policy --bucket example-s3-destination-bucket-logs --policy file://policy.json

      Policy.json は、次のバケットポリシーを含む現在のフォルダ内の JSON ドキュメントです。このバケットポリシーを実行するには、user input placeholders をユーザー自身の情報に置き換えます。次のポリシーでは、example-s3-destination-bucket-logs はサーバーアクセスログが配信される送信先バケットであり、example-s3-source-bucket はソースバケットです。SOURCE-ACCOUNT-ID は、ソースバケットを所有する AWS アカウント です。

      { "Version": "2012-10-17", "Statement": [ { "Sid": "S3ServerAccessLogsPolicy", "Effect": "Allow", "Principal": { "Service": "logging.s3.amazonaws.com" }, "Action": [ "s3:PutObject" ], "Resource": "arn:aws:s3:::example-s3-destination-bucket-logs/*", "Condition": { "ArnLike": { "aws:SourceArn": "arn:aws:s3:::example-s3-source-bucket" }, "StringEquals": { "aws:SourceAccount": "SOURCE-ACCOUNT-ID" } } } ] }
    • バケット ACL の更新 – S3 ログ配信グループに許可を付与するには、次の put-bucket-acl コマンドを使用します。example-s3-destination-bucket-logs は、送信先 (ターゲット) バケット名前に置き換えます。

      aws s3api put-bucket-acl --bucket example-s3-destination-bucket-logs --grant-write URI=http://acs.amazonaws.com/groups/s3/LogDelivery --grant-read-acp URI=http://acs.amazonaws.com/groups/s3/LogDelivery
  4. 次に、(次の 3 つの例のうちのいずれかに基づいた) ログ記録設定を含む logging.json ファイルを作成します。logging.json ファイルを作成したら、次の put-bucket-logging コマンドを使用してログ記録設定を適用できます。example-s3-destination-bucket-logs は、送信先 (ターゲット) バケット名前に置き換えます。

    aws s3api put-bucket-logging --bucket example-s3-destination-bucket-logs --bucket-logging-status file://logging.json
    注記

    この put-bucket-logging コマンドを使用して各送信先バケットにログ記録設定を適用する代わりに、次のステップで提供される bash スクリプトのいずれかを使用できます。このようなスクリプトを使用するには、次の手順のとおり、policy.jsonlogging.json ファイルを作成する必要があります。

    logging.json ファイルは、ログ記録設定を含む現在のフォルダ内の JSON ドキュメントです。送信先バケットがオブジェクト所有権に対してバケット所有者の強制設定を使用している場合、ログ記録設定に送信先 (ターゲット) の権限を含めることはできません。詳細については、「ログ配信許可」を参照してください。

    例 — 送信先 (ターゲット) 権限なしの logging.json

    次の例の logging.json ファイルには、送信先 (ターゲット) 権限が含まれていません。そのため、オブジェクト所有権のバケット所有者の強制設定を使用する送信先 (ターゲット) バケットにこの設定を適用できます。

    { "LoggingEnabled": { "TargetBucket": "example-s3-destination-bucket-logs", "TargetPrefix": "example-s3-destination-bucket/" } }
    例 — 送信先 (ターゲット) 権限のある logging.json

    次の例の logging.json ファイルには、送信先 (ターゲット) 権限が含まれています。

    送信先バケットが、オブジェクト所有権のバケット所有者の強制設定を使用している場合、PutBucketLogging 設定に送信先 (ターゲット) 権限を含めることはできません。詳細については、「ログ配信許可」を参照してください。

    { "LoggingEnabled": { "TargetBucket": "example-s3-destination-bucket-logs", "TargetPrefix": "example-s3-destination-bucket/", "TargetGrants": [ { "Grantee": { "Type": "AmazonCustomerByEmail", "EmailAddress": "user@example.com" }, "Permission": "FULL_CONTROL" } ] } }
    例 – ログオブジェクトキーを S3 イベント時刻に設定した logging.json

    次の logging.json ファイルは、ログオブジェクトキーの形式を S3 イベント時刻に変更します。暗号化キーの使用の詳細については、「ログ配信を有効にするにはどうすればよいですか?」を参照してください。

    { "LoggingEnabled": { "TargetBucket": "example-s3-destination-bucket-logs", "TargetPrefix": "example-s3-destination-bucket/", "TargetObjectKeyFormat": { "PartitionedPrefix": { "PartitionDateSource": "EventTime" } } } }
  5. アカウントのすべてのバケットに対するアクセスログを追加するには、次の bash スクリプトのいずれかを使用します。example-s3-destination-bucket-logs は、送信先 (ターゲット) バケットの名前に置き換え、us-west-2 はバケットが配置されているリージョンの名前に置き換えます。

    注記

    これはすべてのバケットが同じリージョンにある場合にのみ機能します。複数のリージョンにバケットがある場合は、スクリプトを調整する必要があります。

    例 — バケットポリシーによるアクセスを許可し、アカウントのバケットのロギングを追加します
    loggingBucket='example-s3-destination-bucket-logs' region='us-west-2' # Create the logging bucket. aws s3 mb s3://$loggingBucket --region $region aws s3api put-bucket-policy --bucket $loggingBucket --policy file://policy.json # List the buckets in this account. buckets="$(aws s3 ls | awk '{print $3}')" # Put a bucket logging configuration on each bucket. for bucket in $buckets do # This if statement excludes the logging bucket. if [ "$bucket" != "$loggingBucket" ] ; then continue; fi printf '{ "LoggingEnabled": { "TargetBucket": "%s", "TargetPrefix": "%s/" } }' "$loggingBucket" "$bucket" > logging.json aws s3api put-bucket-logging --bucket $bucket --bucket-logging-status file://logging.json echo "$bucket done" done rm logging.json echo "Complete"
    例 — バケット ACL でアクセス権を付与し、アカウントのバケットのロギングを追加します
    loggingBucket='example-s3-destination-bucket-logs' region='us-west-2' # Create the logging bucket. aws s3 mb s3://$loggingBucket --region $region aws s3api put-bucket-acl --bucket $loggingBucket --grant-write URI=http://acs.amazonaws.com/groups/s3/LogDelivery --grant-read-acp URI=http://acs.amazonaws.com/groups/s3/LogDelivery # List the buckets in this account. buckets="$(aws s3 ls | awk '{print $3}')" # Put a bucket logging configuration on each bucket. for bucket in $buckets do # This if statement excludes the logging bucket. if [ "$bucket" != "$loggingBucket" ] ; then continue; fi printf '{ "LoggingEnabled": { "TargetBucket": "%s", "TargetPrefix": "%s/" } }' "$loggingBucket" "$bucket" > logging.json aws s3api put-bucket-logging --bucket $bucket --bucket-logging-status file://logging.json echo "$bucket done" done rm logging.json echo "Complete"

サーバーアクセスログ設定の検証

サーバーアクセスロギングを有効にしたら、以下の手順を実行します。

  • 送信先バケットにアクセスして、ログファイルが配信されていることを確認します。アクセスログを設定した後、すべてのリクエストが正しく記録され、配信されるまでに 1 時間以上かかる場合があります。Amazon S3 リクエストメトリクスを使用し、これらのメトリックスに Amazon CloudWatch アラームを設定することで、ログ配信を自動的に検証することもできます。詳細については、「Amazon CloudWatch によるメトリクスのモニタリング」を参照してください。

  • ログファイルのコンテンツを開いて読み取ることができることを確認します。

サーバアクセスロギングのトラブルシューティング情報については、サーバーのアクセスログ記録のトラブルシューティング を参照してください。