繁体   English   中英

无法从 lambda 连接到 Lightsail 上的 MySQL

[英]Cannot connect to MySQL on lightsail from lambda

我在 lightsail 实例上有一个 MySQL 服务器。 目标是从 lambda function 访问 MySQL 服务器。

我所做的如下。

  • 打开 lightsail 的 VPC 对等互连
  • 使用 '%' 主机创建 MySQL 用户
  • 将以下策略添加到 lambda function(AmazonEC2FullAccess、AWSLambdaBasicExecutionRole、AWSLambdaVPCAccessExecutionRole)
  • 在 lightsail 的防火墙上打开 3306 端口
  • 注释掉 /opt/bitnami/mysql/my.cnf 中的绑定地址并重启 MySQL

下面是 CDK 的 lambda 代码和 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 function (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");

应用程序.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 个月大了,但遇到了同样的问题并让它发挥作用。 但是,我将 LightSail 与 Nginx 一起使用,所以对您来说情况可能会略有不同。

想你在哪里很近。 我不确定顺序,但我按以下顺序进行:

  • 在您的 Python 代码中,确保将主机设置为 Lightsail 实例的私有 IP。 您可以在 Lightsail 管理区域的网络部分找到它。 这似乎总是以 172 开头,但对您来说可能会有所不同。
  • 我创建了一个单独的 SQL 用户,主机为“%”。 这似乎是最好的解决方案,但不是必需的。 您可以使用 root 用户。
  • 添加AmazonVPCFullAccess和/或AmazonVPCFullAccess作为与 Lambda 相关的用户角色的权限。
  • 在 Lambda 配置中配置 VPC(必须是默认 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
  • 通过终端重新启动您的 Lightsail: sudo /opt/bitnami/ctlscript.sh restart
  • 通过管理部分在 LightSail 中启用 VPC。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM