# How to invoke a Lambda function using an S3 event notification trigger?

In this article, we will learn to invoke a lambda function using an AWS Simple Storage Service(S3) event notification trigger.

To follow along this article, you need to have an  [AWS account](https://aws.amazon.com/) and some knowledge about the [Python](https://www.youtube.com/pylenin) programming language.

You should also have a basic understanding of AWS Lambda and how it works. Check out this [visual guide](https://www.100daysofdata.com/aws-lambda-for-beginners) on 100 days of data.

%[https://www.100daysofdata.com/aws-lambda-for-beginners]

You don't have to **reinvent the wheel**, unless it is for an educational purpose! AWS Lambda comes with `s3-get-object-python` blueprint lambda function that already has the sample code and function configuration presets for a certain runtime. 

**Note -** This blueprint's permission are set to allow you to get objects from the S3 bucket. It **doesn't let you write to the S3 bucket**.

## Step 1 - Create an S3 bucket

1. Open the Amazon S3 console and choose `Create bucket`.
2. Enter a unique and a **descriptive** name for your bucket. For example - `nse50`, a bucket to store the top 50 performing stocks from National Stock Exchange.
3. Next, you have to choose an AWS region. **Note** - Your Lambda function should be created in the same Region.
4. Choose `Create bucket`.

![create-bucket-s3.png](https://cdn.hashnode.com/res/hashnode/image/upload/v1637569580023/dnE4nU38q.png)

After creating the bucket, Amazon S3 opens the Buckets page, which displays a list of all buckets in your account in the current Region.

To upload a test object using the Amazon S3 console

1. On the Buckets page of the Amazon S3 console, choose the name of the bucket that you created.
2. On the Objects tab, choose `Upload`.
3. Drag a test file from your local machine to the Upload page.
4. Choose `Upload`.

## Step 2 - Create a Lambda function

To create a Lambda function from a blueprint in the console

1. Go to the Lambda Functions page and Choose `Create function`.
2. On the Create function page, choose `Use a blueprint`.
3. Choose `s3-get-object-python` for a Python function or `s3-get-object` for a Node.js function. Choose Configure.
4. Enter a function name of your choice. For example - `s3_audit_function`.
5. For Execution role, choose `Create a new role from AWS policy templates` and enter a role name of your choice. For example - `s3_audit_role`.
6. Under S3 trigger, choose the S3 bucket that you created previously.

   When you configure an S3 trigger using the Lambda console, the console modifies your function's resource-based policy to allow Amazon S3 to invoke the function.

7. Choose Create function.

![Step 2.png](https://cdn.hashnode.com/res/hashnode/image/upload/v1637554235904/SVBjmA6AX.png)
**Open the above image in new tab for better viewing experience.**

Pay attention to **Step 5** of the above image. This shows that this lambda function has only **read-only** permissions. So you can read from S3, but **you can not write to it**.

![step-5.png](https://cdn.hashnode.com/res/hashnode/image/upload/v1637565662106/154aM4uxU.png)

## Step 3 - Testing the function

As mentioned earlier, this blueprint comes with its own sample code. 

Before putting your code into production, you need to test your code. AWS Lambda lets you configure different types of test event from different services to help you in testing your code. 

1. On the Code tab, under Code source, choose the drop down arrow next to Test, and then choose `Configure test events` from the dropdown list.

2. In the Configure test event window, do the following:

   - Choose `Create new test event`.
   - From Event template, choose `Amazon S3 Put (s3-put)`. This is similar to the event triggered in S3 when you upload a file.
   - For Event name, enter a name for the test event.
   - In the test event JSON, replace the S3 bucket name and object key with your bucket name and test file name. Your test event should look similar to the following: 

   ```python3
   {
  "Records": [
    {
      "eventVersion": "2.0",
      "eventSource": "aws:s3",
      "awsRegion": "us-west-2",
      "eventTime": "1970-01-01T00:00:00.000Z",
      "eventName": "ObjectCreated:Put",
      "userIdentity": {
        "principalId": "EXAMPLE"
      },
      "requestParameters": {
        "sourceIPAddress": "127.0.0.1"
      },
      "responseElements": {
        "x-amz-request-id": "EXAMPLE123456789",
        "x-amz-id-2": "EXAMPLE123/5678abcdefghijklambdaisawesome/mnopqrstuvwxyzABCDEFGH"
      },
      "s3": {
        "s3SchemaVersion": "1.0",
        "configurationId": "testConfigRule",
        "bucket": {
          "name": "nse50", # Replace your bucket name
          "ownerIdentity": {
            "principalId": "EXAMPLE"
          },
          "arn": "arn:aws:s3:::example-bucket"
        },
        "object": {
          "key": "HappyFace.jpg",# Replace the name of file
          "size": 1024,
          "eTag": "0123456789abcdef0123456789abcdef",
          "sequencer": "0A1B2C3D4E5F678901"
        }
      }
    }
  ]
}
   ```

   - Choose `Create`.

3. To invoke the function with your test event, under Code source, choose `Test`. The Execution results tab displays the response, function logs, and request ID, similar to the following: 

```
Test Event Name
put-event

Response
"image/jpeg"

Function Logs
START RequestId: ca820e7b-0e24-465a-97be-edce7f43ace2 Version: $LATEST
CONTENT TYPE: image/jpeg
END RequestId: ca820e7b-0e24-465a-97be-edce7f43ace2
REPORT RequestId: ca820e7b-0e24-465a-97be-edce7f43ace2	Duration: 141.62 ms	Billed Duration: 142 ms	Memory Size: 128 MB	Max Memory Used: 74 MB

Request ID
ca820e7b-0e24-465a-97be-edce7f43ace2
```

# Final result

Now, your lambda function will be invoked every time you upload a new file to your bucket.

1. On the Buckets page of the Amazon S3 console, choose the name of the source bucket that you created earlier.

2. On the Upload page, upload any file of your choice to the bucket.

3. Open the Functions page on the Lambda console.

4. Choose the name of your function (my-s3-function).

5. To verify that the function ran once for each file that you uploaded, choose the Monitor tab. This page shows graphs for the metrics that Lambda sends to **AWS CloudWatch**. The count in the Invocations graph should match the number of files that you uploaded to the Amazon S3 bucket.


![Screenshot from 2021-11-22 14-00-56.png](https://cdn.hashnode.com/res/hashnode/image/upload/v1637569938927/La005nUw3.png)


