我在一个lightsail实例上有一个MySQL服务器。目标是通过lambda函数访问MySQL服务器。
我所做的如下。
- 开启lightsail的VPC对等连接
- 创建MySQL用户'%' host
- 将以下策略添加到lambda函数(AmazonEC2FullAccess, AWSLambdaBasicExecutionRole, AWSLambdaVPCAccessExecutionRole)
- 打开光帆防火墙的3306端口
- 注释掉/opt/bitnami/mysql/my.cnf中的bind-address并重启mysql
下面是lambda代码和用于CDK的app.py。结果是以下错误。如果我尝试从同一VPC/子网中的另一个EC2实例中使用相同的代码连接到相同的MySQL服务器,我可以成功连接。
我错过了什么?
[ERROR] OperationalError: (2003, "Can't connect to MySQL server on 'host' (timed out)")
Traceback (most recent call last):
File "/var/task/hello.py", line 13, in main
con=MySQLdb.connect(host=host,db=db,user=user,passwd=pw,charset="utf8");
File "/opt/python/pymysql/connections.py", line 353, in __init__
self.connect()
File "/opt/python/pymysql/connections.py", line 664, in connect
raise exc
Lambda函数(hello.py)
import pymysql as MySQLdb;
def main(event, context):
print("hello");
con=MySQLdb.connect(host=host,db=db,user=user,passwd=pw,charset="utf8");
print("done");
app.py
from aws_cdk import (
aws_lambda as lam,
aws_iam as iam,
aws_ec2 as ec2,
core,
)
import os;
class MyStack(core.Stack):
def __init__(self, app: core.App, id: str) -> None:
super().__init__(app, id)
vpc = ec2.Vpc.from_vpc_attributes(
self,"VPC",
vpc_id=vpcid,
availability_zones=[zone],
isolated_subnet_ids=[subnet],
);
sg = ec2.SecurityGroup.from_security_group_id(
self,"SG",
security_group_id=sgid,
mutable=False
);
layer = lam.LayerVersion(
self, "MyLayer",
code=lam.AssetCode.from_asset('./lib'),
);
lamrole = iam.Role.from_role_arn(
self, "LambdaRole",
rolearn,
);
helloFn = lam.Function(
self, "hello",
function_name='hello',
code=lam.AssetCode.from_asset('./code'),
handler="hello.main",
timeout=core.Duration.seconds(900),
role=lamrole,
vpc=vpc, # for mysql
security_groups=[sg],
layers=[layer],
runtime=lam.Runtime.PYTHON_3_7,
)
app = core.App()
MyStack(app, "hello")
app.synth()
知道它大约8个月了,但遇到了同样的问题,让它工作。然而,我是在Nginx上使用LightSail,所以对你来说可能略有不同。
想你在很近的地方。我不确定顺序,但我是按以下顺序做的:
- 在Python代码中,确保将主机设置为Lightsail实例的私有IP。您可以在Lightsail管理区域的Networking部分找到它。这似乎总是从172开始,但对你来说可能不同。 我创建了一个单独的SQL用户,主机为'%'。这似乎是最好的解决方案,但不是必要的。可以使用root用户。
- 添加
AmazonVPCFullAccess
和/或AmazonVPCFullAccess
作为与Lambda相关的User Role的权限。 - 在Lambda配置中配置VPC(必须是Default VPC)
- 允许您的SQL用户连接到数据库:
GRANT ALL on *.* TO 'root'@'172.%.%.%' IDENTIFIED BY ‘adminpass’
。请务必更改用户名、IP地址和密码。 - 将
my.cnf
文件从bind_address=127.0.0.1
更改为bind_address=0.0.0.0
- 通过终端重新启动光帆:
sudo /opt/bitnami/ctlscript.sh restart
- 通过admin部分在LightSail中启用VPC。
完成以上操作后,我终于可以连接了。