AWS Lambda Function #
Prerequisites #
# I use the following S3 Buckets for this tutorial
S3 Bucket1: jkw-bucket-1
S3 Bucket1: jkw-bucket-2
Move Files to another S3 Bucket #
The following Lambda function moves files from the “Input” folder of jkw-bucket-1 to the “Output” folder of jkw-bucket-2 and then deletes the file from the “Input folder”.
- Create the following IAM Policy
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "VisualEditor0",
"Effect": "Allow",
"Action": [
"s3:GetObject",
"s3:DeleteObject"
],
"Resource": "arn:aws:s3:::jkw-bucket-1/Input/*"
},
{
"Sid": "VisualEditor1",
"Effect": "Allow",
"Action": "s3:ListBucket",
"Resource": [
"arn:aws:s3:::jkw-bucket-1",
"arn:aws:s3:::jkw-bucket-1/Input/*"
]
},
{
"Sid": "VisualEditor2",
"Effect": "Allow",
"Action": "s3:PutObject",
"Resource": "arn:aws:s3:::jkw-bucket-2/*"
}
]
}
- Create a new Role for Lambda
- Add the new Policy to the Role
- Create a new Lambda function
Link: https://eu-central-1.console.aws.amazon.com/lambda/
- Add Python script
import boto3
import json
s3 = boto3.resource('s3')
def lambda_handler(event, context):
bucket = s3.Bucket('jkw-bucket-1')
dest_bucket = s3.Bucket('jkw-bucket-2')
print(dest_bucket)
print(bucket)
for obj in bucket.objects.filter(Prefix='Input/', Delimiter='/'):
dest_key = 'Output/' + obj.key.split('/', 1)[-1]
print(dest_key)
print('copy file ' + dest_key)
s3.Object(dest_bucket.name, dest_key).copy_from(CopySource={'Bucket': obj.bucket_name, 'Key': obj.key})
if obj.key != 'Input/':
print('delete file from source bucket ' + dest_key)
s3.Object(bucket.name, obj.key).delete()
- Create a trigger for the Lambda function
Move files to folder #
This Lambda function movies files from the “Input” to the “Output” folder in jkw-bucket-1.
- IAM Policy
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "VisualEditor0",
"Effect": "Allow",
"Action": [
"s3:GetObject",
"s3:DeleteObject"
],
"Resource": "arn:aws:s3:::jkw-bucket-1/Input/*"
},
{
"Sid": "VisualEditor1",
"Effect": "Allow",
"Action": "s3:ListBucket",
"Resource": [
"arn:aws:s3:::jkw-bucket-1",
"arn:aws:s3:::jkw-bucket-1/Input/*"
]
},
{
"Sid": "VisualEditor2",
"Effect": "Allow",
"Action": "s3:PutObject",
"Resource": "arn:aws:s3:::jkw-bucket-1/*"
}
]
}
- Python script
import boto3
import json
s3 = boto3.resource('s3')
def lambda_handler(event, context):
bucket = s3.Bucket('jkw-bucket-1')
print(bucket)
for obj in bucket.objects.filter(Prefix='Input/', Delimiter='/'):
dest_key = 'Output/' + obj.key.split('/', 1)[-1]
print(dest_key)
print('copy file to ' + dest_key)
s3.Object(bucket.name, dest_key).copy_from(CopySource={'Bucket': obj.bucket_name, 'Key': obj.key})
if obj.key != 'Input/':
print('delete file from source bucket ' + dest_key)
s3.Object(bucket.name, obj.key).delete()
Move specific files #
This Lambda function moves files that contain “01a” in their file name from the “Input” to the “Output” folder in jkw-bucket-1.
- Python script
import boto3
import json
s3 = boto3.resource('s3')
def lambda_handler(event, context):
bucket = s3.Bucket('jkw-bucket-1')
print(bucket)
for obj in bucket.objects.filter(Prefix='Input/', Delimiter='/'):
if "01a" in obj.key:
dest_key = 'Output/' + obj.key.split('/', 1)[-1]
print(dest_key)
print('copy file to ' + dest_key)
s3.Object(bucket.name, dest_key).copy_from(CopySource={'Bucket': obj.bucket_name, 'Key': obj.key})
if obj.key != 'Input/':
print('delete file from source bucket ' + dest_key)
s3.Object(bucket.name, obj.key).delete()
Move specific files (Loop Version) #
This Lambda function moves files that contain “01a” to folder “Output-01a” and files that contain “02b” to folder “Output-02b”
- Python script
import boto3
import json
s3 = boto3.resource('s3')
def lambda_handler(event, context):
bucket = s3.Bucket('jkw-bucket-1')
# Folder Mapping
folder_map = {
"01a": "Output-01a/",
"02b": "Output-02b/"
}
for obj in bucket.objects.filter(Prefix='Input/', Delimiter='/'):
for identifier, folder_name in folder_map.items():
if identifier in obj.key:
dest_key = folder_name + obj.key.split('/', 1)[-1]
print(dest_key)
print(f'copy file to {dest_key}')
s3.Object(bucket.name, dest_key).copy_from(CopySource={'Bucket': obj.bucket_name, 'Key': obj.key})
if obj.key != 'Input/':
print(f'delete file from source bucket {dest_key}')
s3.Object(bucket.name, obj.key).delete()
break