1. Logging Data Egress for Compliance in Machine Learning Projects with S3


    When it comes to compliance in machine learning projects, logging data egress (data that is transferred out of your systems to other locations) is critical. For AWS users, Amazon S3 is widely used for storing and managing data for ML projects due to its scalability, data availability, and security features.

    To log data egress for compliance purposes using S3, one needs to establish a mechanism to capture and monitor the data access patterns. You can make use of AWS CloudTrail to log the API activity for S3 and other AWS services. This includes logging the GetObject requests, which represent data being read from your S3 buckets.

    You would typically follow these steps for compliance:

    1. Enable server access logging for your S3 buckets to capture all requests made to the bucket.
    2. Enable data event logging with AWS CloudTrail to log GetObject requests.
    3. Use AWS CloudWatch or S3 Analytics to monitor and analyze the logs.

    In the following Pulumi program, I will demonstrate how to set up an S3 bucket with access logging enabled and configure a CloudTrail trail to log S3 data events. I’ll also add an S3 bucket policy to restrict permissions as an extra measure.

    import pulumi import pulumi_aws as aws # Create an S3 bucket for storing the logs log_bucket = aws.s3.Bucket("logBucket", acl="log-delivery-write") # Enable server access logging for the S3 bucket where your data will be stored data_bucket = aws.s3.Bucket("dataBucket", acl="private", # Access control list loggings=[aws.s3.BucketLoggingArgs( target_bucket=log_bucket.id, target_prefix="log/" # Prefix for log files )] ) # Create a CloudTrail trail to log S3 'GetObject' requests for compliance trail = aws.cloudtrail.Trail("trail", s3_bucket_name=log_bucket.id, include_global_service_events=False, is_multi_region_trail=False, enable_log_file_validation=True, event_selectors=[aws.cloudtrail.TrailEventSelectorArgs( read_write_type="ReadOnly", # Only logging read events for compliance include_management_events=False, data_resources=[aws.cloudtrail.TrailEventSelectorDataResourceArgs( type="AWS::S3::Object", values=[data_bucket.arn.apply(lambda arn: arn + "/")], # Log 'GetObject' requests for the data bucket )] )] ) # Define a bucket policy to restrict unauthorized access and ensure security bucket_policy = aws.s3.BucketPolicy("bucketPolicy", bucket=data_bucket.id, policy=data_bucket.arn.apply(lambda arn: { "Version": "2012-10-17", "Statement": [{ "Effect": "Allow", "Principal": "*", "Action": "s3:GetObject", "Resource": f"{arn}/*", "Condition": { "IpAddress": { "aws:SourceIp": "" # Restrict access to a specific IP range for example (use appropriate IP range) } } }] }) ) # Output the names of the buckets created pulumi.export("log_bucket", log_bucket.bucket) pulumi.export("data_bucket", data_bucket.bucket)

    Let me walk you through what we've done with this Pulumi program:

    1. Log Bucket Creation: We create an S3 bucket dedicated to store the logs (logBucket). This allows us to collect and store access logs separately from the data bucket.

    2. Data Bucket with Logging: We then create the main data bucket where the ML project data will be stored (dataBucket). Server access logging is enabled for this bucket, which will store logs in logBucket.

    3. CloudTrail Trail: We create a CloudTrail trail (trail) to capture read-only data events. This logs any GetObject requests made on the data bucket, ensuring you can track every instance that data is read (egressed).

    4. Bucket Policy: We apply a policy (bucketPolicy) to the data bucket to restrict access to the data based on certain conditions, which adds another layer of security to ensure compliance.


    • The IP address specified in the bucket policy ( is an example range. You should replace this with the actual range you want to allow.
    • For full compliance, you need to also consider the retention and protection of the logs themselves, ensuring they are not modified and are retained for the period required by legislation or company policy.
    • The policy language for the bucket policy is sensitive and should be modified carefully to reflect the specific access requirements and security policies of your organization.

    This Pulumi program needs to be deployed in an AWS account where Pulumi has the appropriate permissions. You would typically run pulumi up to deploy the program to your AWS account. The exported outputs (log_bucket and data_bucket) provide the names of the buckets created for your reference.