AWS Lambda 操作 RDS 示例

实现目标

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

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

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/118307.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

AI的Prompt是什么

一.AI的Prompt的作用 在人工智能(AI)中,"Prompt"通常指的是向AI系统提供的输入或指令,用于引导AI进行特定的操作或生成特定的输出。例如,在一个对话型AI系统中,用户输入的问题就是一个prompt&…

【vue】使用less报错:显示this.getOptions is not a function

在vue-cli中使用 lang“less” 时报错: Module build failed: TypeError: this.getOptions is not a function at Object.lessLoader 原因:版本过高所致,所用版本为 解决:降低版本:npm install less-loader4.1.0 --s…

分类预测 | MATLAB实现SSA-CNN-BiGRU-Attention数据分类预测(SE注意力机制)

分类预测 | MATLAB实现SSA-CNN-BiGRU-Attention数据分类预测(SE注意力机制) 目录 分类预测 | MATLAB实现SSA-CNN-BiGRU-Attention数据分类预测(SE注意力机制)分类效果基本描述模型描述程序设计参考资料 分类效果 基本描述 1.MATLA…

kubeadm初始化搭建cri-dockerd记录 containerd.io

07.尚硅谷_搭建K8s集群(kubeadm方式)-部署master节点_哔哩哔哩_bilibili 视频里的版本只有1.17而现在(2023.10.20)kubernetes最新版本是1.28,需要搭载cri-dockerd, 先去网站下载了对应的rpm包cri-dockerd…

力扣每日一题69:x的平方根

题目描述: 给你一个非负整数 x ,计算并返回 x 的 算术平方根 。 由于返回类型是整数,结果只保留 整数部分 ,小数部分将被 舍去 。 注意:不允许使用任何内置指数函数和算符,例如 pow(x, 0.5) 或者 x ** 0…

Linux---(四)权限

文章目录 一、shell命令及运行原理1.什么是操作系统?2.外壳程序3.用户为什么不直接访问操作系统内核?4.操作系统内核为什么不直接把结果显示出来?非要加外壳程序?5.shell理解重点总结(1)shell是什么?&…

JDK8新特性:Stream流

目录 1.获取Stream流 2.Stream流常见的中间方法 3.Stream流常见的终结方法 1、 Stream 是什么?有什么作用?结合了什么技术? ●也叫 Stream 流,是Jdk8开始新增的一套 API ( java . util . stream .*),可以用于操作集…

前端精度问题 (id 返回的和传给后端的不一致问题)

eg: 后端返回 id 10976458979374929 前端获取到的: 10976458979374928 原因: js 中 Number类型范围-2^53 1 到 2^53 - 1 Number.isSafeInteger()用来判断一个整数是否落在这个范围之内。 java中 Long 类型的取值范围是-2^63 1 到 2^63 - 1, 比JavaScript中大很多&#xff0…

Java开发-WebSocket

WebSocket是基于TCP的一种新的网络协议。它实现了浏览器与服务器全双工通信-浏览器和服务器只需要完成一次握手&#xff0c;两者之间就可以创建持久性的连接&#xff0c;并实现 双向数据传输。 使用 导入maven坐标 <dependency><groupId>org.springframework.bo…

基于V/F控制的三相逆变器MATLAB仿真模型

微❤关注“电气仔推送”获得资料&#xff08;专享优惠&#xff09; 参考文献&#xff1a;张飞,刘亚,张玉杰.基于V/F控制的三相逆变器仿真模型的研究[J].自动化与仪器仪表,2015 关于V/F控制的论文非常多&#xff0c;随意下载&#xff01; 当分布式电源经过逆变器运行于孤岛模…

mysql聚合查询

在MySQL中&#xff0c;聚合查询是指通过一些特定的函数&#xff08;如SUM、AVG、MAX、MIN等&#xff09;根据需求来查询相关的信息。以下是一些MySQL聚合查询的例子&#xff1a; 使用SUM函数查询某列的总和&#xff1a; SELECT SUM(salary) FROM employees; 使用AVG函数查询…

【计算机毕设案例推荐】高校学术研讨信息管理系统小程序SpringBoot+Vue+小程序

前言&#xff1a;我是IT源码社&#xff0c;从事计算机开发行业数年&#xff0c;专注Java领域&#xff0c;专业提供程序设计开发、源码分享、技术指导讲解、定制和毕业设计服务 项目名 基于SpringBoot的高校学术研讨信息管理系统小程序 技术栈 SpringBoot小程序VueMySQLMaven 文…

UE4 材质实操记录

TexCoord的R通道是从左到右的递增量&#xff0c;G通道是从上到下的递增量&#xff0c;R通道减去0.5&#xff0c;那么左边就是【-0.5~0】区间&#xff0c;所以左边为全黑&#xff0c;Abs取绝对值&#xff0c;就达到一个两边向中间的一个递减的效果&#xff0c;G通道同理&#xf…

stm32外部时钟为12MHZ,修改代码适配

代码默认是8MHZ的&#xff0c;修改2个地方&#xff1a; 第一个地方是这个文件的这里&#xff1a; 第二个地方是找到这个函数&#xff1a; 修改第二个地方的这里&#xff1a;

javaEE -5(8000字详解多线程)

一&#xff1a;JUC(java.util.concurrent) 的常见类 1.1 ReentrantLock 可重入互斥锁. 和 synchronized 定位类似, 都是用来实现互斥效果, 保证线程安全&#xff0c;ReentrantLock 也是可重入锁. “Reentrant” 这个单词的原意就是 “可重入” ReentrantLock 的用法&#xf…

TypeScript学习 | 泛型

简介 泛型是指在定义函数、接口或类的时候&#xff0c;不预先指定具体的类型&#xff0c;而在使用的时候再指定类型的一种特性 作用 可以保证类型安全的前提下&#xff0c;让函数、接口或类与多种类型一起工作&#xff0c;从而实现复用 基本使用 举个例子&#xff1a; 创…

T113-S3-buildroot文件系统tar解压缩gz文件

目录 前言 一、现象描述 二、解决方案 三、tar解压缩.gz文件 总结 前言 本文主要介绍全志T113-S3平台官方SDK&#xff0c;buildroot文件系统tar不支持.gz文件解压缩的问题以及如何配置buildroot文件系统解决该问题的方法介绍。 一、现象描述 在buildroot文件系统中&#xff…

二、可行性分析与需求分析

文章目录 概念考点练习题一、可行性分析与需求分析1.可行性分析的任务2.可行性研究3.甘特图4.数据流图5.数据字典数据字典的内容 6.需求分析7. 实体联系ER图8. 状态转换图 二、练习题 概念考点练习题 一、可行性分析与需求分析 1.可行性分析的任务 用最小的代价在尽可能短的时…

Python第三方库安装——使用vscode、pycharm安装Python第三方库

[TOC](Python第三方库安装——使用vscode、pycharm安装Python第三方库) # 前言 在这里介绍vscode、Pycharm安装python第三方库的方法。 操作系统&#xff1a;windows10 专业版 环境如下&#xff1a; Pycharm Comunity 2022.3 Visual Studio Code 2019 Python 3.8 pip&#xff…

优橙内推海南专场——5G网络优化(中高级)工程师

可加入就业QQ群&#xff1a;801549240 联系老师内推简历投递邮箱&#xff1a;hrictyc.com 内推公司1&#xff1a;南京华苏科技有限公司 内推公司2&#xff1a;南京欣网通信股份有限公司 内推公司3&#xff1a;广东华讯工程有限公司 南京华苏科技有限公司 南京华苏科技有…