#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()