我尝试通过cloudformation创建一个s3 bucket。我尝试使用regex ^([0-9a-z.-]){3,63}$,但它也接受模式“...”和“---”,根据新的s3命名约定,这是无效的。(参考:https://docs.aws.amazon.com/AmazonS3/latest/dev/BucketRestrictions.html)请帮帮忙?
我尝试通过cloudformation创建一个s3 bucket。我尝试使用regex ^([0-9a-z.-]){3,63}$,但它也接受模式“...”和“---”,根据新的s3命名约定,这是无效的。(参考:https://docs.aws.amazon.com/AmazonS3/latest/dev/BucketRestrictions.html)请帮帮忙?
9条答案
按热度按时间um6iljoc1#
答案
(?!(^xn--|.+-s3alias$))^[a-z0-9][a-z0-9-]{1,61}[a-z0-9]$
它确保了名称在所有情况下都有效-包括使用S3传输加速时。此外,由于它不包含任何反斜杠,因此在字符串上下文中使用起来更容易。
备选
如果您需要包含点的S3存储桶名称(并且您不使用S3传输加速),则可以使用以下名称:
(?!(^((2(5[0-5]|[0-4][0-9])|[01]?[0-9]{1,2})\.){3}(2(5[0-5]|[0-4][0-9])|[01]?[0-9]{1,2})$|^xn--|.+-s3alias$))^[a-z0-9][a-z0-9.-]{1,61}[a-z0-9]$
解释
截至2022年5月14日的Amazon S3 bucket naming rules为:
1.存储桶名称的长度必须介于3(最少)和63(最多)个字符之间。
1.存储桶名称只能由小写字母、数字、点(
.
)和连字符(-
)组成。1.存储桶名称必须以字母或数字开头和结尾。
1.存储桶名称不能格式化为IP地址(例如
192.168.5.4
)。1.存储桶名称不能以前缀
xn--
开头。1.存储桶名称不能以后缀
-s3alias
结尾。.
)。此正则表达式匹配所有规则(包括规则7):
(?!(^xn--|.+-s3alias$))^[a-z0-9][a-z0-9-]{1,61}[a-z0-9]$
第一个组
(?!(^xn--|-s3alias$))
是一个负前瞻,确保名称不以xn--
开头或以-s3alias
结尾(满足规则5和6)。表达式
^[a-z0-9][a-z0-9-]{1,61}[a-z0-9]$
的其余部分确保:^[a-z0-9]
)开头,并以小写字母或数字([a-z0-9]$
)结尾(规则3)。[a-z0-9-]{1,61}
)组成(规则2)。最后,我们不需要担心规则4(它禁止看起来像IP地址的名称),因为规则7通过禁止名称中的点隐含地涵盖了这一点。
如果您不使用Amazon S3 Transfer Acceleration,并且希望允许更复杂的存储桶名称,则可以使用以下更复杂的正则表达式:
(?!(^((2(5[0-5]|[0-4][0-9])|[01]?[0-9]{1,2})\.){3}(2(5[0-5]|[0-4][0-9])|[01]?[0-9]{1,2})$|^xn--|.+-s3alias$))^[a-z0-9][a-z0-9.-]{1,61}[a-z0-9]$
主要的变化是添加了匹配IPv4地址的表达式(虽然规范只是简单地说桶名不能格式化为IP地址,因为IPv6地址包含冒号,它们已经被规则2禁止了。)
lawou6xi2#
以下正则表达式满足AWS规范,前提是您不希望在存储桶名称中使用
.
(这是一个建议,否则无法启用传输加速):这一个很好,因为它允许合并到更复杂的检查中,只需用其他字符串替换
^
和$
,从而允许ARN检查等。编辑:根据@ryanjdillon的评论添加
-s3alias
排除vsikbqxv3#
我对Zak的回答做了一些修改,发现它有点太复杂了,并且忽略了有效的域名。下面是新的正则表达式(可以在regex101.com**上测试):
第一部分是负前瞻
(?!^(\d{1,3}\.){3}\d{1,3}$)
,它只匹配有效的IP地址,基本上,我们尝试匹配1-3个数字,然后是3次句点(\d{1,3}\.){3}
),然后是1-3个数字(\d{1,3}
)。第二部分规定名称必须以小写字母或数字开头(
^[a-z0-9]
),后跟重复0到多次的小写字母、数字或连字符([a-z0-9-]*
)。如果有句点,则必须后跟小写字母或数字((\.[a-z0-9])?
)。最后两种模式重复0到多次(([a-z0-9-]*(\.[a-z0-9])?)*
)。这个正则表达式不会强制执行AWS规定的长度限制(3-63个字符),这可以通过另一个正则表达式(
.{3,6}
)或检查字符串的长度来处理。**在这个链接上,我添加的一个测试失败了,但是如果你切换到测试区域并键入相同的模式,它就通过了。如果你将它复制/粘贴到终端中,它也能工作,所以我认为这是www.example.com端的一个bugregex101.com。
ljsrvy3e4#
S3存储桶名称的正则表达式:
t40tm48m5#
我使用了@Zak regex,但它不是100%正确。我使用this作为AWS bucket name的所有规则。我一步一步地进行验证,结果如下所示:
^.{3,63}$
[A-Z_]
^[a-z0-9]
^(\d+\.)+\d+$
。这比AWS更严格。if ".." in bucket_name:
中^(.*[a-z0-9]\.)*.*[a-z0-9]$
结尾7fyelxc56#
kfgdxczn7#
AWS发布了新的指导方针,其中'.'被认为是不推荐的,并且以'xn--'开头的存储桶名称现在被禁止(https://docs.aws.amazon.com/AmazonS3/latest/dev/BucketRestrictions.html)。如果您不允许'.',正则表达式将变得更加可读:
(?=^.{3,63}$)(?!xn--)([a-z0-9](?:[a-z0-9-]*)[a-z0-9])$
ddarikpa8#
我试着传递一个错误的桶名给API本身,看看它是如何验证的。看起来下面是API响应中返回的有效正则表达式模式。
存储桶名称必须与正则表达式匹配
或者是与正则表达式匹配的ARN
q7solyqu9#
名称必须符合DNS,因此您可以尝试:
参见:https://regexr.com/3psne
如果需要使用句点,请使用此选项:
参见:https://regexr.com/3psnb
最后,如果你想禁止两个连续的"非单词"字符,你可以使用:
参见:https://regexr.com/3psn8
基于:Regexp for subdomain