Aws lambda 我能';t通过VPN将mysql客户端连接到RDS
我一直在努力使用AWS RDS。所有关于网络配置的事情都是一件非常痛苦的事情,因为我没有网络技能,我也不喜欢 我的目标是在RDS上创建我的mysql数据库,以便能够通过任何mysql客户端连接到它,运行我的SQL脚本来创建数据库,并执行我的lambdas来向该数据库插入数据 所以Aws lambda 我能';t通过VPN将mysql客户端连接到RDS,aws-lambda,amazon-cloudformation,amazon-rds,serverless-framework,openvpn,Aws Lambda,Amazon Cloudformation,Amazon Rds,Serverless Framework,Openvpn,我一直在努力使用AWS RDS。所有关于网络配置的事情都是一件非常痛苦的事情,因为我没有网络技能,我也不喜欢 我的目标是在RDS上创建我的mysql数据库,以便能够通过任何mysql客户端连接到它,运行我的SQL脚本来创建数据库,并执行我的lambdas来向该数据库插入数据 所以 mysql客户端-->RDS(mysql)您的RDS实例正在3306上接受来自LambdaSecurityGroup的入站连接,这对于任何连接了LambdaSecurityGroup SG的情况都是好的,但是您还需要允
mysql客户端-->RDS(mysql)您的RDS实例正在3306上接受来自LambdaSecurityGroup的入站连接,这对于任何连接了LambdaSecurityGroup SG的情况都是好的,但是您还需要允许来自VPNSecurityGroup的连接 将您的RDSSecurityGroupBlock更改为如下所示,这样您就可以从VPN连接到RDS:
RDSSecurityGroup:
Type: AWS::EC2::SecurityGroup
Properties:
GroupDescription: Allow My SQL access from lambda subnets
VpcId:
Ref: VPCStaticIP
SecurityGroupIngress:
- IpProtocol: tcp
FromPort: '3306'
ToPort: '3306'
SourceSecurityGroupId:
Ref: LambdaSecurityGroup
- IpProtocol: tcp
FromPort: '3306'
ToPort: '3306'
SourceSecurityGroupId:
Ref: VPNSecurityGroup
Tags:
- Key: Name
Value: RDSSecurityGroup
作为旁注,VPNSecurityGroup正在接受3306、221194443943的任意连接。这可能是有意的,但鉴于这些信息是出于管理目的而披露的,因此这不是最佳做法。您应该认真考虑将这些端口的CidrIp范围限定到可信的CidrIp源,以避免任何潜在的不必要的暴露。你也可以考虑从那里移除3306个块,因为它看起来不需要在VPN本身上打开这个端口。
编辑根据OP的评论,除上述内容外,您还需要将PubliclyAccessible更改为False以解决问题。我想给出问题的完整答案,因为标题意味着mysql客户端无法连接RDS 除了@hephalump更改之外,我还需要做两个以上的更改,以使我的lambdas能够连接到RDS,现在我能够连接mysql客户端和lambdas 我必须为我的Lambda创建一个新的IAM角色
LambdaRole:
Type: AWS::IAM::Role
Properties:
Path: '/'
RoleName: LambdaRole
AssumeRolePolicyDocument:
Version: '2012-10-17'
Statement:
- Effect: Allow
Principal:
Service:
- lambda.amazonaws.com
Action: sts:AssumeRole
Policies:
- PolicyName: ec2LambdaPolicies
PolicyDocument:
Version: '2012-10-17'
Statement:
- Effect: Allow
Action:
- ec2:CreateNetworkInterface
- ec2:DescribeNetworkInterfaces
- ec2:DetachNetworkInterface
- ec2:DeleteNetworkInterface
Resource: "*"
- PolicyName: 'AllowInvoke'
PolicyDocument:
Version: '2012-10-17'
Statement:
- Effect: 'Allow'
Action: 'lambda:InvokeFunction'
Resource: '*'
ManagedPolicyArns:
- arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole
- arn:aws:iam::aws:policy/service-role/AWSLambdaVPCAccessExecutionRole
解决问题的关键在于:
ManagedPolicyArns:
- arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole
- arn:aws:iam::aws:policy/service-role/AWSLambdaVPCAccessExecutionRole
然后,我必须从我的提供者中删除我的iarolestatements,并添加新角色角色:LambdaRole
现在我需要将lambda添加到正确的安全组中
因此,我将提供商上的VPC更改为:
vpc:
securityGroupIds:
- Ref: LambdaSecurityGroup
subnetIds:
- Ref: SubnetPrivate1
我已经用最新的更改更新了要点。很抱歉,您遇到了困难。我们都去过那里。不过,我相信社区会帮助你度过难关!我现在在移动设备上,并没有深入测试它,但从快速浏览来看,您似乎不允许从VPN安全组连接到RDS实例。在您的RDS安全组中,添加另一个允许VPN安全组在3306上入站的入站块;这应该允许您在连接到VPN时从mysql客户端连接到RDS。Ok。让我再看一遍配置。你认为我需要两个EIP吗?不,你不应该需要第二个EIP。看看我的答案;我还没有测试它,但这应该解决它。添加入口规则后,连接到VPN,然后就可以连接到RDS实例。确定。我现在要考试。我相信在您的示例中,您打算使用VPNSecurityGroup而不是VPCSecurityGroup。对吧?刚刚测试过。还是一样的问题。让我看看配置。您收到的错误是什么?你在用什么客户端?我超时了。我正在使用sequel Pro客户端和一个命令行:nc-zv dbname.chwrerhrurweyruiy.us-east-1.rds.amazonaws.com 3306,两者都超时。我刚刚做了一个新的测试,更改了
publilyaccessible:false
,现在我可以连接了。我按照你的建议做了这个改变。现在我将测试lambda是否可以连接到数据库。
ManagedPolicyArns:
- arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole
- arn:aws:iam::aws:policy/service-role/AWSLambdaVPCAccessExecutionRole
vpc:
securityGroupIds:
- Ref: LambdaSecurityGroup
subnetIds:
- Ref: SubnetPrivate1