
话说我们在上一篇已经搞定了如何获取S3 bucket中的文件名了,那么接下来的问题就是:当有新文件上传到指定的S3 bucket中时,通过lambda function如何重命名呢?
我查了一下,boto3里没有rename这个功能,所以我们就先copy这个文件,并以新名字命名,然后把原来的文件删除,同样可以实现文件重命名。具体代码如下:
import jsonimport boto3s3 = boto3.resource('s3')def lambda_handler(event, context):print(event)# print(event.get('Records'))records_content = event.get('Records')records_content_dict = records_content[0]s3_obj_dict = records_content_dict.get('s3')s3_obj_buckt_info = s3_obj_dict.get('bucket')s3_obj_buckt_name = s3_obj_buckt_info.get('name')s3_obj_object_info = s3_obj_dict.get('object')s3_obj_object_name = s3_obj_object_info.get('key')#Rename new upload fileprint("Try to rename the upload file: {}".format(s3_obj_object_name))s3.Object(s3_obj_buckt_name, 'renamed_images1.png').copy_from(CopySource={'Bucket': s3_obj_buckt_name, 'Key': s3_obj_object_name})#Delete original files3.Object(s3_obj_buckt_name, s3_obj_object_name).delete()return {'statusCode': 200,'body': json.dumps('Hello from Lambda!')}
保存代码之后,我们上传一个文件到我们的bucket里,测试一下。这里我上传了一个文件:images1.png,我代码里写的新文件的名字是:renamed_images1.png,然后删除了原来的文件。我们去bucket看一下,效果如下:
刚上传成功时的文件名和最后修改日期时间:

Lambda function被触发之后,刷新页面,显示时的文件名和最后修改日期时间:

从上图可以看到,文件已经被重命名了。
我们再去log详情页面看一下,有我们在Lambda function里定义打印的那一句话,实验成功。

有一个地方需要大家注意,就是Permissions,AWS有单独的服务,叫IAM = Identity and Access Management,先混个脸熟,因为基本上每个服务都需要用到这个IAM。针对AWS Lambda服务,是通过IAM中的role这个来管理的,不同的role有不同的权限,具体权限是怎么分配的呢?那就需要policy来具体管理了。
一般而言,如果你的lambda function不对任何其它服务做操作,那在你创建lambda function时,使用默认的就可以。但是如果你想要使用lambda function来操作其它AWS的服务,比如我们的例子是要操作AWS S3的bucket和object,那么我们的lambda function就需要有读写AWS S3 的权限,如果你没有给Lambda function对AWS S3服务的读写权限,运行上面代码时你会得到一个错误,而这个错误就是Access Deny,不信你可以试试。

说了这么多,Permissions在哪里呢?看下图:

点击Edit:

你可以使用以及存在的role作为AWS Lambda Execution role,也可以从AWS policy templates里创建一个新的。我这里是使用已经存在的role。那我们点击"View the lambda-demo-role-4p0mpjtq role"这个链接,来看看这个role上面到底有什么样的policy:

从上图可以看到有两个policy:
- AWSLambdaBasicExecutionRole-f8axxxxx:这个是创建lambda function时默认创建的
- AmazonS3FullAccess:这个是允许AWS Lambda服务对S3服务有full的access权限。刚开始学AWS Lambda,我们可以暂时就添加这个,以后熟悉之后,可以根据自己的需求创建新的policy。
本篇内容到此结束,希望能帮助大家理解AWS Lambda服务。
扫码关注微信公众号,都是干货哦!

本人微信号,欢迎骚扰!


~daling!点个在看呗!~




