【问题标题】:Why is the connection to S3 via a Gateway Endpoint timing out?为什么通过网关端点连接到 S3 超时?
【发布时间】:2020-08-30 06:40:32
【问题描述】:
VPC:
  PublicSubnet:
    EC2-Instance
    IGW
    NAT
    Route to IGW
  PrivateSubnet:
    EC2-Instance
    Route to NAT
    Route to S3VPCEndpoint
  S3VPCEndpoint

这是我的 CFn 模板的网络部分:

Resources:
  VPC:
    Type: AWS::EC2::VPC
    Properties:
      EnableDnsSupport: true
      EnableDnsHostnames: true
      InstanceTenancy: default
      CidrBlock: 10.1.0.0/16

  PublicSubnet:
    Type: AWS::EC2::Subnet
    Properties:
      CidrBlock: 10.1.0.0/24
      MapPublicIpOnLaunch: True
      VpcId: !Ref VPC
      Tags:
        - Key: "Name"
          Value: "Raffael Public Subnet"

  PrivateSubnet:
    Type: AWS::EC2::Subnet
    Properties:
      CidrBlock: 10.1.1.0/24
      VpcId: !Ref VPC
      Tags:
        - Key: "Name"
          Value: "Raffael Private Subnet"

  InternetGateway:
    Type: AWS::EC2::InternetGateway
    DependsOn: VPC

  AttachGateway:
    Type: AWS::EC2::VPCGatewayAttachment
    Properties:
      VpcId: !Ref VPC
      InternetGatewayId: !Ref InternetGateway

  PublicRouteTable:
    Type: AWS::EC2::RouteTable
    Properties:
      VpcId: !Ref VPC

  PrivateRouteTable:
    Type: AWS::EC2::RouteTable
    Properties:
      VpcId: !Ref VPC

  PublicRouteToIGW:
    Type: AWS::EC2::Route
    DependsOn: AttachGateway
    Properties:
      RouteTableId: !Ref PublicRouteTable
      DestinationCidrBlock: 0.0.0.0/0
      GatewayId: !Ref InternetGateway

  PublicSubnetRouteTableAssociation:
    Type: AWS::EC2::SubnetRouteTableAssociation
    Properties:
      SubnetId:
        Ref: PublicSubnet
      RouteTableId:
        Ref: PublicRouteTable

  PrivateSubnetRouteTableAssociation:
    Type: AWS::EC2::SubnetRouteTableAssociation
    Properties:
      SubnetId:
        Ref: PrivateSubnet
      RouteTableId:
        Ref: PrivateRouteTable

  PublicInstanceSecurityGroup:
    Type: AWS::EC2::SecurityGroup
    Properties:
      GroupDescription: Enable SSH access via port 22
      VpcId: !Ref VPC
      SecurityGroupIngress:
        - IpProtocol: tcp
          FromPort: 22
          ToPort: 22
          CidrIp: 0.0.0.0/0

  PrivateInstanceSecurityGroup:
    Type: AWS::EC2::SecurityGroup
    Properties:
      GroupDescription: Enable SSH access via port 22
      VpcId: !Ref VPC
      SecurityGroupIngress:
        - IpProtocol: tcp
          FromPort: 22
          ToPort: 22
          SourceSecurityGroupId: !GetAtt PublicInstanceSecurityGroup.GroupId

  Nat:
     Type: AWS::EC2::NatGateway
     Properties:
        AllocationId: !GetAtt NatEIP.AllocationId
        SubnetId: !Ref PublicSubnet

  NatEIP:
     Type: AWS::EC2::EIP
     Properties:
        Domain: vpc

  PrivateRouteToNat:
     Type: AWS::EC2::Route
     Properties:
        RouteTableId: !Ref PrivateRouteTable
        DestinationCidrBlock: 0.0.0.0/0
        NatGatewayId: !Ref Nat

  S3GatewayEndpoint:
    Type: AWS::EC2::VPCEndpoint
    Properties:
      RouteTableIds:
        - !Ref PublicRouteTable
        - !Ref PrivateRouteTable
      ServiceName: !Sub com.amazonaws.${AWS::Region}.s3
      VpcId: !Ref VPC

有两个 EC2 实例 - 一个在私有子网中,一个在公共子网中。这些和相关的安全组在第二个模板中设置。

如果我通过公共 EC2 SSH 到私有 EC2,我可以从私有子网访问 S3。含义 aws s3 ls 列出所有存储桶。

但是 - 这个请求显然是通过 NAT 的。因为如果我通过将其路由的DestinationCidrBlock 设置为1.2.3.4/32 来有效地停用它,那么aws s3 ls 就会超时:

HTTPSConnectionPool(host='s3.amazonaws.com', port=443): 
Max retries exceeded with url: / (Caused by ConnectTimeoutError
(<botocore.awsrequest.AWSHTTPSConnection object at 0x7fd86b183828>, 
'Connection to s3.amazonaws.com timed out. (connect timeout=60)'))

所以我看了一下Why can’t I connect to an S3 bucket using a gateway VPC endpoint?

  1. VPC 中的 DNS 设置:VPC 的“DNS 解析”设置为“已启用”
  2. 到 Amazon S3 的路由表设置:有一条路由
  3. 安全组出站规则:无限制
  4. 网络 ACL 规则:无限制
  5. 网关 VPC 终端节点策略:无限制
  6. S3 存储桶策略:我正在使用 ListBucket 进行测试

知道我必须在模板中调整什么吗?

【问题讨论】:

  • 我看到的一个问题是您在 VPCGatewayAttachment 上的 EIP 上缺少必需的 DependsOn 属性。这很可能不是 S3 网关无法正常工作的原因,但拥有该属性仍然是一种很好的做法。
  • 实际上,关于 DependsOn,我不确定您指的是哪里。该链接意味着我必须将 DependsOn: AttachGateway 放入 EC2-Resource(公共子网的)中。你是这个意思吗?这里唯一的 EIP 与 VPCGatewayAttachment 无关。
  • @Marcin 我认为您指的是此处最后一个示例中指示的内容:docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/…。这个例子让我很困惑 b/c 没有指定 VPCGatewayAttach 并且没有这个 DependsOn 它可以工作,所以我把它省略了。
  • 检查您发布的链接中的示例。它有 DependsOn: VPCGatewayAttach 用于 EIP。

标签: amazon-web-services amazon-cloudformation


【解决方案1】:

从您的公有子网 EC2 实例:

此 EC2 实例作为公共 IPv4 地址,可以使用 Internet 网关。

$ aws s3 ls

应该没问题。

$ aws s3 ls --region eu-central-1

应该没问题。

从您的私有子网 EC2 实例:

此 EC2 实例仅作为私有 IPv4 地址,不能使用 Internet 网关, 您已经创建了一个用于访问 S3 的 VPCEndpoint。

$ aws s3 ls

不正常(不响应)。

我猜您可能在多个区域都有 S3 存储桶?

$ aws s3 ls --region eu-central-1

应该没问题。

您只能列出“eu-central-1”区域的 S3 存储桶 因为您的 VPC 终端节点与区域“eu-central-1”相关联。

您可以在 AWS 控制台中验证从您的 CF 模板创建的值:

ServiceName: !Sub com.amazonaws.${AWS::Region}.s3

【讨论】:

    【解决方案2】:

    您的 VPC 设置正确(减去缺少的 DependsOn)。我使用 copy-and-paste 复制了您的设置,启动了两个实例,一个是公共的,一个是私有的,一切都按预期运行。

    我还删除了 NAT 网关,仍然可以在私有子网中进行 s3 访问。为了仔细检查,我删除了 S3 VPC 网关,对 s3 的访问停止,表明流量正在通过网关。

    因此,肯定有其他事情发生,与 VPC 设置无关。也许与您的实例有关?我使用了us-east-1 区域,因此eu-central-1 中可能存在一些区域问题?

    【讨论】:

    • 我将重新部署堆栈并再试一次。非常感谢您付出努力来实际测试模板!
    • @Raffael 没问题。使用网关附件时,请根据需要使用DependsOn 属性。
    • 什么时候使用DependsOn背后有严格的逻辑还是根据底层DAG直观添加?基本上在有依赖关系的任何地方都添加它是一种好习惯吗?
    • @Raffael CFN 尝试并行创建资源。因此,在 GatewayAttachment 和 EIP 的情况下,Ref 参数没有关系。因此,EIP 可能会在附加之前创建一点,从而导致错误,因为它需要它作为 IP 地址。大多数其他资源使用RefGetAtt 互连,因此CFN 可以找出正确的顺序并且不需要DependsOn
    【解决方案3】:

    来自文档:

    端点当前不支持跨区域请求——确保 您在与存储桶相同的区域中创建终端节点。你可以 使用 Amazon S3 控制台或通过 使用 get-bucket-location 命令。使用特定于区域的 Amazon S3 访问您的存储桶的端点;例如, mybucket.s3-us-west-2.amazonaws.com。有关更多信息 Amazon S3 的区域特定终端节点,请参阅 Amazon Simple Storage Amazon Web Services 一般参考中的服务 (S3)。如果您使用 AWS CLI 向 Amazon S3 发出请求,将您的默认区域设置为 与您的存储桶相同的区域,或在您的存储桶中使用 --region 参数 请求。

    检查这是否是罪魁祸首。 https://docs.aws.amazon.com/vpc/latest/userguide/vpc-endpoints-s3.html

    【讨论】:

    • 一切都在 eu-central-1
    • 您是否创建了类似boto3.client('s3', endpoint_url='s3.eu-central-1.amazonaws.com')' 的连接?它可能会起作用
    猜你喜欢
    • 2016-07-23
    • 2023-02-07
    • 2012-04-13
    • 2017-10-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-18
    相关资源
    最近更新 更多