Create a gist now

Instantly share code, notes, and snippets.

What would you like to do?
Parse an AWS ARN (Amazon Resource Name) into it's constituent elements
def parse_arn(arn):
# http://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html
elements = arn.split(':')
result = {'arn': elements[0],
'partition': elements[1],
'service': elements[2],
'region': elements[3],
'account': elements[4]
}
if len(elements) == 7:
result['resourcetype'], result['resource'] = elements[5:]
elif '/' not in elements[5]:
result['resource'] = elements[5]
result['resourcetype'] = None
else:
result['resourcetype'], result['resource'] = elements[5].split('/')
return result
@canburak

This comment has been minimized.

Show comment Hide comment
@canburak

canburak Apr 11, 2017

This will parse at least rds auto snapshots' arns. they have ":" in the resource

This will parse at least rds auto snapshots' arns. they have ":" in the resource

@jaytaylor

This comment has been minimized.

Show comment Hide comment
@jaytaylor

jaytaylor Aug 7, 2017

I've created a similar library package for Go called awsarn, hope you don't mind too much if I leave a breadcrumb trail here :)

I've created a similar library package for Go called awsarn, hope you don't mind too much if I leave a breadcrumb trail here :)

@afosterw

This comment has been minimized.

Show comment Hide comment
@afosterw

afosterw Feb 14, 2018

Fixed version to handle resource types and resources correctly.

def parse_arn(arn):
    # http://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html
    elements = arn.split(':', 5)
    result = {
        'arn': elements[0],
        'partition': elements[1],
        'service': elements[2],
        'region': elements[3],
        'account': elements[4],
        'resource': elements[5],
        'resource_type': None
    }
    if '/' in result['resource']:
        result['resource_type'], result['resource'] = result['resource'].split('/',1)
    elif ':' in result['resource']:
        result['resource_type'], result['resource'] = result['resource'].split(':',1)
    return result

afosterw commented Feb 14, 2018

Fixed version to handle resource types and resources correctly.

def parse_arn(arn):
    # http://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html
    elements = arn.split(':', 5)
    result = {
        'arn': elements[0],
        'partition': elements[1],
        'service': elements[2],
        'region': elements[3],
        'account': elements[4],
        'resource': elements[5],
        'resource_type': None
    }
    if '/' in result['resource']:
        result['resource_type'], result['resource'] = result['resource'].split('/',1)
    elif ':' in result['resource']:
        result['resource_type'], result['resource'] = result['resource'].split(':',1)
    return result
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment