我有一个SQS URL,其中也包括区域。我正在使用官方的 Go SDK 在此 SQS 上执行操作,这需要 AWS 区域来初始化会话。目前,我已经编写了一个实用程序函数来解析 URL 并返回 AWS 区域。
示例网址:https://sqs.us-east-1.amazonaws.com/774557911234/my_sqs_name
初始化代码示例:
sess, err := session.NewSession()
if err != nil {
return
}
s := sqs.New(sess, aws.NewConfig().WithRegion(getRegionFromSQSURL(config.SQSURL))
从 URL 获取区域的示例函数
func getRegionFromSQSURL(url string) string {
return strings.Split(url, ".")[1]
}
只是想知道这是否是正确的方法。
是否存在 SQSURL 中的区域与 SQS 所在的区域不同的情况?
我是否应该再添加一个要在服务中设置的环境变量?
引自此处:https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-queue-message-identifiers.html
重要
在您的系统中,始终像亚马逊一样存储整个队列 URL SQS 会在您创建队列时将其返回给您(例如, http://sqs.us-east-2.amazonaws.com/123456789012/queue2)。不构建 每次需要时,其单独组件中的队列 URL 在请求中指定队列 URL,因为 Amazon SQS 可以更改 组成队列 URL 的组件。
如前所述,无论出于何种原因,他们有时都可以在将来更改 URL 的结构。队列区域可能仍会保留在 url 中的某个位置,但不一定位于您期望的位置。
所以,考虑到所有的想法,我认为引入新的环境变量是正确的方法。
是的,从队列 URL 中提取区域应该是完全安全的。
其他地方引用的文档建议并没有说将队列 URL解构为其组件是不安全的,而是建议不要从其组件部分构造队列 URL。 告诫是存储整个 URL。 没有建议根本不解析它。
在您的系统中,始终按照 Amazon SQS 在您创建队列时返回给您的方式存储整个队列 URL
URL 的主机名部分非常确定,并且 SQS 的区域终端节点非常一致地sqs.${region}.amazonaws.com
。
没有明显的理由不依赖主机名来确定区域。 AWS很少更改终端节点主机名,在少数情况下,这是为了让它们更可预测。 同时,旧的端点仍然悄悄地存在——例如,原始端点(如queue.amazonaws.com
和us-west-1.queue.amazonaws.com
)仍然处于活动状态,并且似乎功能齐全,即使它们被sqs.us-[east | west]-1.amazonaws.com
正式取代。 AWS 最近在终端节点约定方面更加一致和分层,但在这样做的过程中,它们并没有破坏这些值是硬编码的旧客户端。
如果我理解正确,问题会问是否可以从 SQS URL 中提取 AWS 区域......
一个简单的答案是肯定的。但我不建议这样做。
首先,从保存在配置文件中的固定 SQS URL 中提取区域只是一个额外的处理。由于它已经存储在配置文件中,因此我们也可以在配置文件中指定 AWS 区域,因为我们工作的区域不会动态更改,除非我们决定手动更改它。如果您查看此文档,AWS 区域通常保存在配置文件中,以便更好地维护。
其次,使用拆分从字符串中提取区域是不可信的。这就像试图破解事物以获得您需要的东西。这不是一个好的编码实践。
第三,您上面给出的是特定队列的 AWS SQS 终端节点。阅读本文档并了解 AWS 终端节点的结构。AWS 终端节点并不总是包含 Sting 结构中的区域。最佳实践始终是在 AWS 区域的配置文件中维护单独的参数。
某些服务(如 IAM)不支持区域;因此,它们 终端节点不包含区域。某些服务,例如 Amazon EC2, 允许您指定不包含特定区域的终端节点, 例如,https://ec2.amazonaws.com。在这种情况下,AWS 会路由 端点到美国东部 1。