Skip to content

Instantly share code, notes, and snippets.

@monkut
Last active August 8, 2019 23:51
Show Gist options
  • Save monkut/71e6e0e5d96120ffb109d3a603407d7b to your computer and use it in GitHub Desktop.
Save monkut/71e6e0e5d96120ffb109d3a603407d7b to your computer and use it in GitHub Desktop.
parse AWS ARN
def parse_arn(arn_str: str) -> Tuple[str, str, str, Optional[str], str, Optional[List[str]]]:
"""
https://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html
arn:partition:service:region:account-id:resource
arn:partition:service:region:account-id:resourcetype/resource
arn:partition:service:region:account-id:resourcetype/resource/qualifier
arn:partition:service:region:account-id:resourcetype/resource:qualifier
arn:partition:service:region:account-id:resourcetype:resource
arn:partition:service:region:account-id:resourcetype:resource:qualifier
:return: service, region, account_id, resource_type, resource, qualifier
"""
*_, service, region, account_id, resource_elements = arn_str.split(':', 5)
resource_type = None
resource = None
qualifiers = None
if not any(separator in resource_elements for separator in (':', '/')):
resource = resource_elements
elif ':' in resource_elements and '/' not in resource_elements:
if resource_elements.count(':') == 1:
resoruce_type, resource = resource_elements.split(':')
elif resource_elements.count(':') >= 2:
resource_type, resource, *qualifiers = resource_elements.split(':')
elif ':' not in resource_elements and '/' in resource_elements:
if resource_elements.count('/') == 1:
resoruce_type, resource = resource_elements.split('/')
elif resource_elements.count('/') >= 2:
resource_type, resource, *qualifiers = resource_elements.split('/')
elif ':' in resource_elements and '/' in resource_elements:
# 'arn:partition:service:region:account-id:resourcetype/resource:qualifier'
resource_type, remaining = resource_elements.split('/')
resource, qualifier = remaining.split(':')
return service, region, account_id, resource_type, resource, qualifiers
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment