Yuta NakataのBlog

Python / AWS / ITについて役立つ情報を発信します

CloudFormationを使ってS3サーバーサイドログをオブジェクトロック有で作成する

やりたいこと

  • S3のサーバーサイドログを有効化してLog情報を収集したい
  • 収集したログ情報はオブジェクトロック有(ガバナンスモード)にしたい
  • IaC化するため、CloudFormation(特にSAM)を使ってリソースは定義・展開したい
  • 最低限のライフサイクルポリシー(一定期間が経ったら、ストレージクラスを変更したり、不完全なマルチアップロードは削除したり)はいれておきたい

実装上の詰まったPoint

オブジェクトロックを有効化したバケットには、サーバーサイドログの書き出しバケットとしては登録できないようです。

なので、

という構成で実装しました。

他にも、良いアプローチがあれば教えて下さい。

ソースコード

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