AWS:Lambda实操笔记

本文介绍了如何使用AWSCloud9环境创建和部署Lambda函数,通过SAM应用模板实现S3上传文件事件触发Lambda,进而将文件信息写入DynamoDB数据库。实验详细步骤包括创建Cloud9环境、LambdaSAM应用、模拟S3事件、配置S3事件源以及更新函数处理DynamoDB写入。
摘要由CSDN通过智能技术生成

实验目的

熟悉Lambda函数,通过实例实现S3上传文件同时将上传信息导入到DynamoDB服务

工具和原料

AWS账号
Could9 操作环境
AWS SAM模版
Lambda,DynamoDB,S3服务
教学资料 Solutions Architect Learning Plan - Earn a Learning Badge
AWS Lambda Foundations 8/12

实验步骤

创建Cloud9环境

登录AWS,选择Cloud9,创建新的工作环境,这里取名LambdaC9Env

创建Lambda SAM application

在AWS Cloud9环境中,在左侧的导航栏中选择AWS图标,选择Lambda服务,右键选中Create Lambda SAM application

在这里插入图片描述

  1. 在“Select a SAM Application Rumtime”选择nodejs版本,这里选择nodejs14.x;
  2. 在"Select a SAM Application Template"选择AWS SAM Hello World A basic;
  3. SAM app. 在"Select a workplace folder for your new project",选择LambdaC9Env;
  4. 在"Enter a name for your new application",选择LambdaSAMApp
    完成以上步骤点击回车,选择“Open launch.json”按钮,此JSON文件包含程序启动配置参数。运行该程序
    在这里插入图片描述
    在AWS tool-kit转态栏,确认程序运行状态,出现"hello-world"的信息代表运行成功

Lambda函数实现功能

选择bash terminal window,输入:

sam local generate-event s3 put

在Launch.json中Lambda部分,选中"payload"变量,输入"json",并把生成的payload复制过来:

 "payload": {
                    "json": {
                        "Records": [
                            {
                                "eventVersion": "2.0",
                                "eventSource": "aws:s3",
                                "awsRegion": "us-east-1",
                                "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": "example-bucket",
                                        "ownerIdentity": {
                                            "principalId": "EXAMPLE"
                                        },
                                        "arn": "arn:aws:s3:::example-bucket"
                                    },
                                    "object": {
                                        "key": "test/key",
                                        "size": 1024,
                                        "eTag": "0123456789abcdef0123456789abcdef",
                                        "sequencer": "0A1B2C3D4E5F678901"
                                    }
                                }
                            }
                        ]
                    }
                },

为了测试需要,在app.js中加入console.log(event),运行程序在AWS Toolkit窗口能看到Amazon S3输出实例。

记录S3事件

增加S3 bucket和触发函数事件源
打开template.yaml文件,它记载了作为SAM应用程序组成部分哪些资源被创建。
定位到"Resources", 新增“HelloWorldFunctionBucket”,与Resources对齐。然后再在"Event"中增加S3事件,其中的Ref为新建的HelloWorldFunctionBucket。

Resources:
  HelloWorldFunction:
    Type: AWS::Serverless::Function # More info about Function Resource: https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#awsserverlessfunction
    Properties:
      CodeUri: hello-world/
      Handler: app.lambdaHandler
      Runtime: nodejs14.x
      Architectures:
        - x86_64
      Events:
        HelloWorld:
          Type: Api # More info about API Event Source: https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#api
          Properties:
            Path: /hello
            Method: get
        S3Event:
          Type: S3
          Properties:
           Bucket:
             Ref: HelloWorldFunctionBucket
           Events: s3:ObjectCreated:*
  HelloWorldFunctionBucket:
    Type: AWS::S3::Bucket

然后部署SAM Applicaiton,选择AWS Explorer图标,右键选择S3,选择创建bucket,输入名称回车,然后右键点击Lambda,选择部署SAM Application。

  1. 在"Which SAM Template would you like to deploy to
    AWS",选择template.yaml

  2. 在"Select an AWS S3 bucket to deploy code to",选在刚才新建的S3 bucket;

  3. 在"Enter the name to use for the deployed
    stack",输入LambdaTestDeploy,点击回车。

在Toolkit window可以实时查看部署的进度,当出现成功字样时,打开标签也进入Lambda 控制台,在Function中可以看到刚刚创建的函数LambdaTestDeploy-HelloWorldFunction。
在这里插入图片描述

下面验证S3 bucket已经创建,在新的标签页进入S3,可以看到新部署号的bucket,打开bucket,尝试上传一个文件到这个bucket,这将触发HelloWorldFunction函数。
在这里插入图片描述
转到Lambda的控制台,点击监控标签,在“View logs in CloudWatch”能看到S3 事件被记录到日志力,这说明你的操作正确触发了Lambda函数。
在这里插入图片描述

将S3上传文件信息写入DynamoDB

修改template.yaml文件,定义DynamoDB表格作为SAM template模版,定位HelloWorldFunctionBucket,增加HelloWorldFunctionTable,并定义resource type为 AWS:Serverless::SimpleTable.增加Event的策略属性,复制DynamoDBCrudPolicy将Ref改为HelloWorldFunctionBucket。修改后代码如下

Resources:
  HelloWorldFunction:
    Type: AWS::Serverless::Function # More info about Function Resource: https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#awsserverlessfunction
    Properties:
      CodeUri: hello-world/
      Handler: app.lambdaHandler
      Runtime: nodejs14.x
      Architectures:
        - x86_64
      Events:
        HelloWorld:
          Type: Api # More info about API Event Source: https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#api
          Properties:
            Path: /hello
            Method: get
        S3Event:
          Type: S3
          Properties:
           Bucket:
             Ref: HelloWorldFunctionBucket
           Events: s3:ObjectCreated:*
      Policies:
        DynamoDBCrudPolicy:
           TableName: !Ref HelloWorldFunctionTable
  HelloWorldFunctionBucket:
    Type: AWS::S3::Bucket
  HelloWorldFunctionTable:
    Type: AWS::Serverless::SimpleTable  

按照之前的步骤部署SAM应用程序,然后到DynamoDB页面,选择表格,能看到刚刚部署成功的LambdaTestDeploy表格,如下

在这里插入图片描述
最后一步是修改函数以便从S3 event payload中抓取并写入DynamoDB表格。
在AWS Cloud9中,选择launch.json文件查看事件源eventSource和目标键的结构,这些变量用于存储S3对象值需要加入到app.js文件中。
需要导入aws-sdk

`var AWS = require('aws-sdk');`

增加S3ObjectKy和S3TimeStamp变量以便payload信息写入到Lambda函数。在putItem函数前加上await确保数据能够及时写入到表格

var S3ObjectKey = event.Records[0].s3.object.key;
var S3TimeStamp = event.Records[0].eventTime;

var ddb = new AWS.DynamoDB({ apiVersion: '2012-08-10' });

var params = {
    TableName: 'LambdaTestDeploy-HelloWorldFunctionTable-xxxx',
    Item: {
        'id': { S: S3ObjectKey },
        'timestamp': { S: S3TimeStamp }
    }
};

await ddb.putItem(params, function(err, data) {
    if (err) {
        console.log("Error", err);
    }
    else {
        console.log("Success", data);
    }
}).promise();

然后部署SAM程序。接下来打开S3控制台在S3 bucket中上传另一个图片测试Lambda函数被触发。上传查看CloudWatch和DynamoDB,确认相关信息已经被记录。
在这里插入图片描述

总结

使用AWA SAM和AWS Cloud9成功创建、编辑和部署了Lambda函数。通过让AmazonS3事件触发Lambda函数来实现这一点,该函数将事件信息写入DynamoDB表。使用AWS SAM模板创建了S3存储桶和演示中使用的DynamoDB表。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值