I have an SQS URL which includes region as well. I am using official Go SDK to perform operations on this SQS which require AWS region to initialize the session. Currently, I have written a utility function to parse the URL and return AWS region.
Sample URL: https://sqs.us-east-1.amazonaws.com/774557911234/my_sqs_name
Sample Initialization code:
sess, err := session.NewSession()
if err != nil {
return
}
s := sqs.New(sess, aws.NewConfig().WithRegion(getRegionFromSQSURL(config.SQSURL))
Sample function to get region from URL
func getRegionFromSQSURL(url string) string {
return strings.Split(url, ".")[1]
}
Just wondering if this is the correct approach.
Would there be any case where SQS URL will have a different region in URL than the region in which SQS exists?
Should I just add one more environment variable to be set in the service?
Cited from here: 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.
As explained, they can change the structure of the URL sometimes in the future for whatever reason. Queue region will probably still stay somewhere in the url, but not necessarily in the spot that you expect it to be.
So, all thinks considered, I think that introducing new environment variable is the right way to go.
Yes, it should be perfectly safe to extract the region from the queue URL.
The documented recommendation cited elsewhere does not say that it isn't safe to deconstruct a queue URL into its components, but rather recommends against constructing a queue URL from its component parts. The admonition is to store the entire URL. There is no recommendation not to parse it at all.
In your system, always store the entire queue URL exactly as Amazon SQS returns it to you when you create the queue
The hostname portion of the URL is quite deterministic, and the regional endpoints for SQS are very consistently sqs.${region}.amazonaws.com
.
There is no obvious reason not to rely on the hostname for determining the region. AWS rarely changes endpoint hostnames and in the few instances that they have, it has been to make them more predictable. Meanwhile, the old ones are still quietly there -- for example, the original endpoints, such as queue.amazonaws.com
and us-west-1.queue.amazonaws.com
are still active and appear to be fully functional even though these were officially replaced by sqs.us-[east | west]-1.amazonaws.com
. AWS has more recently been more consistent and hierarchical with endpoint conventions, but in doing so, they have not broken older clients where these values are hard-coded.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With