亚马逊无服务器计算 lambda 的初体验

352次阅读
没有评论

共计 4477 个字符,预计需要花费 12 分钟才能阅读完成。

1. 简介

Amazon Lambda亚马逊云科技提供的一种无服务器计算服务,它的特点如下:

  • 无服务器(Serverless)

    • 开发者无需管理底层服务器。Amazon Lambda 会自动为代码提供执行环境,包括计算资源、内存、存储等。
    • 计费基于实际执行时间和资源消耗,避免了闲置资源浪费。
  • 事件驱动
    代码的执行通常由某些事件触发。常见触发器包括:

    • 文件上传到 Amazon S3。
    • 数据库更新(如 DynamoDB)。
    • API Gateway 请求。
    • 定时任务(通过 Amazon EventBridge)。
    • 消息队列(如 Amazon SQS 或 Kafka)。
    • 函数即服务(Function as a Service, FaaS)

此外,对于 Amazon Lambda 提供了非常高的永久免费额度,关于其他更多免费产品可以点击这里

亚马逊无服务器计算 lambda 的初体验

2. 账号注册

如果还没有注册需要先注册,当然注册也非常简单,但是需要一张信用卡。首先点击注册账户,与其他的注册方式不同,这里需要先输入邮箱和用户名。

亚马逊无服务器计算 lambda 的初体验

点击验证电子邮箱会收到验证码,输入进行验证即可。

亚马逊无服务器计算 lambda 的初体验

然后当然就是要创建密码了,这里需要输入复杂一点的密码,否则不能通过验证。

亚马逊无服务器计算 lambda 的初体验

接下来需要填写联系人信息,这里按自己情况进行填写即可。需要注意的是 州/省/自治区/直辖市或地区 这里必须使用英文,所以就索性全部用英文了。

亚马逊无服务器计算 lambda 的初体验

然后就是关键了,需要填写信用卡信息,因为申请亚马逊云科技必须持有一张信用,比如万事达、运通卡、VISA卡、银联信用卡支付方式

亚马逊无服务器计算 lambda 的初体验

然后就是验证手机号码了,这个也简单,收个验证码就行。

亚马逊无服务器计算 lambda 的初体验

然后就到了最后一步,选择支持计划,这里选择免费的基本支持就好了。

亚马逊无服务器计算 lambda 的初体验

3. 简单使用

登陆后就可以进入 lambda 控制台,然后点击创建函数。

亚马逊无服务器计算 lambda 的初体验

这里有多种运行时环境可以选择,比如 Python、Node,甚至还支持 Java 环境。

亚马逊无服务器计算 lambda 的初体验

这里选择 Python,因为待会用到的案例也是 Python 环境。填写好函数名称,点击创建即可。

亚马逊无服务器计算 lambda 的初体验

创建后的页面如下。

亚马逊无服务器计算 lambda 的初体验

提示我们已经创建好了函数,可以在该页面修改代码和进行测试。

亚马逊无服务器计算 lambda 的初体验

这里的代码就是重头戏了,因为这里是处理事件关键代码。入口函数一般都命名为 lambda_handler,可以看见案例里面是直接返回一个 Hello from Lambda! 字符串。

那么如何看写的代码是否有问题呢?总不能每次都发布再看结果有没有问题吧。这个也简单,只需要点击 Test 创建一个测试事件。

亚马逊无服务器计算 lambda 的初体验

然后定义测试事件名称创建。

亚马逊无服务器计算 lambda 的初体验

点击运行后可以看见返回没问题。

亚马逊无服务器计算 lambda 的初体验

4. 自定义函数

上面的官方案例仅仅只能作为学习,我们基本用不到,所以我们需要自定义函数内容来满足我们自己的需求。

比如说我想定义一个函数,当触发这个函数时可以给特定邮箱发送邮件。这里只是一个简单的案例,还可以有其他的更多玩法,就像 cf 的 workers 那样,也是可以将 workers 的内容改造成 lambda 的格式的。

import json
import smtplib
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
from email.header import Header
import logging
import os

# 设置日志
logger = logging.getLogger()
logger.setLevel(logging.INFO)

def sendmail():
    # 从环境变量或 Secrets Manager 获取凭证
    from_addr = os.getenv('FROM_ADDR', 'xxx@qq.com')  # 使用环境变量存储邮箱地址
    password = os.getenv('EMAIL_PASSWORD', 'xxx')  # 使用环境变量存储邮箱密码
    to_addr = "xxx@qq.com"
    smtp_server = "smtp.qq.com"
    smtp_port = 465

    html_msg = """
        <h1>测试内容</h1>
    """

    # 创建邮件对象
    msg = MIMEMultipart()
    msg['From'] = from_addr  # 发件人
    msg['To'] = to_addr  # 收件人
    subject = '来自 Amazon lambda'
    msg['Subject'] = Header(subject, 'utf-8')  # 邮件主题
    msg.attach(MIMEText(html_msg, 'html', 'utf-8'))  # 邮件正文内容

    try:
        smtpobj = smtplib.SMTP_SSL(smtp_server, smtp_port)
        smtpobj.login(from_addr, password)  # 登录邮箱
        smtpobj.sendmail(from_addr, to_addr, msg.as_string())  # 发送邮件
        logger.info("邮件发送成功")
    except smtplib.SMTPException as e:
        logger.error("发送邮件时出错: %s", str(e))
    finally:
        smtpobj.quit()  # 退出 SMTP 会话

def lambda_handler(event, context):
    try:
        sendmail()
        return {
            'statusCode': 200,
            'body': json.dumps('邮件发送成功')
        }
    except Exception as e:
        return {
            'statusCode': 500,
            'body': json.dumps(f"邮件发送失败: {str(e)}")
        }

只需要将上面的内容替换掉之前 lambda_function.py 的内容,并填写好 smtp 相关账户密码。

然后这里可能还需要在配置里面配置一下超时事件,比如将超时改为 10 秒。

亚马逊无服务器计算 lambda 的初体验

再创建一个函数 url,目的是为了方便通过访问 url 触发。

亚马逊无服务器计算 lambda 的初体验

这里为了简单选择不需要授权。

亚马逊无服务器计算 lambda 的初体验

此时也可以通过测试事件查看是否能够发送邮件,由于上面讲过了这里就不提了。这里多了一种触发的方式,就是访问刚刚创建的 url。另外,可以看见下图还能添加其他很多类型的触发器。

亚马逊无服务器计算 lambda 的初体验

效果如下:

亚马逊无服务器计算 lambda 的初体验

5. 使用容器映像

有些时候像之前那样创建,编写的函数代码需要的环境并不能满足需求。此时一个比较好的方式是使用容器,基于它提供的容器打造成自己需要的容器环境,再将函数代码放入容器内。构建好镜像以后,将镜像上传到 容器注册表 ECR,然后在创建函数时选择该镜像。

5.1 创建仓库

既然需要用到容器注册表,就需要先创建一个仓库,点击创建存储库,输入仓库名,点击创建。

亚马逊无服务器计算 lambda 的初体验

创建好以后点击右上角可以查看推送命令。

亚马逊无服务器计算 lambda 的初体验

5.2 安装命令行工具

参考文档,安装命令如下:

# 1. 下载
curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip"

# 2. 解压
unzip awscliv2.zip

# 3. 安装
sudo ./aws/install

查看版本:

aws --version

5.3 配置

由于命令行需要配置凭据才能进行相关操作,所以先需要创建访问密钥,访问 安全凭证,点击创建访问密钥。

亚马逊无服务器计算 lambda 的初体验

如果是根用户会提示建议使用 IAM 角色创建,但这里为了方便还是勾选根用户继续创建,如果有需要可以创建对应角色。

亚马逊无服务器计算 lambda 的初体验

创建好密钥后记得保存,因为以后不能查看了。

亚马逊无服务器计算 lambda 的初体验

创建好以后就可以在服务器创建 ~/.aws/credentials 文件,并填写好对应的内容。

[default]
aws_access_key_id=xxx
aws_secret_access_key=xxx

5.4 构建镜像并上传

上面的准备工作做完以后,接下来就是创建镜像了。首先创建一个 app.py,内容还是和上面一样。

import json
import smtplib
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
from email.header import Header
import logging
import os

# 设置日志
logger = logging.getLogger()
logger.setLevel(logging.INFO)

def sendmail():
    # 从环境变量或 Secrets Manager 获取凭证
    from_addr = os.getenv('FROM_ADDR', 'xxx@qq.com')  # 使用环境变量存储邮箱地址
    password = os.getenv('EMAIL_PASSWORD', 'xxx')  # 使用环境变量存储邮箱密码
    to_addr = "xxx@qq.com"
    smtp_server = "smtp.qq.com"
    smtp_port = 465

    html_msg = """
        <h1>测试内容</h1>
    """

    # 创建邮件对象
    msg = MIMEMultipart()
    msg['From'] = from_addr  # 发件人
    msg['To'] = to_addr  # 收件人
    subject = '来自 Amazon lambda'
    msg['Subject'] = Header(subject, 'utf-8')  # 邮件主题
    msg.attach(MIMEText(html_msg, 'html', 'utf-8'))  # 邮件正文内容

    try:
        smtpobj = smtplib.SMTP_SSL(smtp_server, smtp_port)
        smtpobj.login(from_addr, password)  # 登录邮箱
        smtpobj.sendmail(from_addr, to_addr, msg.as_string())  # 发送邮件
        logger.info("邮件发送成功")
    except smtplib.SMTPException as e:
        logger.error("发送邮件时出错: %s", str(e))
    finally:
        smtpobj.quit()  # 退出 SMTP 会话

def lambda_handler(event, context):
    try:
        sendmail()
        return {
            'statusCode': 200,
            'body': json.dumps('邮件发送成功')
        }
    except Exception as e:
        return {
            'statusCode': 500,
            'body': json.dumps(f"邮件发送失败: {str(e)}")
        }

然后编写 dockerfile:

FROM public.ecr.aws/lambda/python:3.8

# Copy function code
COPY app.py ${LAMBDA_TASK_ROOT}

# Set the CMD to your handler (could also be done as a parameter override outside of the Dockerfile)
CMD [ "app.lambda_handler" ]

接下来推送命令就派上用场了,按提示操作即可。

亚马逊无服务器计算 lambda 的初体验

5.5 创建函数

相比较于之前的创建函数,这里需要选择容器映像,不出意外可以看见刚刚上传的镜像。

亚马逊无服务器计算 lambda 的初体验

选择好以后点击创建。

亚马逊无服务器计算 lambda 的初体验

由于是容器,不能直接编辑代码,但是可以在界面上进行测试,效果也是一样的。

亚马逊无服务器计算 lambda 的初体验

AD:【腾讯云服务器大降价】2核4G 222元/3年 1核2G 38元/年
正文完
 0
阿蛮君
版权声明:本站原创文章,由 阿蛮君 于2024-12-19发表,共计4477字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
Copyright © 2022-2025 阿蛮君博客 湘ICP备2023001393号
本网站由 亿信互联 提供云计算服务 | 蓝易云CDN 提供安全防护和加速服务
Powered by Wordpress  Theme by Puock