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

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

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

デフォルトでは、Amazon S3 によってサーバーアクセスログは収集されません。ログ記録を有効にすると、Amazon S3 は、ソースバケットのアクセスログを選択されたターゲットバケットに配信します。ターゲットバケットは、ソースバケットと同じ AWS リージョン および AWS アカウント 内になければならず、デフォルトの保存期間設定を含めることはできません。

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

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

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

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

サーバーアクセスのログ記録を有効にする前に、以下の点を考慮してください。

  • バケットポリシーまたはバケットアクセスコントロールリスト (ACL) を使用して、ログ配信許可を付与できます。ただし、バケットポリシーを使用することをお勧めします。ターゲットバケットが、オブジェクト所有権のバケット所有者強制設定を使用している場合、ACL は無効になり、アクセス許可に影響しなくなります。バケットポリシーを使用して、ロギングサービスプリンシパルにアクセス許可を付与する必要があります。詳細については、ログ配信許可 を参照してください。

  • バケットポリシーに拒否の条件を追加すると、Amazon S3 からアクセスログを配信できなくなる場合があります。

  • AES256 (SSE−S3) が使用されている場合、ターゲットのバケットのみデフォルトのバケット暗号化を使用できます。AWS KMS キーを使用したデフォルトの暗号化 (SSE−KMS) はサポートされていません。

  • ターゲットバケットで S3 オブジェクトロックを有効にすることはできません。

ログ配信許可

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

ターゲットバケットのバケットポリシーを使用してアクセスを許可するには、バケットポリシーを更新して、ロギングサービスプリンシパルに s3:PutObject アクセスを許可します。Amazon S3 コンソールを使用してサーバーアクセスログを有効にすると、コンソールは、ターゲットバケットのバケットポリシーを自動的に更新して、ログサービスのプリンシパルにこれらの許可を付与します。サーバーアクセスログをプログラムで有効にすると、ターゲットバケットのバケットポリシーを手動で更新して、ロギングサービスプリンシパルへのアクセスを許可できます。

代わりに、バケット ACL を使用して、アクセスログ配信のアクセスを許可できます。S3ログ配信グループに WRITEREAD_ACP の許可を付与する許可エントリーをバケット ACL に追加します。バケット ACL を使用して S3 ログ配信グループへのアクセスを許可することはお勧めしません。

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

ターゲットバケットが、オブジェクト所有権のバケット所有者強制設定を使用している場合、ACL は無効になり、アクセス許可に影響しなくなります。ログサービスプリンシパルへのアクセスを許可するには、ターゲットバケットのバケットポリシーを更新する必要があります。S3 ログ配信グループへのアクセスを許可すると、バケット ACL を更新できません。また、PutBucketLogging 設定にターゲット許可を含めることはできません。アクセスログ配信用の既存のバケット ACL をバケットポリシーに移行する方法については、サーバーアクセスログ用の S3 ログ配信グループへのアクセスを許可します。 を参照してください。オブジェクトの所有権の詳細については、オブジェクトの所有権の制御とバケットの ACL の無効化。 を参照してください。

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

この例のバケットポリシーは、ロギングサービスプリンシパル (s3:PutObject) に logging.s3.amazonaws.com 許可を付与します。このバケットポリシーを使用するには、例の値を置き換えます。

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

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

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

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

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

WRITE および READ_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 ログ配信グループへのアクセスを許可する場合は、バケットのプロパティフィールドにも AccessControl": "LogDeliveryWrite" を追加する必要があります。これらの許可はバケットの ACL を作成することによってのみ付与することができますが、CloudFormation でバケットのカスタム ACL を作成することはできないため、これを追加することが重要です。使用できるのは既定 ACL だけです。

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

次の例を使用して、AWS Management Console、AWS CLI、REST API、AWS SDK for .NET を使用してサーバーアクセスのログ記録を有効にします。

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

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

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

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

  5. [サーバーアクセスのログ記録] で、[有効化] を選択します。

  6. [ターゲットバケット] で、ログレコードオブジェクトを受け取るバケットの名前を入力します。

    ターゲットバケットは、ソースバケットと同じリージョン内になければならず、デフォルトの保存期間設定を持ってはいけません。

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

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

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

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

ログ記録を有効にするには、PUT Bucket logging リクエストを送信してソースバケットにログ記録設定を追加します。リクエストでは、ターゲットバケットを指定し、またオプションで、すべてのログオブジェクトキーに使用するプレフィックスを指定します。

以下の例では、ターゲットバケットとして LOGBUCKET を、プレフィックスとして logs/ を指定しています。

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

ログオブジェクトはログ配信アカウントが作成および所有し、バケット所有者はログオブジェクトへの完全な許可を付与されます。オプションで、ターゲット許可を使用して、他のユーザーがログにアクセスできるようにアクセス許可を付与できます。詳細については、PUT Bucket logging を参照してください。

注記

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

Amazon S3 では、バケット上のロギング設定を取得するための GET Bucket logging API も提供しています。ログ記録設定を削除するには、PUT Bucket logging リクエストに空の BucketLoggingStatus を指定して送信します。

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

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

.NET

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

この例では、オブジェクト所有権のバケット所有者強制設定を使用するターゲットバケットでは機能しません。

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

using Amazon; using Amazon.S3; using Amazon.S3.Model; using System; using System.Threading.Tasks; namespace Amazon.DocSamples.S3 { class ServerAccesLoggingTest { private const string bucketName = "*** bucket name for which to enable logging ***"; private const string targetBucketName = "*** bucket name where you want access logs stored ***"; private const string logObjectKeyPrefix = "Logs"; // Specify your bucket region (an example region is shown). private static readonly RegionEndpoint bucketRegion = RegionEndpoint.USWest2; private static IAmazonS3 client; public static void Main() { client = new AmazonS3Client(bucketRegion); EnableLoggingAsync().Wait(); } private static async Task EnableLoggingAsync() { try { // Step 1 - Grant Log Delivery group permission to write log to the target bucket. await GrantPermissionsToWriteLogsAsync(); // Step 2 - Enable logging on the source bucket. await EnableDisableLoggingAsync(); } catch (AmazonS3Exception e) { Console.WriteLine("Error encountered on server. Message:'{0}' when writing an object", e.Message); } catch (Exception e) { Console.WriteLine("Unknown encountered on server. Message:'{0}' when writing an object", e.Message); } } private static async Task GrantPermissionsToWriteLogsAsync() { var bucketACL = new S3AccessControlList(); var aclResponse = client.GetACL(new GetACLRequest { BucketName = targetBucketName }); bucketACL = aclResponse.AccessControlList; bucketACL.AddGrant(new S3Grantee { URI = "http://acs.amazonaws.com/groups/s3/LogDelivery" }, S3Permission.WRITE); bucketACL.AddGrant(new S3Grantee { URI = "http://acs.amazonaws.com/groups/s3/LogDelivery" }, S3Permission.READ_ACP); var setACLRequest = new PutACLRequest { AccessControlList = bucketACL, BucketName = targetBucketName }; await client.PutACLAsync(setACLRequest); } private static async Task EnableDisableLoggingAsync() { var loggingConfig = new S3BucketLoggingConfig { TargetBucketName = targetBucketName, TargetPrefix = logObjectKeyPrefix }; // Send request. var putBucketLoggingRequest = new PutBucketLoggingRequest { BucketName = bucketName, LoggingConfig = loggingConfig }; await client.PutBucketLoggingAsync(putBucketLoggingRequest); } } }

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

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

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

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

  • 1-awsexamplebucket1-us-east-1

  • 2-awsexamplebucket1-us-east-1

  • 3-awsexamplebucket1-us-east-1

  • 1-awsexamplebucket1-us-west-2

  • 2-awsexamplebucket1-us-west-2

  1. 次のリージョンに 2 つのロギングバケットを作成します。

    • awsexamplebucket1-logs-us-east-1

    • awsexamplebucket1-logs-us-west-2

  2. その後、次のように Amazon S3 アクセスログを有効にします。

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

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

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

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

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

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

    • バケットポリシーの更新 (推奨) – ロギングサービスプリンシパルにアクセス権限を付与するには、put-bucket-policy を使用します。

      aws s3api put-bucket-policy --bucket awsexamplebucket1-logs --policy file://policy.json

      Policy.json はバケットポリシーを含んでいる現在のフォルダ内の JSON ドキュメントです。このバケットポリシーを使用するには、例の値を置き換えます。

      { "Version": "2012-10-17", "Statement": [ { "Sid": "S3ServerAccessLogsPolicy", "Effect": "Allow", "Principal": { "Service": "logging.s3.amazonaws.com" }, "Action": [ "s3:PutObject" ], "Resource": "arn:aws:s3:::awsexamplebucket1-logs/*", "Condition": { "ArnLike": { "aws:SourceArn": "arn:aws:s3:::SOURCE-BUCKET-NAME" }, "StringEquals": { "aws:SourceAccount": "SOURCE-ACCOUNT-ID" } } } ] }
    • バケット ACL の更新 – S3 ログ配信グループに許可を付与するには、put-bucket-acl を使用します。

      aws s3api put-bucket-acl --bucket awsexamplebucket1-logs --grant-write URI=http://acs.amazonaws.com/groups/s3/LogDelivery --grant-read-acp URI=http://acs.amazonaws.com/groups/s3/LogDelivery
  4. 次に、ログ記録ポリシーを適用します。

    aws s3api put-bucket-logging --bucket awsexamplebucket1 --bucket-logging-status file://logging.json

    Logging.json は現在のフォルダ内の JSON ドキュメントで、ログポリシーが含まれています。バケットがオブジェクト所有権のバケット所有者強制設定を使用している場合、ロギング設定にターゲット権限を含めることはできません。詳細については、ログ配信許可 を参照してください。

    例 – Logging.json ターゲット権限なし

    次の例 Logging.json ファイルには、ターゲット権限が含まれず、オブジェクト所有権のバケット所有者強制設定を使用するバケットに適用できます。

    { "LoggingEnabled": { "TargetBucket": "awsexamplebucket1-logs", "TargetPrefix": "awsexamplebucket1/" } }

    例 – Logging.json ターゲット権限あり

    次の例 Logging.json ファイルには、ターゲット権限が含まれています。

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

    { "LoggingEnabled": { "TargetBucket": "awsexamplebucket1-logs", "TargetPrefix": "awsexamplebucket1/", "TargetGrants": [ { "Grantee": { "Type": "AmazonCustomerByEmail", "EmailAddress": "user@example.com" }, "Permission": "FULL_CONTROL" } ] } }
  5. アカウントのすべてのバケットに対するアクセスログを追加するには、bash スクリプトを使用します。

    注記

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

    例 — バケットポリシーによるアクセスを許可し、アカウントのバケットのロギングを追加します

    loggingBucket='awsexamplebucket1-logs' region='us-west-2' # Create Logging bucket aws s3 mb s3://$loggingBucket --region $region aws s3api put-bucket-policy --bucket $loggingBucket --policy file://policy.json # List buckets in this account buckets="$(aws s3 ls | awk '{print $3}')" # Put bucket logging on each bucket for bucket in $buckets do 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='awsexamplebucket1-logs' region='us-west-2' # Create 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 buckets in this account buckets="$(aws s3 ls | awk '{print $3}')" # Put bucket logging on each bucket for bucket in $buckets do 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"