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 -pMySQL [(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 的安全组.
撸码环节
开发环境为 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 ClientErrordef get_secret():"""从 Secrets Manager 获取 RDS 密码"""secret_name = "mydb-secret"region_name = "cn-northwest-1"# Create a Secrets Manager clientsession = 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 | tail1759 2023-10-21 14:57 s3transfer-0.7.0.dist-info/METADATA4 2023-10-21 14:57 s3transfer-0.7.0.dist-info/INSTALLER83 2023-10-21 14:57 s3transfer-0.7.0.dist-info/NOTICE.txt92 2023-10-21 14:57 s3transfer-0.7.0.dist-info/WHEEL11 2023-10-21 14:57 s3transfer-0.7.0.dist-info/top_level.txt2679 2023-10-21 14:57 s3transfer-0.7.0.dist-info/RECORD11358 2023-10-21 14:57 s3transfer-0.7.0.dist-info/LICENSE.txt1596 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 get-function --function-name rds-test
上传成功
回到 Lambda 控制台, 通过 ZIP 部署的函数将不再能从浏览器直接编辑代码, 另外留意 Handler
这里用的还是之前创建时默认的入口函数, 需要修改成和我们代码一致的 rds_lambda.lambda_handler
创建测试
测试结果报错:
这是由于当前 Lambda 的 Execution Role 并没有访问 Secrets Manager 的权限. 到 Configuration - Permissions 中找到当前使用的 Role, 跳转到 IAM 控制台
Add permissions - Create inline policy
参考 文档 编写权限 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 调用成功.
回到跳板机中检查数据库可以看到进来的数据.
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 示例
实现目标 创建一个 Lambda 接收调用时传入的数据, 写入 RDS 数据库 Post 表存储文章信息. 表结构如下: idtitlecontentcreate_date1我是标题我是正文内容2023-10-21 15:20:00 AWS 资源准备 RDS 控制台创建 MySQL 实例, 不允许 Public access (后面 Lambda 需要通过 VPC 访问…...

【java爬虫】使用selenium获取某交易所公司半年报数据
引言 上市公司的财报数据一般都会进行公开,我们可以在某交易所的官方网站上查看这些数据,由于数据很多,如果只是手动收集的话可能会比较耗时耗力,我们可以采用爬虫的方法进行数据的获取。 本文就介绍采用selenium框架进行公司财…...

MATLAB - 不能使用PYTHON,缺少matplotlib模块的解决办法
matlab缺少python-matplotlib模块的解决办法 1. 前言、概述2. 解决办法3. 可能出现问题4. 结果 1. 前言、概述 起因是我用习惯的colormap函数getPyPlot_cMap不能用了:【这个函数要调用PYTHON】 报错的地方: ModuleNotFoundError: No module named ‘ma…...
mk语法示例
这里写自定义目录标题 欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants 创建一个自定义列表如何创建一个…...

英语什么时候加s和es
名词变复数一般情况下加s,以s,x,ch,sh结尾加es。一个名词如果表示一个或一样东西,它取单数形式,如果表示两个或更多的这类东西,则需要用名词复数形式。 1 以s,x,sh,ch结尾的词,加es。 2 以辅音字母(除a/e/…...

unity中方向的两种表示:欧拉角和四元数
欧拉角:简单来说就是你可以选择 0度~360度 的范围 四元数:在计算机图像学中,四元数用于物体的旋转,是一种复杂,但效率较高的旋转方式 Quaternion结构体代表一个四元数,包含一个标量和一个三维向量&#x…...
ViT-L-14.pt下载load checkpoint from xxx
load checkpoint from E:\BaiduNetdiskDownload\sd-webui-aki-v4\models\BLIP\model_base_caption_capfilt_large.pth stable diffusion反推提示词出现此提示时,需安装以下模型至sd-webui-aki-v4.cache\clip\目录 ViT-L-14.pt https://openaipublic.azureedge.net/…...

机械设备经营小程序商城的作用是什么
由于机械设备厂商品牌需要各地招商代理,因此在管理方面也需要工具进行高效管理。如今各个行业都在开展数字化转型解决行业所遇难题或通过线上销售解决传统三公里难题及品牌扩张难题、用户消费渠道少等难题,构建会员体系精细化管理,同时还需要…...
小程序跨页面传递参数的几种方式
当我们在开发小程序时,经常会遇到需要在不同页面之间传递数据的情况。为了实现页面间的数据传递,小程序提供了多种方法。下面将介绍几种常用的传递数据的方法。 URL参数传递:这是一种简单直接的传递数据的方式。在跳转页面时,可以…...
【算法与数据结构】--高级算法和数据结构--高级数据结构
一、堆和优先队列 堆(Heap)是一种特殊的树状数据结构,通常用于实现优先队列。堆有两种主要类型:最大堆和最小堆。最大堆是一棵树,其中每个父节点的值都大于或等于其子节点的值,而最小堆是一棵树࿰…...
小工具 - Python图片转PDF文件
前言 主要整理记载一些python实现的小脚本,网上基本转换要会员,懒得搞了,这个一键生成,可以打包成exe文件使用 单张图片转换成pdf、图片批量转换成pdf # coding UTF-8 import os from io import BytesIO from PIL import Imag…...

bitbucket.org 用法
这个网站需要魔法,注册完成后添加厂库时间2023.10 图1 图2 第二张图 ,不要.gitignore文件 sourcetree 1,创建前端项目 npm create vitelatest 2.打开vscode创建本地Git 看到Git代提交的文件 sourcetree,新建 已存在的本地厂库 提交到Git 添…...
lodash常用方法合集
安装lodash 建议安装lodash-es,lodash-es 是 lodash 的 es modules 版本 ,是着具备 ES6 模块化的版本,体积小。按需引入。 示例 npm i lodash-es import { chunk,compact } from lodash-es; /**按需引入*/ 1.chunk 数组分组 chunk(arra…...

Nginx平滑升级重定向rewrite
文章目录 Nginx平滑升级&重定向rewritenginx平滑升级流程环境查看旧版的配置信息下载新版nginx源码包和功能模块包编译配置新版本平滑升级验证 重定向rewrite配置重定向准发访问测试 Nginx平滑升级&重定向rewrite nginx平滑升级 流程 平滑升级: (升级版本、增加新功…...

Mysql基础与高级汇总
SQL语言分类 DDL:定义 DML:操作 DCL:控制(用于定义访问权限和安全级别) DQL:查询 Sql方言 ->sql:结构化查询语言 mysql:limit oracle:rownum sqlserver:top 但是存储过程:每一种数据库软件一样SQL语法要求: SQL语句可以单行或多行书写&…...
为什么避免在循环、条件或嵌套函数中调用 Hooks
为什么避免在循环、条件或嵌套函数中调用 Hooks 为了确保 Hook 在每一次渲染中都按照同样的顺序被调用。这让 React 能够在多次的 useState 和 useEffect 调用之间保持 hook 状态的正确。 我们可以在单个组件中使用多个 State Hook 或 Effect Hook: function Form…...
自然语言处理---Transformer机制详解之BERT模型特点
1 BERT的优点和缺点 1.1 BERT的优点 通过预训练, 加上Fine-tunning, 在11项NLP任务上取得最优结果.BERT的根基源于Transformer, 相比传统RNN更加高效, 可以并行化处理同时能捕捉长距离的语义和结构依赖.BERT采用了Transformer架构中的Encoder模块, 不仅仅获得了真正意义上的b…...
c语言基础:L1-048 矩阵A乘以B
给定两个矩阵A和B,要求你计算它们的乘积矩阵AB。需要注意的是,只有规模匹配的矩阵才可以相乘即若A有Ra行、Ca列,B有Rb行、Cb列,则只有Ca与Rb相等时,两个矩阵才能相乘。 输入格式: 输入先后给出…...

asp.net乒乓球场地管理系统VS开发sqlserver数据库web结构c#编程Microsoft Visual Studio
一、源码特点 asp.net乒乓球场地管理系统是一套完善的web设计管理系统,系统具有完整的源代码和数据库,系统主要采用B/S模式开发。开发环境为vs2010,数据库为sqlserver2008,使用c#语 言开发 asp.net 乒乓球场地管理系统 二…...
git仓库中增加子仓库
在 Git 中包含另一个 Git 仓库通常使用 Git 子模块(Git Submodule)来实现。子模块允许你在一个 Git 仓库中包含另一个 Git 仓库,从而在一个仓库中管理多个相关但独立的项目。 以下是如何将一个 Git 仓库包含为另一个 Git 仓库的子模块的步骤…...

【计算机组成原理】计算机硬件的基本组成、详细结构、工作原理
引言 计算机如同现代科技的“大脑”,其硬件结构的设计逻辑承载着信息处理的核心奥秘。从早期程序员手动输入指令的低效操作,到冯诺依曼提出“存储程序”概念引发的革命性突破,计算机硬件经历了从机械操控到自动化逻辑的蜕变。本文将深入拆解…...

My图床项目
引言: 在海量文件存储中尤其是小文件我们通常会用上fastdfs对数据进行高效存储,在现实生产中fastdfs通常用于图片,文档,音频等中小文件。 一.项目中用到的基础组件(Base) 1.网络库(muduo) 我们就以muduo网络库为例子讲解IO多路复用和reactor网络模型 1.1 IO多路复用 我们可以…...
【Linux内核】设备模型之udev技术详解
目录 1. udev技术概述 2. 技术层次分析 2.1 内核层交互 2.2 规则引擎层 2.3 用户空间实现 3. 关键技术要点 3.1 动态设备节点管理 3.2 热插拔处理 3.3 模块化规则系统 3.3.1. 变量替换功能 3.3.2. 条件判断能力 3.3.3. 实现机制 3.3.4 应用场景 3.3.5 扩展能力 4…...

Leetcode 2494. 合并在同一个大厅重叠的活动
1.题目基本信息 1.1.题目描述 表: HallEvents ----------------- | Column Name | Type | ----------------- | hall_id | int | | start_day | date | | end_day | date | ----------------- 该表可能包含重复字段。 该表的每一行表示活动的开始日期和结束日期&…...

软件测评服务如何依据标准确保品质?涵盖哪些常见内容?
软件测评服务涉及对软件的功能和性能等多维度进行评估和检验,这一过程有助于确保软件的品质,降低故障发生率及维护费用,对于软件开发和维护环节具有至关重要的价值。 测评标准依据 GB/T 25000.51 - 2016是软件测评的核心依据。依照这一标准…...

Linux --TCP协议实现简单的网络通信(中英翻译)
一、什么是TCP协议 1.1 、TCP是传输层的协议,TCP需要连接,TCP是一种可靠性传输协议,TCP是面向字节流的传输协议; 二、TCPserver端的搭建 2.1、我们最终好实现的效果是 客户端在任何时候都能连接到服务端,然后向服务…...

Verilog编程技巧01——如何编写三段式状态机
前言 Verilog编程技巧系列文章将聚焦于介绍Verilog的各种编程范式或者说技巧,编程技巧和编程规范有部分重合,但并非完全一样。规范更注重编码的格式,像变量命名、缩进、注释风格等,而编程技巧则更偏重更直观易读、更便于维护、综合…...
Android 之 kotlin 语言学习笔记四(Android KTX)
一、Android KTX 简介 Android KTX 是包含在 Android Jetpack 及其他 Android 库中的一组 Kotlin 扩展程序。KTX 扩展程序可以为 Jetpack、Android 平台及其他 API 提供简洁的惯用 Kotlin 代码。为此,这些扩展程序利用了多种 Kotlin 语言功能,其中包括&…...
ObjectMapper 在 Spring 统一响应处理中的作用详解
ObjectMapper 是 Jackson 库的核心类,专门用于处理 JSON 数据的序列化(Java 对象 → JSON)和反序列化(JSON → Java 对象)。在你提供的代码中,它解决了字符串响应特殊处理的关键问题。 一、为什么需要 Obj…...

服务器安装软件失败或缺依赖怎么办?
服务器在安装软件时失败或提示缺少依赖,是运维中非常常见的问题。这个问题大多发生在 Linux 云服务器环境,原因和解决方法也有共性。以下是详细说明和解决建议: 🧠 一、常见原因分析 问题类型描述🔌 软件源不可用服务器…...