AWS Lambda 操作 RDS 示例

这篇具有很好参考价值的文章主要介绍了AWS Lambda 操作 RDS 示例。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

实现目标

创建一个 Lambda 接收调用时传入的数据, 写入 RDS 数据库 Post 表存储文章信息. 表结构如下:

id title content create_date
1 我是标题 我是正文内容 2023-10-21 15:20:00

AWS 资源准备

  • RDS 控制台创建 MySQL 实例, 不允许 Public access (后面 Lambda 需要通过 VPC 访问)
  • Secrets Manager 控制台创建 Credentials for Amazon RDS database 类型密码, 关联上面创建好的 RDS 实例, 起名为 mydb-secret
  • 从 VPC 内的跳板机手动连接 RDS 创建数据库
mysql -h [RDS 实例 Endpoint] -u admin -p

MySQL [(none)]> create database lambdaDB;
MySQL [(none)]> use lambdaDB;
MySQL [(lambdaDB)]> CREATE TABLE post (
    id INT AUTO_INCREMENT PRIMARY KEY,
    title VARCHAR(255),
    content TEXT,
    create_date DATETIME
);

  • Lambda 控制台创建函数 rds-test, Runtime 使用 Python 3.10 和开发环境保持一致, 使用默认选项 Create a new role with basic Lambda permissions 自动为新建函数创建对应的 IAM Role, 展开 Advanced settings, 勾选 Enable VPC, 选择和 RDS 相同的 VPC, 勾选两个不同 AZ 的 Private Subnet (因为是通过内网访问), 选择能访问 RDS 的安全组.

AWS Lambda 操作 RDS 示例,AWS,Python,aws,云计算

撸码环节

开发环境为 WSL2 + VSCode

# 创建项目文件夹
mkdir lambda
cd lambda
# 创建虚拟环境
virtual env
source ./env/bin/active
# 安装依赖
pip install pymysql peewee boto3
# 启动 VSCode
code .

VSCode 中创建 rds_lambda.py

from peewee import *
import json
from datetime import datetime
import boto3
from botocore.exceptions import ClientError


def get_secret():
    """从 Secrets Manager 获取 RDS 密码"""
    secret_name = "mydb-secret"
    region_name = "cn-northwest-1"

    # Create a Secrets Manager client
    session = boto3.session.Session()
    client = session.client(service_name="secretsmanager", region_name=region_name)

    try:
        get_secret_value_response = client.get_secret_value(SecretId=secret_name)
    except ClientError as e:
        raise e

    # Decrypts secret using the associated KMS key.
    secret = get_secret_value_response["SecretString"]
    return json.loads(secret)


secret = get_secret()

# 定义 RDS 连接
db = MySQLDatabase(
    database="lambdaDB",
    host=secret["host"],
    user=secret["username"],
    password=secret["password"],
    port=secret["port"],
)


# 定义基础模型
class BaseModel(Model):
    class Meta:
        database = db


# 定义数据模型
class Post(BaseModel):
    title = CharField()
    content = TextField()
    create_date = DateTimeField(default=datetime.now)


# Lambda 入口函数
def lambda_handler(event, context):
    """
    Lambda 入口函数, 调用时传入 event 应当符合以下 JSON 格式:
        {
            "title": "我是标题",
            "content": "我是正文内容"
        }
    """

    # 解析调用函数时传入的参数
    try:
        Post.create(**event)
    except:
        raise {"code": 1, "message": "添加数据失败"}

    return {"code": 0, "message": "添加数据成功"}

由于函数中用到了额外的依赖, 所以我们可以连同依赖和函数代码一块打包成 ZIP 文件, 通过 AWSCLI 进行上传部署. 官方操作文档

# 确认当前 Virtualenv 环境下安装的依赖位置
(venv) lpwm@Beijing:~/lambda$ pip show peewee
Name: peewee
Version: 3.17.0
Summary: a little orm
Home-page: https://github.com/coleifer/peewee/
Author: Charles Leifer
Author-email: coleifer@gmail.com
License: MIT License
Location: /home/lpwm/lambda/venv/lib/python3.11/site-packages
Requires: 
Required-by:

# 退出 Virtualenv 并将依赖的所有包进行打包
lpwm@Beijing:~/lambda$ deactivate 
lpwm@Beijing:~/lambda$ cd venv/lib/python3.11/site-packages/
lpwm@Beijing:~/lambda/venv/lib/python3.11/site-packages$ zip -r ../../../../deployment_package.zip .
# 返回项目主文件夹中, 检查依赖的包打好了
lpwm@Beijing:~/lambda/venv/lib/python3.11/site-packages$ cd ../../../../
lpwm@Beijing:~/lambda$ ls
deployment_package.zip  rds_lambda.py  venv
# 将 rds_lambda.py 再添加到 ZIP 包里面
lpwm@Beijing:~/lambda$ zip deployment_package.zip rds_lambda.py 
  adding: rds_lambda.py (deflated 49%)
# 检查确认 rds_lambda.py 添加成功
lpwm@Beijing:~/lambda$ unzip -l deployment_package.zip | tail
     1759  2023-10-21 14:57   s3transfer-0.7.0.dist-info/METADATA
        4  2023-10-21 14:57   s3transfer-0.7.0.dist-info/INSTALLER
       83  2023-10-21 14:57   s3transfer-0.7.0.dist-info/NOTICE.txt
       92  2023-10-21 14:57   s3transfer-0.7.0.dist-info/WHEEL
       11  2023-10-21 14:57   s3transfer-0.7.0.dist-info/top_level.txt
     2679  2023-10-21 14:57   s3transfer-0.7.0.dist-info/RECORD
    11358  2023-10-21 14:57   s3transfer-0.7.0.dist-info/LICENSE.txt
     1596  2023-10-21 15:17   rds_lambda.py
---------                     -------
102887926                     4266 files

# 上传 ZIP 包到 Lambda
lpwm@Beijing:~/lambda$ aws lambda update-function-code --function-name rds-test --zip-file fileb://deployment_package.zip

上传命令执行后会返回 Lambda 函数的信息, 显示上传正在进行
AWS Lambda 操作 RDS 示例,AWS,Python,aws,云计算
期间可以检查上传状态和结果

aws lambda get-function --function-name rds-test

上传成功
AWS Lambda 操作 RDS 示例,AWS,Python,aws,云计算
回到 Lambda 控制台, 通过 ZIP 部署的函数将不再能从浏览器直接编辑代码, 另外留意 Handler 这里用的还是之前创建时默认的入口函数, 需要修改成和我们代码一致的 rds_lambda.lambda_handler
AWS Lambda 操作 RDS 示例,AWS,Python,aws,云计算
AWS Lambda 操作 RDS 示例,AWS,Python,aws,云计算
创建测试
AWS Lambda 操作 RDS 示例,AWS,Python,aws,云计算
测试结果报错:
AWS Lambda 操作 RDS 示例,AWS,Python,aws,云计算
这是由于当前 Lambda 的 Execution Role 并没有访问 Secrets Manager 的权限. 到 Configuration - Permissions 中找到当前使用的 Role, 跳转到 IAM 控制台
AWS Lambda 操作 RDS 示例,AWS,Python,aws,云计算
Add permissions - Create inline policy
AWS Lambda 操作 RDS 示例,AWS,Python,aws,云计算
参考 文档 编写权限 JSON, 允许对特定 Secret 只读的权限

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "secretsmanager:GetResourcePolicy",
                "secretsmanager:GetSecretValue",
                "secretsmanager:DescribeSecret",
                "secretsmanager:ListSecretVersionIds"
            ],
            "Resource": [
                "arn:arn:aws-cn:secretsmanager:cn-northwest-1:888888888888:secret:mydb-secret-lNuRmj"
            ]
        },
        {
            "Effect": "Allow",
            "Action": "secretsmanager:ListSecrets",
            "Resource": "*"
        }
    ]
}

再次测试 Lambda 调用成功.
AWS Lambda 操作 RDS 示例,AWS,Python,aws,云计算

回到跳板机中检查数据库可以看到进来的数据.文章来源地址https://www.toymoban.com/news/detail-721194.html

MariaDB [lambdaDB]> select * from post;
+----+-----------+---------+---------------------+
| id | title     | content | create_date         |
+----+-----------+---------+---------------------+
|  1 | I'm title | Hello   | 2023-10-21 08:30:25 |
+----+-----------+---------+---------------------+
1 row in set (0.001 sec)

到了这里,关于AWS Lambda 操作 RDS 示例的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • AWS基于x86 vs Graviton(ARM)的RDS MySQL性能对比

    这是一个系列。在前面,我们测试了阿里云经济版(“ARM”)与标准版的性能/价格对比;华为云x86规格与ARM(鲲鹏增强)版的性能/价格对比。现在,再来看看AWS的ARM版本的RDS情况 在2018年,AWS首次推出Graviton EC2实例,2020年7月AWS RDS正式支持Graviton 2的实例,就在前两天,在最

    2024年02月05日
    浏览(39)
  • AWS Lambda函数实战

    实战效果:开发一个函数,它会关注事件中的某个名字,并返回“Hello名字!”。如果输入事件没有提供名字,则函数返回一个更加通用的问候语“Hello World!”。 AWS Lambda接口可以通过AWS命令行或可在服务器、浏览器及移动设备上运行的AWS软件开发包(SDK)来调用。 首先要在

    2024年01月22日
    浏览(61)
  • aws lambda入门之基础

    文档:AWS Lambda foundations - AWS Lambda Lambda 函数是 Lambda 的基本。 可以使用 Lambda 控制台、Lambda API、AWS CloudFormation 或 AWS SAM 配置函数。 Lambda 在事件发生时调用该函数。 Lambda 并行运行您的函数的多个实例,并受并发和扩展限制的约束。 Lambda 运行函数实例来处理事件。 可以使用

    2024年02月01日
    浏览(54)
  • AWS-数据库迁移工具DMS-场景:单账号跨区域迁移RDS for Mysql

    参考文档: 分为几个环节: 要使用 AWS DMS 迁移至 Amazon RDS 数据库实例: 1.创建复制实例 有坑内存必须8g或者以上,我测试空库 都提示内存不足 2.创建目标和源终端节点 目标空库也得自己创建哈 3.刷新源终端节点架构 4.创建迁移任务 需要手动启动任务,点击重启/恢复 5.监控

    2024年02月10日
    浏览(55)
  • AWS中Lambda集成SNS

    在Lambda中,创建名为AWSSNSDemo的函数 创建名为:SNSTopicTest的主题        发布消息后,在DynamoDB中, 如果检测到发布的消息数据,则说明集成成功。  

    2024年02月13日
    浏览(49)
  • 【SERVERLESS】AWS Lambda上实操

    通过Serverless的发展历程及带给我们的挑战,引出我们改如何改变思路,化繁为简,趋利避害,更好的利用其优势,来释放企业效能,为创造带来无限可能。 无服务器计算近年来与云原生计算都是在互联网背景下产生,其顾名思义是指开发者在构建和运行应用时无需管理服务

    2024年04月15日
    浏览(42)
  • 如何使用 AWS Lambda 运行 selenium

    借助 AWS Lambda 运行 selenium 来爬取网络数据。 与手动从网站收集数据相比,爬虫可以为我们节省很多时间,对于爬虫的每次请求而言,这相当于 AWS Lambda 的每次函数的运行。 AWS Lambda 是一种将脚本部署到云的简单且价格低廉的服务,如果我们要实现在 AWS Lambda 上运行 selenium 实

    2024年02月03日
    浏览(40)
  • 使用AWS Lambda函数的最佳实践!

    主题 函数代码 函数配置 指标和警报 处理流 安全最佳实践 有关 Lambda 应用程序最佳实践的更多信息,请参阅 Serverless Land 中的 Application design。 从核心逻辑中分离 Lambda 处理程序。这样您可以创建更容易进行单元测试的函数。在 Node.js 中可能如下所示: 利用执行环境重用来提

    2024年02月07日
    浏览(49)
  • linux:需要注意docker和aws的rds的mysql默认是UTC而不是中国时区

    问题:         如题 解决办法:         docker参考:                 mysql时间不对,修改时区_set global time_zone 无效_《小书生》的博客-CSDN博客         aws参考:                 https://www.youtube.com/watch?v=B-NaqV-A1BY                 mysql - AWS修改RDS时区

    2024年02月10日
    浏览(45)
  • AWS中lambda与DynamoDB的集成

    前言:我在整个集成过程中,存在最大的问题有两个, 1. 没有考虑到lambda函数的权限,即对DynamoDB或者其他如Kinesis的权限授权,导致无法写入或者读取。 2.最初使用了异步方式调用,导致无法写数据到DynamoDB,把代码改成同步调用即可  创建好之后保存,然后进行部署(deplo

    2024年02月13日
    浏览(74)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包