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
打入zip
zip my_function_pacakge.zip CreateThumbnail.py
- 将
zip
文件上传到S3
aws 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
的日志组
- 准备