AWS Prefix实际上是什么?

19

问题

AWS Prefix的定义在哪里?

背景

在寻找列出S3终端节点CIDR的方法时,遇到了AWS前缀列表(prefix list)这个词,但不确定它究竟意味着什么以及该术语的定义在哪里。

困惑

Prefix的意思是放在前面的单词。对于S3来说,根据使用前缀和分隔符按层次列出键,应该是对象的起始路径。

然而,显然它指的是IP地址范围。为什么prefix用于IP范围?历史或原因是什么?

Terraform aws_prefix_list

这既可以用于验证变量中给定的前缀列表,也可以用于获取相关AWS服务的CIDR块(IP地址范围)。

describe-prefix-lists

以前缀列表格式描述可用的AWS服务,其中包括服务的前缀列表名称和前缀列表ID以及服务的IP地址范围。

AWS IP地址范围

SERVICE="S3"
REGION="us-west-1"
$ curl -s https://ip-ranges.amazonaws.com/ip-ranges.json | \
  jq -r --arg SERVICE "$SERVICE" --arg REGION "${REGION}" '.prefixes[] \
   | select(.service==$SERVICE and .region==$REGION)'

{
  "ip_prefix": "52.92.48.0/22",
  "region": "us-west-1",
  "service": "S3"
}
{
  "ip_prefix": "54.231.232.0/21",
  "region": "us-west-1",
  "service": "S3"
}
{
  "ip_prefix": "52.219.20.0/22",
  "region": "us-west-1",
  "service": "S3"
}
{
  "ip_prefix": "52.219.24.0/21",
  "region": "us-west-1",
  "service": "S3"
}

更新

网关 VPC 终端节点

指定要创建终端节点的 VPC 和要连接的服务。 服务由前缀列表标识-区域内服务的名称和 ID。前缀列表 ID 使用形式 pl-xxxxxxx,前缀列表名称使用形式“com.amazonaws.region.service”。使用前缀列表名称(服务名称)创建终端节点。

什么是前缀的意义?

假设您有一个网络,例如10.5.10.0/24,则该子网中的前缀为10.5.10,从1到255,并且您的网络地址将为10.5.10.0

我认为 (10.0.0.0/24) 的意思是一个拥有 254 个 IP 地址(从 1 到 254,其中 0 是网络地址,255 是广播地址)的网络的 32 位 IP 中的前 24 位部分。前缀是前 24 位,后缀(?)是后 8 位。用于标识网络的前 N 位 IP 列表是 IP 前缀列表。


"前缀"意味着一个放在前面的单词。请注意,这里的“前缀”确实是一个单词——一个长度为n位的二进制单词。 - Michael - sqlbot
5个回答

10

前缀列表一词来自路由技术。CIDR格式的IP地址具有IP前缀和网络前缀(10.1.0.0/16)。IP前缀为10.1,网络前缀为/16。

因此,如果您使用CIDR格式的IP地址列表,我们称之为IP前缀列表。


谢谢你的回答。我想JSON中的“ip_prefix”字段实际上并不是一个前缀,但我现在明白了。 - mon
2
如果格式为“192.168.0.0/16”,那么它就是前缀列表。在这个例子中,“192.168”是IP前缀。另一个例子是“192.168.10.14/32”。IP前缀是“192.168.10.14”。一开始看起来很奇怪,但你很快就能够不加思考地阅读它们。 - John Hanley

10

如果你正在寻找像dynamodb/s3这样的vpc终端点的前缀列表ID,那么它与IP或CIDR无关。正如文档中所述:

为了创建一个允许来自VPC的流量通过网关VPC终端点访问AWS服务的出站安全组规则,需要一个前缀列表ID。

因此,如果在EC2或VPC Lambda的安全组出站规则中没有前缀列表ID,则连接到dynamodb或s3时会超时。

您可以运行以下命令获取前缀列表:

aws ec2 describe-prefix-lists

{
    "PrefixLists": [
        {
            "Cidrs": [
                "54.231.0.0/17",
                "52.216.0.0/15"
            ],
            "PrefixListId": "pl-63c5400k",
            "PrefixListName": "com.amazonaws.us-east-1.s3"
        },
        {
            "Cidrs": [
                "52.94.0.0/22",
                "52.119.224.0/20"
            ],
            "PrefixListId": "pl-02ad2a6c",
            "PrefixListName": "com.amazonaws.us-east-1.dynamodb"
        }
    ]
}

然后您可以通过 AWS 网页控制台将此 PrefixListId 放入安全组出站规则中。如果您在使用 Terraform 部署到不同的区域,它可能是这样的:

resource "aws_security_group_rule" "MyService_to_DynamoDB_east" {
  count = "${ lower(var.region) == "us-east-1" ? 1 : 0 }"

  security_group_id = "${aws_security_group.MyService_Ext_Api.id}"
  description       = "DynamoDB"
  type              = "egress"
  protocol          = "tcp"
  from_port         = 443
  to_port           = 443
  prefix_list_ids    = ["pl-02ad2a6c"]
}

resource "aws_security_group_rule" "MyService_to_DynamoDB_west" {
  count = "${ lower(var.region) == "us-west-2" ? 1 : 0 }"

  security_group_id = "${aws_security_group.MyService_Ext_Api.id}"
  description       = "DynamoDB"
  type              = "egress"
  protocol          = "tcp"
  from_port         = 443
  to_port           = 443
  prefix_list_ids    = ["pl-0ca54061"]
}

AWS会自动为每个区域提供S3和DynamoDB的预设前缀列表,但您也可以自己创建。 - singh1469

3

AWS VPC上的前缀列表是什么

前缀列表是以CIDR格式分配给区域中的VPC网关端点(S3或DynamoDB)的IP范围。它是区域特定的。

例如,截至2020年2月24日,us-east-2地区DynamoDB的前缀列表为“52.94.4.0/24”,其中52.94.4 是IP前缀,网络前缀为/24,由@John Hanley解释。 DynamoDB的VPC网关端点可以使用的IP地址在52.94.4.1-52.94.4.254之间(AWS可能保留了一些IP地址)。

$ aws ec2 describe-prefix-lists
{
    "PrefixLists": [
        {
            "Cidrs": [
                "52.94.4.0/24"
            ],
            "PrefixListId": "pl-4ca54025",
            "PrefixListName": "com.amazonaws.us-east-2.dynamodb"
        },
        {
            "Cidrs": [
                "52.219.80.0/20",
                "3.5.128.0/22",
                "3.5.132.0/23",
                "52.219.96.0/20",
                "52.92.76.0/22"
            ],
            "PrefixListId": "pl-7ba54012",
            "PrefixListName": "com.amazonaws.us-east-2.s3"
        }
    ]
}

这些前缀列表都有一个ID和名称。我们可以在VPC路由表和安全组中指定前缀列表ID,但不能在NACL中使用。我们需要使用CIDR来代替。

enter image description here

  • 网关 VPC 端点

    不能在网络 ACL 的出站规则中使用前缀列表 ID 来允许或拒绝对端点中指定的服务的出站流量。如果您的网络 ACL 规则限制了流量,则必须指定该服务的 CIDR 块(IP 地址范围)。但是,您可以在出站安全组规则中使用前缀列表 ID。有关更多信息,请参阅安全组。

Terraform 示例

NACL

resource "aws_vpc_endpoint" "private_s3" {
  vpc_id       = "${aws_vpc.foo.id}"
  service_name = "com.amazonaws.us-west-2.s3"
}

data "aws_prefix_list" "private_s3" {
  prefix_list_id = "${aws_vpc_endpoint.private_s3.prefix_list_id}"
}

resource "aws_network_acl" "bar" {
  vpc_id = "${aws_vpc.foo.id}"
}

resource "aws_network_acl_rule" "private_s3" {
  network_acl_id = "${aws_network_acl.bar.id}"
  rule_number    = 200
  egress         = false
  protocol       = "tcp"
  rule_action    = "allow"
  cidr_block     = "${data.aws_prefix_list.private_s3.cidr_blocks[0]}"
  from_port      = 443
  to_port        = 443
}

安全组由@LeOn - Han Li在他的答案中提供。

resource "aws_security_group_rule" "MyService_to_DynamoDB_east" {
  count = "${ lower(var.region) == "us-east-1" ? 1 : 0 }"

  security_group_id = "${aws_security_group.MyService_Ext_Api.id}"
  description       = "DynamoDB"
  type              = "egress"
  protocol          = "tcp"
  from_port         = 443
  to_port           = 443
  prefix_list_ids    = ["pl-02ad2a6c"]
}

resource "aws_security_group_rule" "MyService_to_DynamoDB_west" {
  count = "${ lower(var.region) == "us-west-2" ? 1 : 0 }"

  security_group_id = "${aws_security_group.MyService_Ext_Api.id}"
  description       = "DynamoDB"
  type              = "egress"
  protocol          = "tcp"
  from_port         = 443
  to_port           = 443
  prefix_list_ids    = ["pl-0ca54061"]
}

访问控制

为什么我无法使用网关VPC端点连接到S3存储桶?提供了有关S3 VPC网关端点的全面列表,其中前缀列表ID和CIDR将发挥作用。

  • VPC中的DNS设置
    重要提示:必须在您的VPC中启用DNS解析(请参阅网关端点限制)。如果您正在使用自己的DNS服务器,请确保向AWS服务的DNS请求解析为由AWS维护的IP地址。
  • 到Amazon S3的路由表设置
  • 安全组出站规则
  • 网络ACL规则
  • 网关VPC端点策略
  • S3存储桶策略
  • IAM策略

参考资料

  • 网关 VPC 终端节点

    指定要创建终端节点的 VPC,以及要连接到的服务。服务由前缀列表标识—区域中服务的名称和 ID。前缀列表 ID 使用 pl-xxxxxxx 的格式,前缀列表名称使用 "com.amazonaws.region.service" 的格式。使用前缀列表名称(服务名称)创建终端节点。


0
一个由AWS管理的前缀列表是一种在AWS安全组中添加单个规则的方式,该规则代表该服务的所有IP范围,而无需在此处输入每个单独的AWS IP范围。

https://ip-ranges.amazonaws.com/ip-ranges.json

例如,如果您想要提供对S3的出站访问,您必须在JSON IP范围列表中输入每个IP范围以访问S3(或者如果您限制访问到单个区域,则输入该区域中的IP范围)。
使用前缀列表,您可以在安全组中创建规则并将前缀列表分配为目标。
您还可以为自己的IP范围列表创建自己管理的前缀列表。我刚刚在我的Medium Cloud-Security博客上写了一篇关于如何做到这一点的文章。

0
尽管关于VPC前缀定义的问题已经得到了回答,但我没有看到与S3相关的前缀定义的答案(除了CIDR相关的)。简单地说,在S3中,如果您有一个名为Photos的文件夹,并且其中有一个名为yourpic.jpg的文件,则它应该看起来像这样photos/yourpic.jpg。在S3术语中,文件夹photos/的部分称为前缀。正如最新的AWS S3性能调整指南中所提到的,我们可以使用前缀来进行并行处理并提高性能。无论如何,我仍在学习AWS,所以请谨慎对待。请参考下面的链接。

https://docs.aws.amazon.com/AmazonS3/latest/user-guide/using-folders.html


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