前提
・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