简介:

欢迎来到小李哥全新亚马逊云科技AWS云计算知识学习系列,适用于任何无云计算或者亚马逊云科技技术背景的开发者,通过这篇文章大家零基础5分钟就能完全学会亚马逊云科技一个经典的服务开发架构方案。

我会每天介绍一个基于亚马逊云科技AWS云计算平台的全球前沿云开发/架构技术解决方案,帮助大家快速了解国际上最热门的云计算平台亚马逊云科技AWS最佳实践,并应用到自己的日常工作里。本次介绍的是如何利用亚马逊云科技上利用无服务器云原生代码开发服务Lambda,开发事件触发的图片处理应用,省去服务器运维并提升应用扩展性。本方案架构图如下:

方案所需基础知识 

什么是 AWS Lambda 服务?

AWS Lambda 是亚马逊云科技提供的一项无服务器计算服务,允许开发者在无需管理服务器的情况下运行代码。通过 Lambda,您可以编写代码并上传到云端,AWS 会自动为您处理底层的计算资源分配、维护和扩展。Lambda 支持多种编程语言,能够响应各种事件触发代码执行,如对 S3 桶的更改、API Gateway 请求、数据库更新等。

利用云原生服务 Lambda 开发应用的优势

简化了基础设施管理

使用 AWS Lambda 开发应用程序带来了许多显著优势。首先,简化了基础设施管理。开发者不需要担心服务器的配置、维护或扩展,只需专注于编写业务逻辑,剩下的由 AWS 自动处理。这种无服务器架构极大地减少了运维工作,使得应用开发更加敏捷和高效。

良好扩展能力、降低成本

其次,按需扩展能力是 Lambda 的一大亮点。无论应用面临怎样的负载波动,Lambda 都能够自动扩展处理能力,确保应用在高峰期也能保持稳定的性能。同时,由于 Lambda 是按实际计算时间计费,企业只需为代码执行的时间付费,这使得成本控制更加灵活和透明。

支持多种AWS上的触发事件

此外,Lambda 还支持多种触发事件,与其他 AWS 服务紧密集成。这使得开发者可以轻松构建复杂的事件驱动架构,从数据处理管道、自动化任务到无服务器 Web 应用,Lambda 都能胜任。

本方案包括的内容

1. 创建一个云原生服务Lambda函数

2.为Lambda配置事件触发规则,当S3存储桶有图片上传时触发

3.在CloudWatch监控服务中查看Lambda函数日志

项目搭建具体步骤 

1. 首先我们进入S3服务中,创建一个S3存储桶。

2. 点击Create Bucket创建

3. 为S3存储桶命名为“images-randomnumber1112”,保持其他配置为默认后点击Create创建。

4. 进入该S3存储桶后点击Upload选择上传一张图片。

 5. 进入Lambda服务页面

6. 点击创建一个Lambda函数

7. 选择“Author from scratch”表示创建一个空的代码文件,为函数命名为“Create-Thumbnail”,编程语言选择Python3.9。

8. 为Lambda函数添加访问S3的权限“lambda-execution-role”,再点击Create创建。

9. 接下来我们为Lambda添加事件触发规则,点击“Add trigger”。

 10. 我们配置当我们创建的S3桶“images-randomnumber1112”有图片/文件上传操作时,触发该Lambda函数,最后点击右下角的Add添加。

11. 我们此时的代码文件还是空的,我们选择右侧的“Upload From”,再点击“Amazon S3 link URL:”从S3桶中上传写好的代码文件。

12. 填写代码所在的URL路径“us-west-2-aws-training.s3.us-west-2.amazonaws.com/courses/spl-88/v2.3.25.prod-b11cdbd0/scripts/CreateThumbnail.zip”,点击右下角Save保存。

 上传的具体代码如下,该Python代码主要用于处理图像并将图像保存到另外一个S3存储桶。

import boto3
import os
import sys
import uuid
from PIL import Image
import PIL.Image

s3_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)

13. 进入Runtime Settings程序运行配置,修改被调用的主函数名Handler为“CreateThumbnail.handler”,与代码中的主函数名匹配。

14. 接下来我们对该代码进行测试,进入“Test”测试页面,将该测试命名为“Upload”。

15. 选择代码测试模板为S3 Put

16. 将代码测试配置中的“s3.bucket.name”和“s3.bucket.arn”替换成我们创建的S3桶名,将“object.key”替换为我们的图片名“HappyFace.jpg”,最后点击右上角的Test开始测试。

17. 我们得到测试成功的结果,返回为“null”,以及得到代码运行的消耗,我们同时可以点击Click Here来查看具体的运行日志和运行指标。

如何通过亚马逊云科技Python SDK创建Lambda函数?

以下是使用AWS Boto3 SDK创建一个AWS Lambda函数的Python代码示例

import boto3
import zipfile
import io

# 创建AWS Lambda客户端
lambda_client = boto3.client('lambda', region_name='us-east-1')

# 创建一个Lambda函数的代码包
def create_lambda_deployment_package():
    deployment_package = io.BytesIO()
    with zipfile.ZipFile(deployment_package, mode='w') as zf:
        zf.writestr('lambda_function.py', """
def lambda_handler(event, context):
    return 'Hello, World!'
""")
    deployment_package.seek(0)
    return deployment_package.read()

# 创建Lambda函数
def create_lambda_function():
    function_name = 'myLambdaFunction'
    
    try:
        response = lambda_client.create_function(
            FunctionName=function_name,
            Runtime='python3.8',
            Role='arn:aws:iam::YOUR_ACCOUNT_ID:role/YourLambdaRole',
            Handler='lambda_function.lambda_handler',
            Code={'ZipFile': create_lambda_deployment_package()},
            Description='My test Lambda function',
            Timeout=15,
            MemorySize=128,
            Publish=True,
        )
        print(f'Lambda function {function_name} created successfully.')
        return response
    except Exception as e:
        print(f'Error creating Lambda function: {str(e)}')
        return None

if __name__ == '__main__':
    create_lambda_function()

 参数解释:

创建Lambda函数

  • create_lambda_function 函数是使用Boto3 SDK的 create_function 方法创建Lambda函数。
  • 参数解释
    • FunctionName: Lambda函数的名称。
    • Runtime: 代码运行环境,这里指定为Python 3.8。
    • Role: 赋予Lambda函数的IAM角色,提供必要的权限。
    • Handler: 指定Lambda函数的主函数,格式为 文件名.函数名
    • Code: 上传的Lambda函数代码的zip文件。
    • Description: 对Lambda函数的描述。
    • Timeout: 函数的超时时间(以秒为单位)。
    • MemorySize: 为函数分配的内存大小(以MB为单位)。
    • Publish: 是否部署函数新版本。

以上就是在亚马逊云科技上利用云原生服务Lambda减轻运维压力,加速代码开发,提升服务扩展性的全部步骤。欢迎大家关注0基础5分钟上手AWS系列,未来获取更多国际前沿的AWS云开发/云架构方案。 

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐