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 bucket- my-aws-bucket-20250104用于将- CloudShell上打包的- zip文件保存到- S3
- my-s3lambda-lab用于将- image文件上传到- S3
- my-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的日志组
  
 
- 准备
