Aws lambda 我能';t通过VPN将mysql客户端连接到RDS

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的情况都是好的,但是您还需要允

我一直在努力使用AWS RDS。所有关于网络配置的事情都是一件非常痛苦的事情,因为我没有网络技能,我也不喜欢

我的目标是在RDS上创建我的mysql数据库,以便能够通过任何mysql客户端连接到它,运行我的SQL脚本来创建数据库,并执行我的lambdas来向该数据库插入数据

所以


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