如果我有一个正在运行的 VPC,并且一些服务器位于该网络的私有部分,通过从 amazon s3 下载文件进行后端处理,我可以从内部访问 S3 来获取这些文件吗?还是我必须通过 NAT 访问公共互联网,通过 https 下载 s3 文件,然后以这种方式进行处理?
答案1
有了“互联网”这样的用户名,我以为你会知道这一点。但既然你问了……
:)
VPC 是确实私有。只有您明确允许的流量才可以穿越 VPC 的边界。
因此,在 VPC 内部,需要访问外部资源的实例要么需要分配一个 EIP(在这种情况下,它们可以使用 AWS 的基础设施访问外部资源),要么您需要提供一个 NAT 主机(在这种情况下,所有流量都通过您自己的 NAT 从 VPC 流出)。
如果您选择提供自己的 NAT 主机,请记住您需要禁用该实例上的源/目标检查,以及向您的私有子网添加指向 NAT 主机的默认路由。
更新(2015-05-10): 截至 2015 年 5 月 11 日,AWS 已发布S3 的“VPC 端点”,允许直接从 VPC 访问 S3,而无需通过代理主机或 NAT 实例。幸运的是,出于对 VPC 真正私有性的尊重,此功能默认处于关闭状态,但可以使用 AWS 控制台或通过其 API 轻松打开。
答案2
如果您的实例位于 VPC 的公共子网中,则:
- 您应该为您的实例分配公共 IP 地址
- 或者您应该为您的实例分配弹性 IP
如果您的实例位于 VPC 的私有子网中,则:
- 您需要在公共子网中运行 NAT 设备。这样 VPC 私有子网中的实例就可以通过 NAT 访问互联网并访问 S3。您可以使用 AWS VPC NAT,也可以配置自己的 NAT(如果您想设置自己的 NAT,请谷歌搜索)
底线是,要访问 S3,您必须能够访问互联网。
答案3
您应该使用 VPC 中的端点来实现此目的为 Amazon S3 创建 VPC 端点
打开 Amazon VPC 控制台。
使用导航栏中的区域选择器,将 AWS 区域设置为与您的 VPC 相同的区域。
从导航窗格中,选择终端节点。
选择创建终端节点。
对于服务类别,验证是否选择了“AWS 服务”。
对于服务名称,选择“s3”服务名称和“网关”类型。例如,美国东部(弗吉尼亚北部)区域的服务名称为 com.amazonaws.us-east-1.s3。 参考:此屏幕截图,如果您对此步骤感到困惑
对于 VPC,选择您的 VPC(您的私有子网所在的 VPC)。
对于配置路由表,请根据您想要从中访问终端节点的关联子网选择路由表。
对于策略,验证是否选择了“完全访问”。
选择创建终端节点。
记下 VPC 端点 ID。您将需要此端点 ID 来完成后续步骤。
更新您的存储桶策略,添加一个条件,当请求来自您创建的 VPC 终端节点时,允许用户访问 S3 存储桶。
要允许这些用户下载对象(s3:GetObject),请使用如下存储桶策略:
{
"Version": "2012-10-17",
"Id": "Policy1415115909152",
"Statement": [
{
"Sid": "Access-to-specific-VPCE-only",
"Principal": "*",
"Action": "s3:GetObject",
"Effect": "Allow",
"Resource": ["arn:aws:s3:::DOC-EXAMPLE-BUCKET/*"],
"Condition": {
"StringEquals": {
"aws:sourceVpce": "vpce-1a2b3c4d"
}
}
}
]
}
对于 aws:sourceVpce 的值,请确保输入您之前创建的终端节点的 VPC 终端节点 ID。
答案4
您无需“出去”和“回来”,也无需更改在 AWS 区域内传输数据的方式。传输到/从存储桶无需付费在同一地区。您确实需要支付存储费用。