<s>[INST] What is the best design of a system that uploads a file to S3, than resizes it with lambda but using the same key as uploaded, without triggering the resize lambda function twice or more? [/INST] To prevent triggering the resize Lambda function multiple times, you can use a unique identifier in the object key and check if it exists before triggering the resize function.

Here's one possible design of a system that uploads a file to S3 and resizes it with a Lambda function:

The user uploads a file to S3, which triggers a S3 "Put" event.
The S3 event invokes a Lambda function (let's call it the "controller" function) that is responsible for processing the uploaded file.
The controller function generates a unique identifier (e.g., a timestamp) and appends it to the original file key.
The controller function checks if an object with the new key exists in S3.
If the object does not exist, the controller function triggers the resize Lambda function (let's call it the "resizer" function) with the new key as input.
The resizer function resizes the file and stores it in S3 under the new key.
If the object already exists, the controller function terminates and does not trigger the resizer function.
This design ensures that the resizer function is triggered only once per unique file, and that the resized file is stored under a unique key.</s>\ <s>[INST] Show me how with AWS SAM CLI commands or as a bash script [/INST] Here's a bash script that implements the described system using the AWS CLI:

```
#!/bin/bash

# Define the S3 bucket and key of the uploaded file
bucket_name="your-s3-bucket"
object_key="path/to/your/uploaded/file.jpg"

# Check if the resized object already exists in the S3 bucket
resized_object_key="${object_key%.*}-resized.${object_key##*.}"
aws s3 ls "s3://$bucket_name/$resized_object_key" &> /dev/null
if [ $? -ne 0 ]; then
  # Resize the uploaded object and store the resized object in the S3 bucket
  # using the same key as the uploaded object but with a different file extension
  aws s3 cp "s3://$bucket_name/$object_key" - | \
    convert - -resize 800x800\> "s3://$bucket_name/$resized_object_key"
fi
```

This script assumes that you have the AWS CLI and the ImageMagick convert tool installed on your machine. You'll need to replace your-s3-bucket and path/to/your/uploaded/file.jpg with the actual names of your S3 bucket and uploaded file, respectively.

This script checks if the resized object already exists in the S3 bucket by using the aws s3 ls command and checking its exit code. If the resized object does not exist, the script uses the aws s3 cp command to copy the uploaded object from the S3 bucket to the standard output, pipes it through the ImageMagick convert tool to resize the image, and finally uses the aws s3 cp command to store the resized object in the S3 bucket using the same key as the uploaded object but with a different file extension.</s>