CloudFormationでaws s3のサーバアクセスログが出力できるバケットを作成してみる

前提

・AWS CLIがインストールされて、初期設定が完了できていること
・s3のサーバアクセスログバケットが作成されていること
 参考:https://cloud5.jp/cloudformation-s3-serveraccesslog/
・実行OS: Windows

背景

aws s3コンソール上でポチポチs3バケットをすぐ作成できますが、操作ミスを防ぐためにコード化したいと思って、CloudFormationのテンプレートを作成してみました。

前の記事は、S3 サーバーアクセスログバケットを作成しました。
ここでは、テスト用でバケットを作成し、サーバーアクセスログバケットにログを出力してみます。

テストバケットの作成コード

テンプレート

S3-Test-Template.yaml

AWSTemplateFormatVersion: '2010-09-09'
Description: 'S3Bucket'
Parameters:
  Environment:
    Type: String
    Description: "Environment"
  S3BucketName:
    Type: String
    Description: Type of this BacketName.

Resources:
  S3BucketServerAccessLogEnabledTest:
    Type: AWS::S3::Bucket
    Properties:
      BucketName: !Ref S3BucketName
      #ログ配信オブジェクトの書き込みとバケットのアクセス権限の読み取りを許可します。
      #https://docs.aws.amazon.com/ja_jp/AmazonS3/latest/dev/acl-overview.html#canned-acl
      AccessControl: LogDeliveryWrite
      PublicAccessBlockConfiguration:
        BlockPublicAcls: True
        BlockPublicPolicy: True
        IgnorePublicAcls: True
        RestrictPublicBuckets: True
      # バージョンニングの有効化
      VersioningConfiguration:
        Status: Enabled
      # サーバーアクセスのログ記録
      LoggingConfiguration:
        DestinationBucketName: !ImportValue cpi-dev-tyo-s3-kby-serveraccesslog #サーバーアクセスログ用バケットを指定
        LogFilePrefix: !Sub 's3log/${AWS::StackName}'
      # デフォルト暗号化
      BucketEncryption:
        ServerSideEncryptionConfiguration:
        - ServerSideEncryptionByDefault:
            SSEAlgorithm: AES256    
Outputs:
  S3BucketServerAccessLogEnabledTest:
    Value: !Ref S3BucketServerAccessLogEnabledTest
    Export:
      Name: !Ref S3BucketName

パラメーター(Inputファイル)

cpi-dev-tyo-s3-kby-serveraccesslogtest.yaml

StackName: 'cpi-dev-tyo-s3-kby-serveraccesslogtest'
Parameters:
- ParameterKey: 'Environment'
  ParameterValue: 'cpi-dev'
- ParameterKey: 'S3BucketName'
  ParameterValue: 'cpi-dev-tyo-s3-kby-serveraccesslogtest'

実行コマンド(Windows Bat)

create_cpi-dev-tyo-s3-kby-serveraccesslogtest.bat

@echo off
set CFN_PATH=D:\AWS-CPI-DEV\90_Template\s3
set INPUT_PATH=D:\AWS-CPI-DEV\90_Template\InputFiles
set TEMPLATE_NAME=S3-Test-Template.yaml
set INPUT_NAME=cpi-dev-tyo-s3-kby-serveraccesslogtest.yaml

aws cloudformation create-stack --template-body file://%CFN_PATH%\%TEMPLATE_NAME% --cli-input-yaml file://%INPUT_PATH%\%INPUT_NAME%

実行例:

create_cpi-dev-tyo-s3-kby-serveraccesslogtest.bat
{
    "StackId": "arn:aws:cloudformation:ap-northeast-1:268673644828:stack/cpi-dev-tyo-s3-kby-serveraccesslogtest/7a9c3840-a5c9-11eb-9f33-0ea879c5d2b9"
}

確認

確認1:CloudFormationコンソール上での確認

確認2:s3コンソール上での確認(バケットが作成されていること)

確認3:s3コンソール上での確認(サーバーアクセスのログ記録が有効になっていること)

確認4:s3コンソール上での確認(ターゲットバケットが設定されていること)

確認5:s3コンソール上での確認(ターゲットバケットでログが出力されること)

※まだ出力されていない
(理由:記録された時間から数時間以内に配信されますが、配信間隔は短くなる場合もあります。)

確認6:時間を立ってから、再度s3コンソール上での確認(ターゲットバケットでログが出力されること)

※出力されていること

注意点

【AWS公式より抜粋】
・ベストエフォート型のサーバーログ配信
サーバーアクセスログレコードの配信は、ベストエフォートで行われます。ログ記録用に適切にバケットを設定した場合、そのバケットへのほとんどのリクエストについてログレコードが配信されます。ほとんどのログレコードは、記録された時間から数時間以内に配信されますが、配信間隔は短くなる場合もあります。

・バケットのログ記録ステータスの変更が有効になるまでには時間がかかる
バケットのログ記録ステータスの変更がログファイルの配信に反映されるまでには時間がかかります。たとえば、バケットのログを有効にする場合、その後数時間に行われるリクエストは記録されることもあれば、されないこともあります。ログ記録のターゲットバケットをバケット A からバケット B に変更すると、その後 1 時間は一部のログがバケット A に引き続き配信されたり、新しいターゲットバケット B に配信されたりします。いずれにしても、最終的に新しい設定が有効になるため、ユーザー側の操作は一切不要です。

参考

https://docs.aws.amazon.com/ja_jp/AmazonS3/latest/userguide/ServerLogs.html

Last modified: 2021-04-26

Author