[{"data":1,"prerenderedAt":93},["ShallowReactive",2],{"snippet-integration-s3-to-lambda":3},{"id":4,"title":5,"contributors":6,"description":11,"extension":12,"gitHub":13,"introBox":16,"languages":20,"meta":28,"resources":29,"services":33,"snippets":36,"stem":89,"tags":90,"type":91,"__hash__":92},"snippets\u002Fsnippets\u002Fintegration-s3-to-lambda.json","Amazon S3 trigger to invoke a Lambda function",[7,8,9,10],"content\u002Fcontributors\u002Fdavid-boyne.json","content\u002Fcontributors\u002Fjames-eastham.json","content\u002Fcontributors\u002Frahul-popat.json","content\u002Fcontributors\u002Fbrian-krygsman.json","Using an Amazon S3 trigger to invoke a Lambda function","json",{"template":14},{"repoURL":15},"https:\u002F\u002Fgithub.com\u002Faws-samples\u002Fserverless-snippets\u002Ftree\u002Fmain\u002Fintegration-s3-to-lambda",{"headline":17,"text":18},"How it works",[19],"The Lambda function retrieves the source S3 bucket name and the key name of the uploaded object from the event parameter that it receives. The function uses the Amazon S3 getObject API to retrieve the content type of the object.",[21,22,23,24,25,26,27],"JavaScript","TypeScript","Python","Rust",".NET","Java","Go",{},{"bullets":30},[31],{"text":11,"link":32},"https:\u002F\u002Fdocs.aws.amazon.com\u002Flambda\u002Flatest\u002Fdg\u002Fwith-s3-example.html",[34,35],"lambda","s3",[37],{"title":38,"codeTabs":39},"Runtimes",[40,47,54,61,68,75,82],{"id":21,"title":41,"description":42,"snippets":43},"Usage Example with Node:","Consuming an S3 event with Lambda using JavaScript.",[44],{"language":45,"code":46},"js","const aws = require('aws-sdk');\n\nconst s3 = new aws.S3({ apiVersion: '2006-03-01' });\n\nexports.handler = async (event, context) =&#62; {\n    \u002F\u002F Get the object from the event and show its content type\n    const bucket = event.Records[0].s3.bucket.name;\n    const key = decodeURIComponent(event.Records[0].s3.object.key.replace(\u002F\\+\u002Fg, ' '));\n    const params = {\n        Bucket: bucket,\n        Key: key,\n    }; \n    try {\n        const { ContentType } = await s3.headObject(params).promise();\n        console.log('CONTENT TYPE:', ContentType);\n        return ContentType;\n    } catch (err) {\n        console.log(err);\n        const message = `Error getting object ${key} from bucket ${bucket}. Make sure they exist and your bucket is in the same region as this function.`;\n        console.log(message);\n        throw new Error(message);\n    }\n};\n",{"id":22,"title":48,"description":49,"snippets":50},"Usage Example with TypeScript:","Consuming an S3 event with Lambda using TypeScript.",[51],{"language":52,"code":53},"ts","import { S3Event } from 'aws-lambda';\nimport { S3Client, HeadObjectCommand } from '@aws-sdk\u002Fclient-s3';\n\nconst s3 = new S3Client({ region: process.env.AWS_REGION });\n\nexport const handler = async (event: S3Event): Promise&#60;string | undefined&#62; =&#62; {\n  \u002F\u002F Get the object from the event and show its content type\n  const bucket = event.Records[0].s3.bucket.name;\n  const key = decodeURIComponent(event.Records[0].s3.object.key.replace(\u002F\\+\u002Fg, ' '));\n  const params = {\n    Bucket: bucket,\n    Key: key,\n  };\n  try {\n    const { ContentType } = await s3.send(new HeadObjectCommand(params));\n    console.log('CONTENT TYPE:', ContentType);\n    return ContentType;\n  } catch (err) {\n    console.log(err);\n    const message = `Error getting object ${key} from bucket ${bucket}. Make sure they exist and your bucket is in the same region as this function.`;\n    console.log(message);\n    throw new Error(message);\n  }\n};",{"id":23,"title":55,"description":56,"snippets":57},"Usage Example with Python:","Consuming an S3 event with Lambda using Python.",[58],{"language":59,"code":60},"py","import json\nimport urllib.parse\nimport boto3\n\nprint('Loading function')\n\ns3 = boto3.client('s3')\n\n\ndef lambda_handler(event, context):\n    #print(\"Received event: \" + json.dumps(event, indent=2))\n\n    # Get the object from the event and show its content type\n    bucket = event['Records'][0]['s3']['bucket']['name']\n    key = urllib.parse.unquote_plus(event['Records'][0]['s3']['object']['key'], encoding='utf-8')\n    try:\n        response = s3.get_object(Bucket=bucket, Key=key)\n        print(\"CONTENT TYPE: \" + response['ContentType'])\n        return response['ContentType']\n    except Exception as e:\n        print(e)\n        print('Error getting object {} from bucket {}. Make sure they exist and your bucket is in the same region as this function.'.format(key, bucket))\n        raise e\n              ",{"id":25,"title":62,"description":63,"snippets":64},"Usage Example with .NET:","Consuming an S3 event with Lambda using .NET.",[65],{"language":66,"code":67},"dotnet","﻿using System.Threading.Tasks;\nusing Amazon.Lambda.Core;\nusing Amazon.S3;\nusing System;\nusing Amazon.Lambda.S3Events;\nusing System.Web;\n\n\u002F\u002F Assembly attribute to enable the Lambda function's JSON input to be converted into a .NET class.\n[assembly: LambdaSerializer(typeof(Amazon.Lambda.Serialization.SystemTextJson.DefaultLambdaJsonSerializer))]\n\nnamespace S3Integration\n{\n    public class Function\n    {\n        private static AmazonS3Client _s3Client;\n        public Function() : this(null)\n        {\n        }\n\n        internal Function(AmazonS3Client s3Client)\n        {\n            _s3Client = s3Client ?? new AmazonS3Client();\n        }\n\n        public async Task&#60;string&#62; Handler(S3Event evt, ILambdaContext context)\n        {\n            try\n            {\n                if (evt.Records.Count &#60;= 0)\n                {\n                    context.Logger.LogLine(\"Empty S3 Event received\");\n                    return string.Empty;\n                }\n\n                var bucket = evt.Records[0].S3.Bucket.Name;\n                var key = HttpUtility.UrlDecode(evt.Records[0].S3.Object.Key);\n\n                context.Logger.LogLine($\"Request is for {bucket} and {key}\");\n\n                var objectResult = await _s3Client.GetObjectAsync(bucket, key);\n\n                context.Logger.LogLine($\"Returning {objectResult.Key}\");\n\n                return objectResult.Key;\n            }\n            catch (Exception e)\n            {\n                context.Logger.LogLine($\"Error processing request - {e.Message}\");\n\n                return string.Empty;\n            }\n        }\n    }\n}",{"id":24,"title":69,"description":70,"snippets":71},"Usage Example with Rust:","Consuming an S3 event with Lambda using Rust.",[72],{"language":73,"code":74},"rust","use aws_lambda_events::event::s3::S3Event;\nuse aws_sdk_s3::{Client};\nuse lambda_runtime::{run, service_fn, Error, LambdaEvent};\n\n\n\u002F\u002F\u002F Main function\n#[tokio::main]\nasync fn main() -&#62; Result&#60;(), Error&#62; {\n    tracing_subscriber::fmt()\n        .with_max_level(tracing::Level::INFO)\n        .with_target(false)\n        .without_time()\n        .init();\n\n    \u002F\u002F Initialize the AWS SDK for Rust\n    let config = aws_config::load_from_env().await;\n    let s3_client = Client::new(&config);\n\n    let res = run(service_fn(|request: LambdaEvent&#60;S3Event&#62;| {\n        function_handler(&s3_client, request)\n    })).await;\n\n    res\n}\n\nasync fn function_handler(\n    s3_client: &Client,\n    evt: LambdaEvent&#60;S3Event&#62;\n) -&#62; Result&#60;(), Error&#62; {\n    tracing::info!(records = ?evt.payload.records.len(), \"Received request from SQS\");\n\n    if evt.payload.records.len() == 0 {\n        tracing::info!(\"Empty S3 event received\");\n    }\n\n    let bucket = evt.payload.records[0].s3.bucket.name.as_ref().expect(\"Bucket name to exist\");\n    let key = evt.payload.records[0].s3.object.key.as_ref().expect(\"Object key to exist\");\n\n    tracing::info!(\"Request is for {} and object {}\", bucket, key);\n\n    let s3_get_object_result = s3_client\n        .get_object()\n        .bucket(bucket)\n        .key(key)\n        .send()\n        .await;\n\n    match s3_get_object_result {\n        Ok(_) =&#62; tracing::info!(\"S3 Get Object success, the s3GetObjectResult contains a 'body' property of type ByteStream\"),\n        Err(_) =&#62; tracing::info!(\"Failure with S3 Get Object request\")\n    }\n\n    Ok(())\n}",{"id":26,"title":76,"description":77,"snippets":78},"Usage Example with Java:","Consuming an S3 event with Lambda using Java.",[79],{"language":80,"code":81},"java","package example;\n\nimport software.amazon.awssdk.services.s3.model.HeadObjectRequest;\nimport software.amazon.awssdk.services.s3.model.HeadObjectResponse;\nimport software.amazon.awssdk.services.s3.S3Client;\n\nimport com.amazonaws.services.lambda.runtime.Context;\nimport com.amazonaws.services.lambda.runtime.RequestHandler;\nimport com.amazonaws.services.lambda.runtime.events.S3Event;\nimport com.amazonaws.services.lambda.runtime.events.models.s3.S3EventNotification.S3EventNotificationRecord;\n\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n\npublic class Handler implements RequestHandler&#60;S3Event, String&#62; {\n    private static final Logger logger = LoggerFactory.getLogger(Handler.class);\n    @Override\n    public String handleRequest(S3Event s3event, Context context) {\n        try {\n          S3EventNotificationRecord record = s3event.getRecords().get(0);\n          String srcBucket = record.getS3().getBucket().getName();\n          String srcKey = record.getS3().getObject().getUrlDecodedKey();\n\n          S3Client s3Client = S3Client.builder().build();\n          HeadObjectResponse headObject = getHeadObject(s3Client, srcBucket, srcKey);\n\n          logger.info(\"Successfully retrieved \" + srcBucket + \"\u002F\" + srcKey + \" of type \" + headObject.contentType());\n\n          return \"Ok\";\n        } catch (Exception e) {\n          throw new RuntimeException(e);\n        }\n    }\n\n    private HeadObjectResponse getHeadObject(S3Client s3Client, String bucket, String key) {\n        HeadObjectRequest headObjectRequest = HeadObjectRequest.builder()\n                .bucket(bucket)\n                .key(key)\n                .build();\n        return s3Client.headObject(headObjectRequest);\n    }\n}",{"id":27,"title":83,"description":84,"snippets":85},"Usage Example with Go:","Consuming an S3 event with Lambda using Go.",[86],{"language":87,"code":88},"go","package main\n\nimport (\n\t\"context\"\n\t\"log\"\n\n\t\"github.com\u002Faws\u002Faws-lambda-go\u002Fevents\"\n\t\"github.com\u002Faws\u002Faws-lambda-go\u002Flambda\"\n\t\"github.com\u002Faws\u002Faws-sdk-go-v2\u002Fconfig\"\n\t\"github.com\u002Faws\u002Faws-sdk-go-v2\u002Fservice\u002Fs3\"\n)\n\nfunc handler(ctx context.Context, s3Event events.S3Event) error {\n\tsdkConfig, err := config.LoadDefaultConfig(ctx)\n\tif err != nil {\n\t\tlog.Printf(\"failed to load default config: %s\", err)\n\t\treturn err\n\t}\n\ts3Client := s3.NewFromConfig(sdkConfig)\n\n\tfor _, record := range s3Event.Records {\n\t\tbucket := record.S3.Bucket.Name\n\t\tkey := record.S3.Object.URLDecodedKey\n\t\theadOutput, err := s3Client.HeadObject(ctx, &s3.HeadObjectInput{\n\t\t\tBucket: &bucket,\n\t\t\tKey:    &key,\n\t\t})\n\t\tif err != nil {\n\t\t\tlog.Printf(\"error getting head of object %s\u002F%s: %s\", bucket, key, err)\n\t\t\treturn err\n\t\t}\n\t\tlog.Printf(\"successfully retrieved %s\u002F%s of type %s\", bucket, key, *headOutput.ContentType)\n\t}\n\n\treturn nil\n}\n\nfunc main() {\n\tlambda.Start(handler)\n}\n","snippets\u002Fintegration-s3-to-lambda",[],"Integration","-lxbdjzUoZ9eHU3Tx-RafM8HEMtoWsXQmQL_tRIn3dU",1789122884483]