Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Is it okay to fetch AWS region from SQS url?

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?

like image 338
Mayank Patel Avatar asked Jan 28 '23 19:01

Mayank Patel


2 Answers

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.

like image 131
dkasipovic Avatar answered Jan 31 '23 09:01

dkasipovic


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.

like image 45
Michael - sqlbot Avatar answered Jan 31 '23 10:01

Michael - sqlbot