amazon-web-services - Lambda 无法访问 RDS,尽管它们位于同一 VPC 中

标签 amazon-web-services aws-lambda aws-cloudformation amazon-rds

我已使用以下 CloudFormation 创建了 VPCRDS

Resources:
  TestVpc:
    Type: "AWS::EC2::VPC"
    Properties:
      CidrBlock: "10.0.0.0/16"
      EnableDnsSupport: true
      EnableDnsHostnames: true
  TestSubnetA:
    Type: "AWS::EC2::Subnet"
    Properties:
      AvailabilityZone: "ap-northeast-1a"
      CidrBlock: "10.0.0.0/20"
      VpcId: !Ref TestVpc
  TestSubnetB:
    Type: "AWS::EC2::Subnet"
    Properties:
      AvailabilityZone: "ap-northeast-1d"
      CidrBlock: "10.0.16.0/20"
      VpcId: !Ref TestVpc
  TestSubnetC:
    Type: "AWS::EC2::Subnet"
    Properties:
      AvailabilityZone: "ap-northeast-1c"
      CidrBlock: "10.0.32.0/20"
      VpcId: !Ref TestVpc
  TestSecurityGroup:
    Type: "AWS::EC2::SecurityGroup"
    Properties:
      GroupDescription: "Test security group with cloduformation"
      SecurityGroupIngress:
        - CidrIp: "10.0.0.0/16"
          IpProtocol: "tcp"
          FromPort: 0
          ToPort: 65535
      SecurityGroupEgress:
        - CidrIp: "0.0.0.0/0"
          FromPort: 0
          ToPort: 65535
          IpProtocol: "tcp"
      VpcId: !Ref TestVpc

  TestSubnetGroup:
    Type: "AWS::RDS::DBSubnetGroup"
    Properties:
      DBSubnetGroupDescription: "TestSubnetGroupDesc"
      SubnetIds:
        - !Ref TestSubnetA
        - !Ref TestSubnetB
        - !Ref TestSubnetC

  TestRDS:
    Type: "AWS::RDS::DBInstance"
    Properties:
      DBInstanceClass: "db.t2.micro"
      DBInstanceIdentifier: "rekog-moderation"
      DBName: "rekog"

      Engine: "postgres"
      EngineVersion: "10.4"

      MasterUsername: "rekog"
      MasterUserPassword: "passwd"
      AllocatedStorage: "20"

      DBSubnetGroupName: !Ref TestSubnetGroup
      VPCSecurityGroups:
        - !Ref TestSecurityGroup

RDS结果

enter image description here


Lambda 设置

enter image description here


Lambda 尝试使用域名 rekog-moderation.cokqwd6ixsnc.ap-northeast-1.rds.amazonaws.com 进行访问时,它会在执行操作时返回超时错误连接到RDS

我错过了什么?

最佳答案

您需要在入口规则中添加安全组自引用,以允许安全组的所有成员相互通信。像这样的东西:

"TestSecurityGroupIngress": {
  "Type": "AWS::EC2::SecurityGroupIngress",
  "Properties": {
    "GroupId": { "Ref": "TestSecurityGroup" },
    "IpProtocol": "tcp",
    "FromPort": "0",
    "ToPort": "65535",
    "SourceSecurityGroupId": { "Ref": "TestSecurityGroup" }
  }
}

您可以在 AWS forum 上的 CF 中找到有关自引用安全组的更多信息

关于amazon-web-services - Lambda 无法访问 RDS,尽管它们位于同一 VPC 中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51497624/

相关文章:

aws-cloudformation - 使用 Lambda 函数自动创建的角色的 ARN

amazon-web-services - VPC 中的 AWS Lambda 与数据库交互

amazon-web-services - 在两个项目之间共享 AWS Cognito/Amplify Auth 配置?

ruby-on-rails - 在 Sinatra 中使用 AWS::S3 列出存储桶

python - iOS 400 Flask + Zappa 错误请求

amazon-web-services - 如何使用云模板添加存储?

amazon-web-services - AWS Firehose 数据转换并发限制

java - 创建一个 lambda 函数将 S3 中文件的元数据存储到 Mysql 数据库?

amazon-web-services - 是否有适用于 AWS Lambda 的模拟器?

amazon-web-services - 通过 Cloudformation 在 AWS Config 中配置所有 AWS 托管规则