やりたいこと
- S3のサーバーサイドログを有効化してLog情報を収集したい
- 収集したログ情報はオブジェクトロック有(ガバナンスモード)にしたい
- IaC化するため、CloudFormation(特にSAM)を使ってリソースは定義・展開したい
- 最低限のライフサイクルポリシー(一定期間が経ったら、ストレージクラスを変更したり、不完全なマルチアップロードは削除したり)はいれておきたい
実装上の詰まったPoint
オブジェクトロックを有効化したバケットには、サーバーサイドログの書き出しバケットとしては登録できないようです。
なので、
- [1]中間バケットに一旦、ログデータを書き出し
- [2]中間バケットのレプリケーションを有効化し、ログバケットにレプリケーション(複製)を行う
- [3]中間バケットに書き出されるデータは逐次削除して、コスト最適化を行う
という構成で実装しました。
他にも、良いアプローチがあれば教えて下さい。
ソースコード
AWSTemplateFormatVersion: 2010-09-09 Transform: AWS::Serverless-2016-10-31 Resources: # サーバサイドログを有効化したいバケットを定義 SourceBucket: Type: AWS::S3::Bucket Properties: BucketName: source-bucket ReplicationConfiguration: Role: !GetAtt LogBucketInteremediateRole.Arn Rules: - Destination: Bucket: !Sub arn:aws:s3:::${LogBucket} Status: Enabled VersioningConfiguration: Status: Enabled LifecycleConfiguration: Rules: - Id: delete-multipart Status: Enabled AbortIncompleteMultipartUpload: DaysAfterInitiation: 1 # 中間バケットを定義 IntermediateLogBucket: Type: AWS::S3::Bucket Properties: BucketName: mid-log-bucket ReplicationConfiguration: Role: !GetAtt LogBucketInteremediateRole.Arn Rules: - Destination: Bucket: !Sub arn:aws:s3:::${LogBucket} Status: Enabled VersioningConfiguration: Status: Enabled LifecycleConfiguration: Rules: - Id: delete-multipart Status: Enabled AbortIncompleteMultipartUpload: DaysAfterInitiation: 1 - Id: delete-objects-after-1-day Status: Enabled Expiration: Days: 1 # IAM Roleを定義 LogBucketInteremediateRole: Type: AWS::IAM::Role Properties: AssumeRolePolicyDocument: Version: 2012-10-17 Statement: - Effect: Allow Action: sts:AssumeRole Principal: Service: s3.amazonaws.com Policies: - PolicyName: s3-replication-policy PolicyDocument: Version: 2012-10-17 Statement: - Effect: Allow Action: - s3:ListBucket - s3:GetReplicationConfiguration Resource: mid-log-bucket - Effect: Allow Action: - s3:GetObjectVersionForReplication - s3:GetObjectVersionAcl - s3:GetObjectVersionTagging Resource: mid-log-bucket* - Effect: Allow Action: - s3:ReplicateObject - s3:ReplicateDelete - s3:ReplicateTags Resource: - !Sub arn:aws:s3:::${LogBucket}/* # オブジェクトロックロックを有効化するバケットを定義 LogBucket: Type: AWS::S3::Bucket Properties: BucketName: log-bucket VersioningConfiguration: Status: Enabled ObjectLockEnabled: True ObjectLockConfiguration: ObjectLockEnabled: Enabled Rule: DefaultRetention: Mode: GOVERNANCE Years: 3 LifecycleConfiguration: Rules: - Id: delete-multipart Status: Enabled AbortIncompleteMultipartUpload: DaysAfterInitiation: 1 - Id: archive Status: Enabled Prefix: logs/ Transitions: - StorageClass: GLACIER_IR TransitionInDays: 30 # バケットポリシーを定義 LogBucketIntermediatePolicy: Type: AWS::S3::BucketPolicy Properties: Bucket: !Ref IntermediateLogBucket PolicyDocument: Version: 2012-10-17 Statement: - Effect: Allow Principal: Service: logging.s3.amazonaws.com Action: s3:PutObject Resource: !Sub arn:aws:s3:::${IntermediateLogBucket}/* Condition: ArnLike: aws:SourceArn: arn:aws:s3:::source-bucket # バケットポリシーを定義 LogBucketPolicy: Type: AWS::S3::BucketPolicy Properties: Bucket: !Ref LogBucket PolicyDocument: Statement: - Action: - s3:GetBucketAcl Effect: Allow Principal: Service: cloudtrail.amazonaws.com Resource: !Sub arn:aws:s3:::${LogBucket} - Action: - s3:PutObject Effect: Allow Principal: Service: cloudtrail.amazonaws.com Resource: !Sub arn:aws:s3:::${LogBucket}/* Condition: StringEquals: s3:x-amz-acl: bucket-owner-full-control