想象一下使用AWS服务的数百万客户。另外,想象一下这些客户已经创建了数百万个资源,比如Amazon EC2实例。如果所有这些资源没有边界,网络流量将能够在它们之间不受限制地流动。
Amazon Virtual Private Cloud (Amazon VPC)是一种网络服务,可以用来在AWS资源周围建立边界。
通过“Amazon VPC”,可以实现AWS云的隔离发放。在这个隔离的部分中,您可以启动您定义的虚拟网络中的资源。在VPC中,您可以将VPC中的资源划分为不同的子网。子网是VPC的一部分,可以包含Amazon EC2实例等资源。
当internet上的公网流量需要访问您的VPC时,您需要为VPC绑定internet网关。

internet网关是VPC与internet之间的网关。你可以把互联网网关想象成类似于顾客用来进入咖啡店的门口。在没有internet网关的情况下,用户不能访问VPC内的资源。
当您需要访问VPC中的私有资源时,可以使用虚拟私有网关。
下面是虚拟专用网关工作原理的一个例子。
你可以把互联网想象成你家和咖啡店之间的路。假设你在这条路上,有一个保镖保护你。您仍然使用与其他客户相同的道路,但有一个额外的保护层。
保镖就像一个虚拟专用网络(VPN)连接,它加密(或保护)您的互联网流量不受周围所有其他请求的影响。
虚拟私有网关是允许受保护的internet流量进入VPC的组件。即使你和咖啡店的连接有额外的保护,交通堵塞也是可能的,因为你和其他顾客使用同一条路。

虚拟私有网关用于在VPC和私有网络(如本地数据中心、企业内部网络)之间建立VPN连接。虚拟私有网关只允许来自审批通过的网络的流量进入VPC。
AWS Direct Connect是一项服务,用于在自己的数据中心和VPC之间建立专用的私有连接。
假设有一幢公寓楼,有一条走廊直接连接到咖啡馆。只有公寓大楼的居民才能通过这条走廊。
此私人走廊提供与AWS直接连接相同类型的专用连接。居民不需要与其他顾客共用公共道路就可以进入咖啡店。

AWS Direct Connect提供的私有连接可以帮助您降低网络成本,并增加可以通过网络传输的带宽量。
要了解子网在VPC中的作用,请参考咖啡店中的示例。
首先,顾客把他们的订单交给收银员。然后收银员把菜单传给咖啡师。这个过程使线路在更多顾客进来时保持平稳运行。
假设一些顾客试图跳过收银台,直接把他们的订单给咖啡师。这扰乱了流量,导致顾客进入咖啡店的一部分,这是限制他们。

为了解决这个问题,咖啡店的老板通过将收银员和咖啡师放在不同的工作站来划分柜台区域。收银台面向公众,设计用于接待顾客。咖啡师的区域是私密的。咖啡师仍然可以接受收银员的订单,但不能直接接受顾客的订单。

这类似于如何使用AWS网络服务来隔离资源并准确确定网络流量如何流动。
在咖啡店中,您可以将柜台区域看作VPC。柜台区分为两个独立的区域,分别是收银员工作站和咖啡师工作站。在VPC中,子网是一个独立的区域,用于将不同的资源组合在一起。
子网是VPC的一部分,可以根据安全需要或操作需要对VPC中的资源进行分组。子网分为公有子网和私有子网。
在VPC中,子网之间可以互通。例如,您可能有一个应用程序,它涉及公共子网中的Amazon EC2实例,与位于私有子网中的数据库通信。

当客户从AWS Cloud中托管的应用程序请求数据时,该请求将作为数据包发送。数据包是通过因特网或网络发送的数据单位。
通过internet网关进入VPC。在报文进入或退出子网之前,它会检查是否有权限。这些权限指示谁发送了数据包,以及数据包如何试图与子网中的资源通信。
VPC中的ACL (network access control list)组件用于检查子网的报文权限。
ACL (network access control list)是一种虚拟防火墙,在子网级别控制流量的进出。
例如,走出咖啡店,想象你在机场。在机场,旅客正试图进入一个不同的国家。您可以将旅行者看作信息包,而将护照控制官员看作网络ACL。当旅客进出该国时,护照检查人员要检查他们的证件。如果旅客在批准的名单上,他们就可以通过。然而,如果他们不在批准的名单上或明确在禁止入境的名单上,他们就不能入境。
个AWS帐户都有一个默认的网络ACL。在配置VPC时,可以使用帐号默认的网络ACL,也可以自定义创建网络ACL。
默认情况下,您的帐户的默认网络ACL允许所有入站和出站流量,但您可以通过添加自己的规则来修改它。对于自定义网络acl,所有入站和出站流量都会被拒绝,直到您添加规则来指定允许哪些流量为止。此外,所有的网络acl都有一个显式的拒绝规则。该规则确保如果报文没有匹配列表中的任何其他规则,该报文将被拒绝。

网络ACLs是一种无状态的包过滤。它们什么都不记得,并检查各个方向跨越子网边界的包:入站和出站。
回想一下前面的例子,一个旅行者想要进入一个不同的国家。这类似于从Amazon EC2实例向internet发送请求。
当对该请求的包响应返回到子网时,网络ACL不记得您之前的请求。网络ACL根据它的规则列表检查数据包的响应,以决定是允许还是拒绝。

包进入子网后,必须对子网内的资源(如Amazon EC2实例)评估其权限。
为Amazon EC2实例检查报文权限的VPC组件称为安全组。
安全组是一个虚拟防火墙,用于控制Amazon EC2实例的入站和出站流量。
缺省情况下,安全组拒绝所有入方向的流量,允许所有出方向的流量。您可以添加自定义规则来配置允许或拒绝哪些流量。
对于本例,假设您在一栋公寓楼中,有一个在大厅迎接客人的门卫。您可以把客人看作小包,把门房看作一个安全组。当客人到达时,门服务员检查名单以确保他们能进入大楼。然而,当客人离开大楼时,门服务员不会再检查名单。
如果在一个子网中有多个Amazon EC2实例,可以将它们与相同的安全组关联起来,或者为每个实例使用不同的安全组。

安全组执行有状态包过滤。它们记住以前为传入数据包所做的决定。
考虑从Amazon EC2实例向internet发送请求的相同示例。
当对该请求的包响应返回到实例时,安全组将记住您之前的请求。无论入站安全组规则如何,安全组都允许响应继续进行。

通过使用网络acl和安全组,可以对VPC中的流量设置自定义规则。随着您继续学习有关AWS安全和组网的更多信息,请确保理解网络acl和安全组之间的区别。

假设AnyCompany在AWS云上托管了一个网站。客户在浏览器中输入网址,就可以访问该网站。这是因为域名系统(DNS)的解析。DNS解析涉及客户DNS解析器与公司DNS服务器之间的通信。
你可以把DNS看作是互联网上的电话簿。DNS解析是将域名转换为IP地址的过程。

例如,假设您想访问AnyCompany的网站:
Amazon Route 53是一个DNS web服务。它为开发者和企业提供了一种可靠的方式,将终端用户路由到托管在AWS中的互联网应用程序。
Amazon Route 53将用户请求连接到运行在AWS中的基础设施(比如Amazon EC2实例和负载均衡器)。它可以将用户路由到AWS之外的基础设施。
Route 53的另一个特性是能够管理域名的DNS记录。你可以直接在Route 53中注册新的域名。您也可以为其他域名注册商管理的已有域名传递DNS记录。这使您能够在一个位置管理您的所有域名。
在上一个模块中,您了解了内容交付服务Amazon CloudFront。下面的例子描述了Route 53和Amazon CloudFront如何一起向客户交付内容。
例如:Amazon Route 53和Amazon CloudFront如何提供内容

假设AnyCompany的应用程序运行在几个Amazon EC2实例上。这些实例位于附加到应用程序负载均衡器的自动伸缩组中。
假设我做了一个模块如下:m=Module.newdoclassCendend三个问题:除了对m的引用之外,还有什么方法可以访问C和m中的其他内容?我可以在创建匿名模块后为其命名吗(就像我输入“module...”一样)?如何在使用完匿名模块后将其删除,使其定义的常量不再存在? 最佳答案 三个答案:是的,使用ObjectSpace.此代码使c引用你的类(class)C不引用m:c=nilObjectSpace.each_object{|obj|c=objif(Class===objandobj.name=~/::C$/)}当然这取决于
作为我的Rails应用程序的一部分,我编写了一个小导入程序,它从我们的LDAP系统中吸取数据并将其塞入一个用户表中。不幸的是,与LDAP相关的代码在遍历我们的32K用户时泄漏了大量内存,我一直无法弄清楚如何解决这个问题。这个问题似乎在某种程度上与LDAP库有关,因为当我删除对LDAP内容的调用时,内存使用情况会很好地稳定下来。此外,不断增加的对象是Net::BER::BerIdentifiedString和Net::BER::BerIdentifiedArray,它们都是LDAP库的一部分。当我运行导入时,内存使用量最终达到超过1GB的峰值。如果问题存在,我需要找到一些方法来更正我的代
我有一个包含模块的模型。我想在模块中覆盖模型的访问器方法。例如:classBlah这显然行不通。有什么想法可以实现吗? 最佳答案 您的代码看起来是正确的。我们正在毫无困难地使用这个确切的模式。如果我没记错的话,Rails使用#method_missing作为属性setter,因此您的模块将优先,阻止ActiveRecord的setter。如果您正在使用ActiveSupport::Concern(参见thisblogpost),那么您的实例方法需要进入一个特殊的模块:classBlah
我正在编写一个小脚本来定位aws存储桶中的特定文件,并创建一个临时验证的url以发送给同事。(理想情况下,这将创建类似于在控制台上右键单击存储桶中的文件并复制链接地址的结果)。我研究过回形针,它似乎不符合这个标准,但我可能只是不知道它的全部功能。我尝试了以下方法:defauthenticated_url(file_name,bucket)AWS::S3::S3Object.url_for(file_name,bucket,:secure=>true,:expires=>20*60)end产生这种类型的结果:...-1.amazonaws.com/file_path/file.zip.A
我发现ActiveRecord::Base.transaction在复杂方法中非常有效。我想知道是否可以在如下事务中从AWSS3上传/删除文件:S3Object.transactiondo#writeintofiles#raiseanexceptionend引发异常后,每个操作都应在S3上回滚。S3Object这可能吗?? 最佳答案 虽然S3API具有批量删除功能,但它不支持事务,因为每个删除操作都可以独立于其他操作成功/失败。该API不提供任何批量上传功能(通过PUT或POST),因此每个上传操作都是通过一个独立的API调用完成的
我刚刚被困在这个问题上一段时间了。以这个基地为例:moduleTopclassTestendmoduleFooendend稍后,我可以通过这样做在Foo中定义扩展Test的类:moduleTopmoduleFooclassSomeTest但是,如果我尝试通过使用::指定模块来最小化缩进:moduleTop::FooclassFailure这失败了:NameError:uninitializedconstantTop::Foo::Test这是一个错误,还是仅仅是Ruby解析变量名的方式的逻辑结果? 最佳答案 Isthisabug,or
我想获取模块中定义的所有常量的值:moduleLettersA='apple'.freezeB='boy'.freezeendconstants给了我常量的名字:Letters.constants(false)#=>[:A,:B]如何获取它们的值的数组,即["apple","boy"]? 最佳答案 为了做到这一点,请使用mapLetters.constants(false).map&Letters.method(:const_get)这将返回["a","b"]第二种方式:Letters.constants(false).map{|c
我的假设是moduleAmoduleBendend和moduleA::Bend是一样的。我能够从thisblog找到解决方案,thisSOthread和andthisSOthread.为什么以及什么时候应该更喜欢紧凑语法A::B而不是另一个,因为它显然有一个缺点?我有一种直觉,它可能与性能有关,因为在更多命名空间中查找常量需要更多计算。但是我无法通过对普通类进行基准测试来验证这一点。 最佳答案 这两种写作方法经常被混淆。首先要说的是,据我所知,没有可衡量的性能差异。(在下面的书面示例中不断查找)最明显的区别,可能也是最著名的,是你的
我想在Ruby中创建一个用于开发目的的极其简单的Web服务器(不,不想使用现成的解决方案)。代码如下:#!/usr/bin/rubyrequire'socket'server=TCPServer.new('127.0.0.1',8080)whileconnection=server.acceptheaders=[]length=0whileline=connection.getsheaders想法是从命令行运行这个脚本,提供另一个脚本,它将在其标准输入上获取请求,并在其标准输出上返回完整的响应。到目前为止一切顺利,但事实证明这真的很脆弱,因为它在第二个请求上中断并出现错误:/usr/b
我一直致力于让我们的Rails2.3.8应用程序在JRuby下正确运行。一切正常,直到我启用config.threadsafe!以实现JRuby提供的并发性。这导致lib/中的模块和类不再自动加载。使用config.threadsafe!启用:$rubyscript/runner-eproduction'pSim::Sim200Provisioner'/Users/amchale/.rvm/gems/jruby-1.5.1@web-services/gems/activesupport-2.3.8/lib/active_support/dependencies.rb:105:in`co