实验目的
熟悉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
- 在“Select a SAM Application Rumtime”选择nodejs版本,这里选择nodejs14.x;
- 在"Select a SAM Application Template"选择AWS SAM Hello World A basic;
- SAM app. 在"Select a workplace folder for your new project",选择LambdaC9Env;
- 在"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。
-
在"Which SAM Template would you like to deploy to
AWS",选择template.yaml -
在"Select an AWS S3 bucket to deploy code to",选在刚才新建的S3 bucket;
-
在"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表。