由于超时,无法从EC2实例连接到SQS。

3
我看到的错误是:无法执行Http请求:连接到sqs.us-east-1.amazonaws.com:443
org.apache.http.conn.ConnectTimeoutException: Connect to sqs.us-east-1.amazonaws.com:443 [sqs.us-east-1.amazonaws.com/54.239.27.172] failed: connect timed out
        at org.apache.http.impl.conn.DefaultHttpClientConnectionOperator.connect(DefaultHttpClientConnectionOperator.java:151)
        at org.apache.http.impl.conn.PoolingHttpClientConnectionManager.connect(PoolingHttpClientConnectionManager.java:359)
        at sun.reflect.GeneratedMethodAccessor19.invoke(Unknown Source)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:498)
        at com.amazonaws.http.conn.ClientConnectionManagerFactory$Handler.invoke(ClientConnectionManagerFactory.java:76)
        at com.amazonaws.http.conn.$Proxy54.connect(Unknown Source)
        at org.apache.http.impl.execchain.MainClientExec.establishRoute(MainClientExec.java:381)
        at org.apache.http.impl.execchain.MainClientExec.execute(MainClientExec.java:237)
        at org.apache.http.impl.execchain.ProtocolExec.execute(ProtocolExec.java:185)
        at org.apache.http.impl.client.InternalHttpClient.doExecute(InternalHttpClient.java:185)
        at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:83)
        at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:56)
        at com.amazonaws.http.apache.client.impl.SdkHttpClient.execute(SdkHttpClient.java:72)
        at com.amazonaws.http.AmazonHttpClient$RequestExecutor.executeOneRequest(AmazonHttpClient.java:1181)
        at com.amazonaws.http.AmazonHttpClient$RequestExecutor.executeHelper(AmazonHttpClient.java:1030)
        ... 21 common frames omitted

我的安全组的出站规则是:所有流量 10.0.0.0/8

我无法更改出站规则以允许所有互联网流量 - 这是一种限制。

您有什么想法如何解决这个问题吗?


你的实例是在公共子网还是私有子网中?如果它在公共子网中,是否有公共IP地址?你能否编辑与SQS相关的特定IP地址范围的安全组(但不是完整的互联网)? - undefined
这是一个私有子网。它没有公共IP地址。是的,我可以编辑入站和出站规则的安全组,但我不想暴露给整个互联网。 - undefined
公共子网中是否有NAT实例或NAT网关,为私有子网中的实例提供互联网访问?私有子网的路由表是否已配置以将流量发送到NAT实例/网关? - undefined
不,那还没有完成。 - undefined
3个回答

3
如John所述,AWS API是公共终端节点(例外情况是VPC Endpoints,这是VPC私有终端节点,目前仅适用于S3和DynamoDB)。从私有子网中,您需要NAT才能访问这些公共终端节点。
但是,为了限制实例对 AWS服务的访问权限,您需要配置安全组的出站规则。
亚马逊为其终端节点发布IP范围,并允许您订阅更改通知:
每当AWS IP地址范围发生更改时,我们会向AmazonIpSpaceChanged主题的订阅者发送通知。有效负载以以下格式包含信息:
{
  "create-time":"yyyy-mm-ddThh:mm:ss+00:00",
  "synctoken":"0123456789",
  "md5":"6a45316e8bc9463c9e926d5d37836d33",
  "url":"https://ip-ranges.amazonaws.com/ip-ranges.json"
}

您从https://ip-ranges.amazonaws.com/ip-ranges.json获取的是描述AWS服务及其IP范围的JSON格式文件。
{
  "syncToken": "0123456789",
  "createDate": "yyyy-mm-dd-hh-mm-ss",
  "prefixes": [
    {
      "ip_prefix": "cidr",
      "region": "region",
      "service": "subset"
    }
  ],
  "ipv6_prefixes": [
    {
      "ipv6_prefix": "cidr",
      "region": "region",
      "service": "subset"
    }
  ]  
}

为了限制出站流量,请按照AWS文档中的说明向您的SG添加规则:
要使实例仅访问AWS服务,需创建一个安全组,并添加规则以允许对AMAZON列表中的CIDR块进行出站流量访问,但不包括EC2列表中也在其中的CIDR块。
有关详细信息和IP范围JSON格式,请参见Amazon通用文档中"实施出站控制"部分。

3

Amazon SQS是一种基于互联网的服务。要连接到Amazon SQS终端节点 (sqs.us-east-1.amazonaws.com),Amazon EC2实例需要访问互联网。

您的Amazon EC2实例位于私有子网中,这意味着它无法直接访问互联网。因此,您需要:

  • 在VPC的公共子网中使用NAT实例NAT网关
  • 与私有子网相关联的路由表,将面向互联网的流量路由到NAT实例或NAT网关

AWS SQS现在支持VPC端点:https://aws.amazon.com/about-aws/whats-new/2018/12/amazon-sqs-vpc-endpoints-aws-privatelink/ - undefined

2

这里有更新。现在VPC终端节点支持大多数AWS服务的终端节点。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接