可以从 SQS url 获取 AWS 区域吗?

Is it okay to fetch AWS region from SQS url?

我有一个 SQS URL,其中也包括区域。我正在使用官方 Go SDK 在此 SQS 上执行操作,这需要 AWS 区域来初始化会话。目前,我已经编写了一个实用函数来解析 URL 和 return AWS 区域。

示例 URL: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]
}

只是想知道这是否是正确的方法。

是否会出现 SQS URL 在 URL 中与 SQS 存在的区域不同的情况?

我是否应该在服务中再添加一个环境变量来设置?

引自此处:https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-queue-message-identifiers.html

Important

In your system, always store the entire queue URL exactly as Amazon SQS returns it to you when you create the queue (for example, http://sqs.us-east-2.amazonaws.com/123456789012/queue2). Don't build the queue URL from its separate components each time you need to specify the queue URL in a request because Amazon SQS can change the components that make up the queue URL.

如前所述,他们有时可以出于任何原因更改 URL 的结构。队列区域可能仍会停留在 url 中的 某处 ,但不一定在您期望的位置。

所以,综合考虑,我认为引入新的环境变量是正确的做法。

是的,从队列中提取区域应该是绝对安全的URL。

其他地方引用的documented recommendation没有解构队列是不安全的URL 到其组件中,而是建议不要从其组件中 构造 队列 URL。告诫是存储整个URL。没有建议完全不解析它。

In your system, always store the entire queue URL exactly as Amazon SQS returns it to you when you create the queue

URL 的主机名部分非常确定,regional endpoints for SQS 非常一致 sqs.${region}.amazonaws.com

没有明显的理由依靠主机名来确定区域。 AWS 很少 更改端点主机名,在少数情况下,它是为了让它们更可预测。与此同时,旧的仍然安静地存在——例如,the original endpoints,例如 queue.amazonaws.comus-west-1.queue.amazonaws.com 仍然活跃并且看起来功能齐全,即使它们已被正式取代 sqs.us-[east | west]-1.amazonaws.com。 AWS 最近与端点约定更加一致和分层,但这样做并没有破坏这些值是硬编码的旧客户端。

如果我没理解错的话,问题是从 SQS 中提取 AWS 区域是否可以 URL...

一个简单的答案是肯定的。但是我不推荐这个。

首先,从保存在配置文件中的固定SQS URL中提取Region只是一个额外的处理。由于它已经存储在 Config 文件中,我们也可以在 Config 文件中指定 AWS 区域,因为我们工作的区域不会动态更改,除非我们决定手动更改它。如果您查看 this documentation,AWS 区域通常保存在配置文件中以便更好地维护。

其次,使用拆分从字符串中提取区域是难以置信的。这就像试图破解周围的东西以获得你需要的东西。这不是一个好的编码习惯。

第三,您在上面给出的是特定队列的 AWS SQS 端点。阅读 this documentation 并了解 AWS 端点的结构。 AWS 端点并不总是在 Sting 结构中包含区域。在 AWS 区域的配置文件中维护一个单独的参数始终是最佳实践。

Some services, such as IAM, do not support regions; therefore, their endpoints do not include a region. Some services, such as Amazon EC2, let you specify an endpoint that does not include a specific region, for example, https://ec2.amazonaws.com. In that case, AWS routes the endpoint to us-east-1.