如何将AWS Lambda连接到VPC中私有子网中的数据库?
#aws #lambda #database #vpc

概述
默认情况下,Lambda功能是在我们的VPC之外启动的。因此,它无法访问VPC中的RDS,Elasticache,Internal Alb等等资源。因此,为了允许Lambda访问我们的私人资源,我们必须定义VPC ID,子网,安全组。 Lambda将在私有子网中创建弹性网络接口(ENI),以允许其连接。

在这个小项目中,我们将了解
1)AWS lambda连接与私人子网中的数据库。
2)如何在EC2实例上安装和使用MariadB数据库服务器。
3)如何在AWS Secret Manager中安全地存储和使用数据库凭据。
4)如何将pymysql库作为lambda层。

注意:您可以在私有子网中简单启动RDS数据,而不是在EC2实例上安装它。但是在这里,我想尝试在EC2上尝试(也很昂贵)。

先决条件
1)AWS帐户。
2)Python的很少的经验。
3)了解VPC,子网,安全组等。
4)熟悉AWS lambda。
多数民众赞成。电子开始。

step1:设置VPC:
要创建VPC,请使用Terraform脚本。
git克隆https://github.com/pramodbs543/Terraform/tree/main/Simple_VPC
在这里,您只需1)将访问密钥和秘密密钥存储为环境变量。(在提供者中显示)2)更改Terraform.TFVARS文件中的区域。应用以下命令。

Terraform Init
Terraform应用-Uauto -Approve

VPC准备就绪。

步骤2创建了IAM角色:
为此,我们需要首先使用附带的AmazonssmmanagedInstancecore策略创建IAM角色。这个IAM角色允许我们与EC2(用于安装DB)建立联系,即使EC2处于私有子网中,并且没有密钥对也没有公共IP。

Image description

Image description

搜索AmazonssmmanagedInstancecore策略,并将其附加到角色上。

Image description
给角色起名字并创造角色。

Image description

步骤3:创建安全组:
1)Lambda的安全组:

Image description

Image description
2)DB的安全组。
在入站规则中,对于mysql/aurora类型,源为lambda sg。

Image description

步骤4:在VPC的私人子网中启动EC2实例:

Image description
选择ubuntu作为ami,t2.medium,不需要钥匙对。选择DB-SG作为我们创建的安全组。保持公共IP局限。在网络部分中选择VPC并选择私有子网。
预先详细信息选择我们创建的IAM角色。

Image description
并启动实例。

步骤5:在EC2上安装MariaDB服务器:
连接到EC2。

Image description
单击会话管理器,然后单击“连接”。

Image description
更改为根目录。
$ cd /
此命令将所有软件包更新为最新版本

sudo apt update -y

此命令在您的计算机上安装MySQL Server,它还创建了Systemd Service
sudo apt install -y mariadb-server

此命令启用在上一个步骤中创建的服务
sudo systemctl enable mariadb

此命令在Linux实例上启动MySQL Server服务
sudo systemctl start mariadb

此命令可帮助您设置root用户密码并改进数据库安全性
sudo mysql_secure_installation

在这里,只需点击输入,因为我们尚未设置任何密码
Enter current password for root (enter for none):

在这里回复y
Switch to unix_socket authentication [Y/n]

在这里,用y
回复 Change the root password? [Y/n]

输入新密码
New Password:

重新输入新密码
Re-enter new Password:

说y
Remove anonymous users? [Y/n]

说y
Disallow root login remotely? [Y/n]

说n,因为我们需要它们进行验证
Remove test database and access to it? [Y/n]

说y
Reload privilege tables now? [Y/n]

感谢您使用Mariadb!

验证与DB
的连接 mysql -h localhost -u root -p
输入密码。
显示数据库:
show databases;
创建数据库:
create database mydatabase;
切换到此数据库:
use mydatabase;
在此数据库中创建一个表:

create table employees(eno int(10) primary key,ename varchar(20),esal double(10,2), eaddr varchar(30));

describe employees;

Image description

exit;

配置DB以接受远程连接:
$ cd /etc/mysql/mariadb.conf.d
$ sudo vi 50-server.cnf

设置bind-address = 0.0.0.0代替127.0.0.1

Image description
$ sudo systemctl restart mariadb
$ sudo ss -nlt

您会看到0.0.0.0:3306
Image description

现在,让我们创建一个将具有访问myDatabase权限的用户。
$ mysql -h localhost -u root -p
输入我们之前设置的根密码。

CREATE USER 'user01'@'localhost' IDENTIFIED BY 'password543';
CREATE USER 'user01'@'%' IDENTIFIED BY 'password543';

GRANT ALL PRIVILEGES ON mydatabase.* to user01@localhost IDENTIFIED BY 'password543' WITH GRANT OPTION;

GRANT ALL PRIVILEGES ON mydatabase.* to user01@'%' IDENTIFIED BY 'password543' WITH GRANT OPTION;

FLUSH PRIVILEGES;
退出

...数据库现在都设置了。

步骤6:AWS Secret Manager存储DB凭据:
选择AWS中的Secrets Manager。
存储一个新的秘密。

Image description

Image description
现在,在底部,在服务器地址中输入EC2实例的私有IP。

Image description
给秘密一个名字,然后点击接下来。

Image description
下一个再次打。最后登上秘密。(请记下您的秘密名称。在这种情况下

步骤7:创建一个lambda函数。

Image description

Image description

附上具有AWSSecretManager策略的角色。(我们需要访问Secret Manager的秘密)

现在选择VPC。

Image description
选择高可用性的两个子网和Lambda安全组。

Image description

点击创建功能。
添加pymysql库作为lambda层:
您需要在本地Windows PC上安装Python,Python版本应与您为Lambda功能选择的运行时版本匹配,在这种情况下为Python 3.10。您还需要安装PIP,以便可以下载PymySQL软件包。
安装在PC上的PIP后,打开命令提示符并导航到所需的目录并运行以下命令。

pip install --target ./python pymysql
这将在所需目录中创建一个名为Python的文件夹。然后,您需要将Python文件夹作为ZIP文件压缩,以便我们可以将其上传到AWS。
在Lambda控制台窗口中,从左侧菜单中选择“图层选项”,然后单击“创建图层”。给您的图层以``pymysql''的名称,并上传您刚刚创建的zip文件。选择Python 3.10作为兼容运行时,然后单击“创建”。

单击lambda功能。滚动到底部。在那里,您会发现层。添加图层pymysql。

Image description

层源作为自定义图层。然后从下拉下选择pymysql。

Image description

现在从
复制代码 https://github.com/pramodbs543/lambda-mysqlonEC2
雇员。为了提供json输入到代码的事件文件。偶数文件中的条目将存储在数据库中。

测试代码后,您将获得成功消息。
Image description

数据库中的记录:

Image description
架构:

Image description