无法从lambda上轻帆连接MySQL



我在一个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。

完成以上操作后,我终于可以连接了。

相关内容

  • 没有找到相关文章

最新更新