From fdefcc4eb046a34fcd38d7aa41dabdfbc49ced33 Mon Sep 17 00:00:00 2001 From: Abilashkumar Date: Wed, 25 Dec 2024 15:47:31 +0530 Subject: [PATCH 1/5] new pattern:rekognition-s3-detectfaces-python --- rekognition-s3-detectfaces-python/README.md | 66 ++++++++++++++ .../example-pattern.json | 59 +++++++++++++ .../src/lambda_function.py | 41 +++++++++ .../template.yaml | 85 +++++++++++++++++++ 4 files changed, 251 insertions(+) create mode 100644 rekognition-s3-detectfaces-python/README.md create mode 100644 rekognition-s3-detectfaces-python/example-pattern.json create mode 100644 rekognition-s3-detectfaces-python/src/lambda_function.py create mode 100644 rekognition-s3-detectfaces-python/template.yaml diff --git a/rekognition-s3-detectfaces-python/README.md b/rekognition-s3-detectfaces-python/README.md new file mode 100644 index 000000000..eacd03267 --- /dev/null +++ b/rekognition-s3-detectfaces-python/README.md @@ -0,0 +1,66 @@ +# Amazon S3 to Amazon Rekognition through AWS EventBridge + +This pattern demonstrates how to create an S3 bucket which when uploaded with an object invokes a Lambda function through EventBridge. The function detect faces in an image through Amazon Rekognition. The lambda function is built using Python. + +Learn more about this pattern at Serverless Land Patterns: https://serverlessland.com/patterns/s3-eventbridge-rekognition-detectfaces-python + +Important: this application uses various AWS services and there are costs associated with these services after the Free Tier usage - please see the [AWS Pricing page](https://aws.amazon.com/pricing/) for details. You are responsible for any AWS costs incurred. No warranty is implied in this example. + +## Requirements + +* [Create an AWS account](https://portal.aws.amazon.com/gp/aws/developer/registration/index.html) if you do not already have one and log in. The IAM user that you use must have sufficient permissions to make necessary AWS service calls and manage AWS resources. +* [AWS CLI](https://docs.aws.amazon.com/cli/latest/userguide/install-cliv2.html) installed and configured +* [Git Installed](https://git-scm.com/book/en/v2/Getting-Started-Installing-Git) +* [AWS Serverless Application Model](https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/serverless-sam-cli-install.html) (AWS SAM) installed + +## Deployment Instructions + +1. Create a new directory, navigate to that directory in a terminal and clone the GitHub repository: + ``` + git clone https://github.com/aws-samples/serverless-patterns + ``` +1. Change directory to the pattern directory: + ``` + cd s3-eventbridge-rekognition-detectfaces-python + ``` +1. From the command line, use AWS SAM to deploy the AWS resources for the pattern as specified in the template.yml file: + ``` + sam deploy --guided + ``` +1. During the prompts: + * Enter a stack name + * Enter the desired AWS Region + * Allow SAM CLI to create IAM roles with the required permissions. + + Once you have run `sam deploy --guided` mode once and saved arguments to a configuration file (samconfig.toml), you can use `sam deploy` in future to use these defaults. + +1. Note the outputs from the SAM deployment process. These contain the resource names and/or ARNs which are used for testing. + +## How it works + +The Cloudformation template creates 2 S3 buckets (source and destination buckets) along with a Lambda function (Python) and an EventBridge event. The Lambda function is triggered by the EventBridge which listens to an object upload in the S3 bucket. The lambda function makes a DetectFaces API call to detect the faces in the image and stores the output in the destination S3 bucket. + +## Testing + +Upload the file (document/image) to the input S3 -input-bucket- bucket via the console or use the PutObject API call below: + +``` +aws s3api put-object --bucket > --key --body /path/to/your/ +``` + +Replace the parameters in the above command appropriately. + +## Cleanup + +1. Delete the stack + ```bash + aws cloudformation delete-stack --stack-name STACK_NAME + ``` +1. Confirm the stack has been deleted + ```bash + aws cloudformation list-stacks --query "StackSummaries[?contains(StackName,'STACK_NAME')].StackStatus" + ``` +---- +Copyright 2024 Amazon.com, Inc. or its affiliates. All Rights Reserved. + +SPDX-License-Identifier: MIT-0 diff --git a/rekognition-s3-detectfaces-python/example-pattern.json b/rekognition-s3-detectfaces-python/example-pattern.json new file mode 100644 index 000000000..3055bd982 --- /dev/null +++ b/rekognition-s3-detectfaces-python/example-pattern.json @@ -0,0 +1,59 @@ +{ + "title": "S3 to Rekognition using EventBridge", + "description": "SAM template for S3 trigger to Lambda for detecting faces in an image using Rekognition and EventBridge", + "language": "python", + "level": "200", + "framework": "SAM", + "introBox": { + "headline": "How it works", + "text": [ + "This pattern demonstrates how to creates two S3 buckets (source and destination) which when uploaded with an object invokes a Lambda function through EventBridge and detects faces in an image using Amazon Rekognition.", + "Once a file is uploaded to an S3 bucket, it is listened by the EventBridge which further invokes the lambda function", + "The lambda function writes the output of the detected faces using Rekognition to the destination S3 bucket." + ] + }, + "gitHub": { + "template": { + "repoURL": "https://github.com/aws-samples/serverless-patterns/tree/main/s3-eventbridge-rekognition-detectfaces-python", + "templateURL": "serverless-patterns/s3-eventbridge-rekognition-detectfaces-python", + "projectFolder": "s3-eventbridge-rekognition-detectfaces-python", + "templateFile": "template.yaml" + } + }, + "resources": { + "bullets": [ + { + "text": "Detecting faces using Rekognition", + "link": "https://docs.aws.amazon.com/rekognition/latest/dg/faces.html" + }, + { + "text": "Amazon Rekognition", + "link": "https://aws.amazon.com/rekognition/" + } + ] + }, + "deploy": { + "text": [ + "sam deploy" + ] + }, + "testing": { + "text": [ + "See the GitHub repo for detailed testing instructions." + ] + }, + "cleanup": { + "text": [ + "Delete the stack: cdk delete." + ] + }, + "authors": [ + { + "name": "Abilashkumar P C", + "image": "https://drive.google.com/file/d/1bxOh_WBw8J_xEqvT-qRezH8WXqSBPI24/view?usp=sharing", + "bio": "Sr. Cloud Support Engineer @ AWS", + "linkedin": "abilashkumar-p-c" + } + ] + } + \ No newline at end of file diff --git a/rekognition-s3-detectfaces-python/src/lambda_function.py b/rekognition-s3-detectfaces-python/src/lambda_function.py new file mode 100644 index 000000000..ca42c672e --- /dev/null +++ b/rekognition-s3-detectfaces-python/src/lambda_function.py @@ -0,0 +1,41 @@ +import boto3 +import json +import os +s3 = boto3.client('s3') +rekognition = boto3.client('rekognition') + +def handler(event, context): + # Extract bucket and key from the EventBridge event + detail = event['detail'] + bucket = detail['bucket']['name'] + key = detail['object']['key'] + + # Call Rekognition to detect faces + response = rekognition.detect_faces( + Image={ + 'S3Object': { + 'Bucket': bucket, + 'Name': key + } + } + ) + + # Write the Rekognition output to the output bucket + output_key = f"rekognition-output-{key}" + output_key = output_key[:output_key.rfind('.')] + output_key = output_key + ".json" + print(output_key) + + faceDetection=response['FaceDetails'] + print(response) + + s3.put_object( + Bucket=os.environ['OUTPUT_BUCKET'], + Key=output_key, + Body=json.dumps(faceDetection) + ) + + return { + 'statusCode': 200, + 'body': json.dumps('Document processed successfully') + } \ No newline at end of file diff --git a/rekognition-s3-detectfaces-python/template.yaml b/rekognition-s3-detectfaces-python/template.yaml new file mode 100644 index 000000000..d0f6d71c6 --- /dev/null +++ b/rekognition-s3-detectfaces-python/template.yaml @@ -0,0 +1,85 @@ +AWSTemplateFormatVersion: '2010-09-09' +Transform: AWS::Serverless-2016-10-31 +Description: 'SAM template for S3 trigger to Lambda for detecting faces in an image using Rekognition and EventBridge' + +Resources: + # Input S3 bucket + InputBucket: + Type: AWS::S3::Bucket + Properties: + BucketName: !Sub '${AWS::StackName}-input-bucket-${AWS::AccountId}' + NotificationConfiguration: + EventBridgeConfiguration: + EventBridgeEnabled: true + + # Output S3 bucket + OutputBucket: + Type: AWS::S3::Bucket + Properties: + BucketName: !Sub '${AWS::StackName}-output-bucket-${AWS::AccountId}' + + # Lambda function + RekognitionFunction: + Type: AWS::Serverless::Function + Properties: + FunctionName: !Sub '${AWS::StackName}-rekognition-function' + Handler: lambda_function.handler + Runtime: python3.8 + Timeout: 30 + Environment: + Variables: + OUTPUT_BUCKET: !Ref OutputBucket + Policies: + - S3ReadPolicy: + BucketName: !Ref InputBucket + - S3WritePolicy: + BucketName: !Ref OutputBucket + - Statement: + - Effect: Allow + Action: + - rekognition:DetectFaces + Resource: '*' + CodeUri: src/ + + + # EventBridge Rule + S3ObjectCreatedRule: + Type: AWS::Events::Rule + Properties: + Description: "Rule to capture S3 object created events" + EventPattern: + source: + - aws.s3 + detail-type: + - Object Created + detail: + bucket: + name: + - !Ref InputBucket + State: "ENABLED" + Targets: + - Arn: !GetAtt RekognitionFunction.Arn + Id: "RekognitionFunctionTarget" + + # Permission for EventBridge to invoke Lambda + RekognitionFunctionPermission: + Type: AWS::Lambda::Permission + Properties: + FunctionName: !Ref RekognitionFunction + Action: "lambda:InvokeFunction" + Principal: "events.amazonaws.com" + SourceArn: !GetAtt S3ObjectCreatedRule.Arn + +Outputs: + InputBucketName: + Description: 'Name of the input S3 bucket' + Value: !Ref InputBucket + OutputBucketName: + Description: 'Name of the output S3 bucket' + Value: !Ref OutputBucket + RekognitionFunctionName: + Description: 'Name of the Rekognition Lambda function' + Value: !Ref RekognitionFunction + RekognitionFunctionArn: + Description: 'ARN of the Rekognition Lambda function' + Value: !GetAtt RekognitionFunction.Arn From a70c3aae8704cc3e3646700a089edaa3fc050465 Mon Sep 17 00:00:00 2001 From: Abilashkumar <111060919+abilashkumar@users.noreply.github.com> Date: Wed, 25 Dec 2024 16:13:41 +0530 Subject: [PATCH 2/5] Update example-pattern.json --- rekognition-s3-detectfaces-python/example-pattern.json | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/rekognition-s3-detectfaces-python/example-pattern.json b/rekognition-s3-detectfaces-python/example-pattern.json index 3055bd982..eec784a35 100644 --- a/rekognition-s3-detectfaces-python/example-pattern.json +++ b/rekognition-s3-detectfaces-python/example-pattern.json @@ -14,9 +14,9 @@ }, "gitHub": { "template": { - "repoURL": "https://github.com/aws-samples/serverless-patterns/tree/main/s3-eventbridge-rekognition-detectfaces-python", - "templateURL": "serverless-patterns/s3-eventbridge-rekognition-detectfaces-python", - "projectFolder": "s3-eventbridge-rekognition-detectfaces-python", + "repoURL": "https://github.com/aws-samples/serverless-patterns/tree/main/rekognition-s3-detectfaces-python", + "templateURL": "serverless-patterns/rekognition-s3-detectfaces-python, + "projectFolder": "rekognition-s3-detectfaces-python", "templateFile": "template.yaml" } }, @@ -56,4 +56,4 @@ } ] } - \ No newline at end of file + From 2dbd267c2b2e280c624b3203b0ced06cf60db5ad Mon Sep 17 00:00:00 2001 From: Abilashkumar <111060919+abilashkumar@users.noreply.github.com> Date: Wed, 25 Dec 2024 16:14:01 +0530 Subject: [PATCH 3/5] Update README.md --- rekognition-s3-detectfaces-python/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rekognition-s3-detectfaces-python/README.md b/rekognition-s3-detectfaces-python/README.md index eacd03267..9cbf23f97 100644 --- a/rekognition-s3-detectfaces-python/README.md +++ b/rekognition-s3-detectfaces-python/README.md @@ -2,7 +2,7 @@ This pattern demonstrates how to create an S3 bucket which when uploaded with an object invokes a Lambda function through EventBridge. The function detect faces in an image through Amazon Rekognition. The lambda function is built using Python. -Learn more about this pattern at Serverless Land Patterns: https://serverlessland.com/patterns/s3-eventbridge-rekognition-detectfaces-python +Learn more about this pattern at Serverless Land Patterns: https://serverlessland.com/patterns/rekognition-s3-detectfaces-python Important: this application uses various AWS services and there are costs associated with these services after the Free Tier usage - please see the [AWS Pricing page](https://aws.amazon.com/pricing/) for details. You are responsible for any AWS costs incurred. No warranty is implied in this example. From 09627e4784922571062dfea3712fb6dd29913f6c Mon Sep 17 00:00:00 2001 From: Abilashkumar <111060919+abilashkumar@users.noreply.github.com> Date: Wed, 25 Dec 2024 16:14:27 +0530 Subject: [PATCH 4/5] Update example-pattern.json --- rekognition-s3-detectfaces-python/example-pattern.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rekognition-s3-detectfaces-python/example-pattern.json b/rekognition-s3-detectfaces-python/example-pattern.json index eec784a35..eb6ba2e67 100644 --- a/rekognition-s3-detectfaces-python/example-pattern.json +++ b/rekognition-s3-detectfaces-python/example-pattern.json @@ -15,7 +15,7 @@ "gitHub": { "template": { "repoURL": "https://github.com/aws-samples/serverless-patterns/tree/main/rekognition-s3-detectfaces-python", - "templateURL": "serverless-patterns/rekognition-s3-detectfaces-python, + "templateURL": "serverless-patterns/rekognition-s3-detectfaces-python", "projectFolder": "rekognition-s3-detectfaces-python", "templateFile": "template.yaml" } From e1cbca32283d3482f8591042ad354f6b3375aed4 Mon Sep 17 00:00:00 2001 From: Abilashkumar <111060919+abilashkumar@users.noreply.github.com> Date: Wed, 25 Dec 2024 16:16:52 +0530 Subject: [PATCH 5/5] Update README.md --- rekognition-s3-detectfaces-python/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rekognition-s3-detectfaces-python/README.md b/rekognition-s3-detectfaces-python/README.md index 9cbf23f97..cc5e09451 100644 --- a/rekognition-s3-detectfaces-python/README.md +++ b/rekognition-s3-detectfaces-python/README.md @@ -21,7 +21,7 @@ Important: this application uses various AWS services and there are costs associ ``` 1. Change directory to the pattern directory: ``` - cd s3-eventbridge-rekognition-detectfaces-python + cd rekognition-s3-detectfaces-python ``` 1. From the command line, use AWS SAM to deploy the AWS resources for the pattern as specified in the template.yml file: ```