Не удается подключиться к MySQL на lightsail из lambda

#python #mysql #aws-lambda #amazon-lightsail

Вопрос:

У меня есть сервер MySQL на экземпляре lightsail. Цель состоит в том, чтобы получить доступ к серверу MySQL из лямбда-функции.

То, что я сделал, заключается в следующем.

  • Включите VPC-просмотр светового паруса
  • Создайте пользователя MySQL с хостом»%»
  • Добавьте следующие политики в функцию lambda (AmazonEC2FullAccess, AWSLambdaBasicExecutionRole, AWSLambdaVPCAccessExecutionRole)
  • Откройте порт 3306 в брандмауэре lightsail
  • Закомментируйте адрес привязки в /opt/bitnami/mysql/my.cnf и перезагрузите MySQL

Лямбда-код и app.py для CDK приведены ниже. В результате возникает следующая ошибка. Если я попытаюсь подключиться к тому же серверу MySQL с тем же кодом из другого экземпляра EC2 в том же VPC/подсети, я смогу успешно подключиться.

Чего мне не хватает?

 [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  

Лямбда-функция (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) -gt; 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()