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

时间:2017-05-24 11:06:25

标签: amazon-ec2 amazon-sqs

我看到的错误是:无法执行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

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

我们知道如何做到这一点吗?

3 个答案:

答案 0 :(得分:2)

正如John所说,AWS API是公共端点(例外是VPC Endpoints,它们是VPC专用端点,目前仅适用于S3和DynamoDB)。从私有子网,您需要NAT来访问这些公共端点。

但是,为了限制从您的实例访问 AWS服务,您需要配置安全组的出口规则。

亚马逊为其端点发布IP-Ranges,并允许您订阅更改通知:

每当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格式,请参阅"Implementing Egress Control" in Amazon's general documentation

部分

答案 1 :(得分:1)

Amazon SQS是一项基于互联网的服务。要连接到Amazon SQS Endpointsqs.us-east-1.amazonaws.com),Amazon EC2实例需要访问Internet。

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

  • VPC公共子网中的NAT InstanceNAT Gateway
  • 与私有子网关联的路由表,用于将Internet绑定的流量路由到NAT实例或NAT网关

答案 2 :(得分:0)

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