番禺网站建设开发北京十大科技公司
aws(学习笔记第二十二课)
-  开发复杂的
lambda应用程序(python的zip包) 
学习内容:
- 练习使用
CloudShell - 开发复杂
lambda应用程序(python) 
1. 练习使用CloudShell
 
-  
CloudShell使用背景
复杂的python的lambda程序会有许多依赖的包,如果不提前准备好这些python的依赖包,那么在lambda程序在执行的时候,会出现mudule not found错误,导致程序不能执行,因此,需要将python的主程序和依赖的包都一起打包成zip文件,这里因为要是用linux环境,进行zip打包,所以使用CloudShell进行操作。 -  
什么是
CloudShell
Shell 和开发工具
使用为AWS CloudShell会话创建的Shell,可以在首选的命令行Shell之间无缝切换。更具体地说,可以在 Bash、PowerShell 和 Z shell 之间切换。还可以访问其他预安装工具和实用程序。其中包括git、make、pip、sudo、tar、tmux、vim、wget和zip。
Shell环境已预先配置为支持几种主要软件语言,例如Node.js和Python。这意味着,例如,无需先执行运行时安装即可运行Node.js和Python项目。
可以将上传到AWS CloudShell或在其中创建的文件提交到本地存储库,然后再将这些文件推送到由AWS CodeCommit管理的远程存储库。
简单来说,就是AWS提供了一个方便的linux环境,同时具有当前用户的权限,比如说可以和S3存储进行交互。 
2.开发复杂lambda应用程序(python)
 
-  
全体概念

这里,主要参照了AWS的官方文档 -  
lambda程序的整体

 -  
lambda程序的作成详细- 准备
S3 bucketmy-aws-bucket-20250104用于将CloudShell上打包的zip文件保存到S3my-s3lambda-lab用于将image文件上传到S3my-s3lambda-lab-resized用于将缩小之后的thumbnail文件上传到S3

 - 给
lambda程序赋予权限- 策略 1 (主要是开通
logs:*){"Version": "2012-10-17","Statement": [{"Effect": "Allow","Action": ["logs:CreateLogGroup","logs:CreateLogStream","logs:PutLogEvents"],"Resource": "arn:aws:logs:*:*:*"},{"Effect": "Allow","Action": ["ec2:DescribeInstances","ec2:Start*","ec2:Stop*","ec2:DescribeInstanceStatus"],"Resource": "*"}] } - 策略 2 (主要是开通
S3:*)
注意,这里对于S3的全体权限都开通了,但是真正的开发,需要细化权限设定。{"Version": "2012-10-17","Statement": [{"Sid": "VisualEditor0","Effect": "Allow","Action": "s3:*","Resource": "*"}] } - 角色设定

 lambda的主程序import boto3 import os import sys import uuid from PIL import Image import PIL.Images3_client = boto3.client('s3')def resize_image(image_path, resized_path):with Image.open(image_path) as image:image.thumbnail((128, 128))image.save(resized_path)def handler(event, context):for record in event['Records']:bucket = record['s3']['bucket']['name']key = record['s3']['object']['key'] download_path = '/tmp/{}{}'.format(uuid.uuid4(), key)upload_path = '/tmp/resized-{}'.format(key)s3_client.download_file(bucket, key, download_path)resize_image(download_path, upload_path)s3_client.upload_file(upload_path, '{}-resized'.format(bucket), key)CloudShell上的详细操作- 作成文件夹,作成主程序文件
CreateThumbnail.py
这里的CloudShell每次的主机IP都不一样,但是目录下面的文件都能够保留。感觉是一个EBS存储卷。
/home/cloudshell-user/my_funciton/作为主路径

 - 作成
/home/cloudshell-user/my_funciton/package,安装依赖包- boto3
 - uuid
 - PIL
这是需要的三个包 
pip install --target ./package boto3 pip install --target ./package uuid pip install --target ./package PIL - 安装之后的构造

 - 开始将依赖包打入到
zip文件cd package zip -r ../my_function_pacakge.zip ./
 - 接着将主程序
python打入zipzip my_function_pacakge.zip CreateThumbnail.py
 - 将
zip文件上传到S3aws s3 cp my_function_pacakge.zip s3://my-aws-bucket-20250104
 
- 作成文件夹,作成主程序文件
 
 - 策略 1 (主要是开通
 - 开始设定
lambda-  
python版本设定
注意,这里的python版本和CloudShell的python版本一定要一致
 -  
lambda角色设定

 -  
lambda的Event设定

 -  
lambda的代码上传
这里选择从S3,上传zip文件

上传zip文件

 -  
更改运行时

这里修改成CreateThumbnail.handler 
 -  
 - 开始测试
lambda
向S3 bucket(s3://my-s3lambda-lab)上传文件,触发event
之后检查S3 bucket(s3://my-s3lambda-lab-resized)中的thumbnail作成情况。
可以看出,lambda已经正常运行,已经将thumbnail作成。

 CloudWatch的日志组

 - 准备
 
