从SQS网址获取AWS区域是否可以?

时间:2018-01-23 09:33:10

标签: amazon-web-services go amazon-sqs aws-regions

我有一个包含区域的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所在区域不同的区域的情况?

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

3 个答案:

答案 0 :(得分:3)

从这里引用: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的结构。队列区域可能仍会在网址中某处,但不一定在您期望的位置。

所以,所有人都认为,我认为引入新的环境变量是正确的方法。

答案 1 :(得分:1)

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

其他地方引用的documented recommendation 表示将解构队列网址放入其组件中是不安全的,而是建议不要从其组成部分构造队列URL。警告是存储整个URL。没有建议不要解析它。

  

在您的系统中,始终存储整个队列URL,就像Amazon SQS在您创建队列时将其返回给您一样

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

没有明显的理由依赖主机名来确定区域。 AWS 很少更改端点主机名,并且在它们拥有的少数实例中,它使它们更具可预测性。与此同时,旧的仍然静静地存在 - 例如,the original endpoints,例如queue.amazonaws.comus-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。