我有一个包含区域的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]
}
只是想知道这是否是正确的方法。
是否存在SQS URL在URL中具有与SQS所在区域不同的区域的情况?
我是否应该再添加一个要在服务中设置的环境变量?
答案 0 :(得分:3)
重要强>
在您的系统中,始终将整个队列URL完全存储为亚马逊 创建队列时,SQS会将其返回给您(例如, http://sqs.us-east-2.amazonaws.com/123456789012/queue2)。不要建立 每次需要时,来自其独立组件的队列URL 在请求中指定队列URL,因为Amazon SQS可以更改 组成队列URL的组件。
如上所述,无论出于何种原因,他们有时可能会在未来更改URL的结构。队列区域可能仍会在网址中某处,但不一定在您期望的位置。
所以,所有人都认为,我认为引入新的环境变量是正确的方法。
答案 1 :(得分:1)
是的,从队列URL中提取区域应该是完全安全的。
其他地方引用的documented recommendation 表示将解构队列网址放入其组件中是不安全的,而是建议不要从其组成部分构造队列URL。警告是存储整个URL。没有建议不要解析它。
在您的系统中,始终存储整个队列URL,就像Amazon SQS在您创建队列时将其返回给您一样
网址的主机名部分非常具有确定性,regional endpoints for SQS非常一致sqs.${region}.amazonaws.com
。
没有明显的理由不依赖主机名来确定区域。 AWS 很少更改端点主机名,并且在它们拥有的少数实例中,它使它们更具可预测性。与此同时,旧的仍然静静地存在 - 例如,the original endpoints,例如queue.amazonaws.com
和us-west-1.queue.amazonaws.com
仍处于活动状态,并且看起来功能齐全,即使这些已正式替换为{ {1}}。 AWS最近在端点约定方面更加一致和层次化,但在这样做时,它们并没有破坏这些值是硬编码的旧客户端。
答案 2 :(得分:1)
如果我理解正确,问题将询问是否可以从SQS URL中提取AWS区域...
一个简单的答案是是。但是,我不推荐。
首先,从保存在配置文件中的固定SQS URL中提取Region只是一项附加处理。由于该区域已经存储在Config文件中,因此我们也可以在Config文件中指定AWS区域,因为除非我们决定手动更改,否则我们工作的区域不会动态更改。如果您查看this documentation,则AWS区域通常会保存在配置文件中,以实现更好的可维护性。
第二,使用拆分从字符串中提取区域是不现实的。这就像试图破解事物以获取所需的东西一样。这不是一个好的编码习惯。
第三,您上面给出的是特定队列的AWS SQS端点。阅读this documentation并了解AWS端点的结构。 AWS终端并不总是在Sting结构内包含该区域。在AWS区域的配置文件中维护单独的参数始终是最佳实践。
某些服务(例如IAM)不支持区域;因此,他们的 端点不包含区域。某些服务,例如Amazon EC2, 让您指定不包含特定区域的端点, 例如https://ec2.amazonaws.com。在这种情况下,AWS路由 终点到us-east-1。