File: //usr/lib/python3.9/site-packages/ansible_collections/amazon/aws/plugins/module_utils/iam.py
# Copyright (c) 2017 Ansible Project
# GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt)
from __future__ import (absolute_import, division, print_function)
__metaclass__ = type
try:
import botocore
except ImportError:
pass
from ansible.module_utils._text import to_native
from .ec2 import AWSRetry
from .core import is_boto3_error_code
from .core import parse_aws_arn
def get_aws_account_id(module):
""" Given an AnsibleAWSModule instance, get the active AWS account ID
"""
return get_aws_account_info(module)[0]
def get_aws_account_info(module):
"""Given an AnsibleAWSModule instance, return the account information
(account id and partition) we are currently working on
get_account_info tries too find out the account that we are working
on. It's not guaranteed that this will be easy so we try in
several different ways. Giving either IAM or STS privileges to
the account should be enough to permit this.
Tries:
- sts:GetCallerIdentity
- iam:GetUser
- sts:DecodeAuthorizationMessage
"""
account_id = None
partition = None
try:
sts_client = module.client('sts', retry_decorator=AWSRetry.jittered_backoff())
caller_id = sts_client.get_caller_identity(aws_retry=True)
account_id = caller_id.get('Account')
partition = caller_id.get('Arn').split(':')[1]
except (botocore.exceptions.BotoCoreError, botocore.exceptions.ClientError):
try:
iam_client = module.client('iam', retry_decorator=AWSRetry.jittered_backoff())
_arn, partition, _service, _reg, account_id, _resource = iam_client.get_user(aws_retry=True)['User']['Arn'].split(':')
except is_boto3_error_code('AccessDenied') as e:
try:
except_msg = to_native(e.message)
except AttributeError:
except_msg = to_native(e)
result = parse_aws_arn(except_msg)
if result is None or result['service'] != 'iam':
module.fail_json_aws(
e,
msg="Failed to get AWS account information, Try allowing sts:GetCallerIdentity or iam:GetUser permissions."
)
account_id = result.get('account_id')
partition = result.get('partition')
except (botocore.exceptions.BotoCoreError, botocore.exceptions.ClientError) as e: # pylint: disable=duplicate-except
module.fail_json_aws(
e,
msg="Failed to get AWS account information, Try allowing sts:GetCallerIdentity or iam:GetUser permissions."
)
if account_id is None or partition is None:
module.fail_json(
msg="Failed to get AWS account information, Try allowing sts:GetCallerIdentity or iam:GetUser permissions."
)
return (to_native(account_id), to_native(partition))