Подтвердить что ты не робот

Как я могу вывести идентификатор учетной записи AWS из доступных BasicAWSCredentials?

Кажется, что-то не найти в документах; если я аутентифицирован с помощью BasicAWSCredentials, например. AccessKeyId и SecretKey, можно ли получить идентификатор учетной записи AWS?

4b9b3361

Ответ 1

Update

AWS просто молчала в этом долгом промежутке, введя выделенное действие STS API GetCallerIdentity, в котором перечислены подробности об идентификаторе IAM, учетные данные используются для вызова API, в том числе идентификатора учетной записи AWS, существует несколько ответов например:

<GetCallerIdentityResponse xmlns="https://sts.amazonaws.com/doc/2011-06-15/">
  <GetCallerIdentityResult>
   <Arn>arn:aws:iam::123456789012:user/Alice</Arn>
    <UserId>AKIAI44QH8DHBEXAMPLE</UserId>
    <Account>123456789012</Account>
  </GetCallerIdentityResult>
  <ResponseMetadata>
    <RequestId>01234567-89ab-cdef-0123-456789abcdef</RequestId>
  </ResponseMetadata>
</GetCallerIdentityResponse>

Вы можете использовать интерфейс командной строки AWS, чтобы получить только идентификатор учетной записи, вот пример:

$ aws sts get-caller-identity --output text --query Account
121371349383

Исходный ответ

Это, по крайней мере, косвенно возможно с помощью AWS Identity and Access Management (IAM) с помощью GetUser action (доступно через getUser() в AWS SDK для Java):

Извлекает информацию о указанном пользователе, включая путь, GUID и ARN.

Если вы не укажете имя пользователя, IAM определяет имя пользователя неявно на основе идентификатора ключа доступа AWS, который подписывает запрос.

Возвращаемый тип данных User (Класс User) содержит элемент Arn (getArn()), который является именем ресурса Amazon (ARN), определяющим пользователя. Это подробно описано в Идентификаторы для объектов IAM, в разделе ARNs, в котором описывается формат типа ресурса пользователя:

arn:aws:iam::{account_ID}:user/{path/to/user/UserName}

Example: arn:aws:iam::123456789012:user/division_abc/subdivision_xyz/Bob

Ответ 2

Если у вас есть инструменты AWI CLI, вы можете:

aws iam get-user | awk '/arn:aws:/{print $2}'

Ответ 3

Это старый вопрос, но для бедных душ - Ответ, основанный на ARN, является самым правильным ответом, который мы нашли. Там также поле OwnerId при вызове DescribeInstances, но не может быть экземпляров..

Однако реальность немного сложнее. Иногда у пользователя IAM нет разрешения на выдачу getUser(), а затем он получает исключение AmazonServiceException с

getErrorCode() = "AccessDenied"

В этом случае ARN является частью сообщения AWS об ошибке:

User: arn:aws:iam::123456789012:user/division_abc/subdivision_xyz/Bob is not authorized to perform: 
iam:GetUser on resource: arn:aws:iam::123456789012:user/division_abc/subdivision_xyz/Bob

Итак, дело еще хуже: нам нужно разобрать бесплатное текстовое сообщение об ошибке, а затем извлечь номер учетной записи:

try {
    ... iam.getUser(); ...
} catch (AmazonServiceException e) {
    if (e.getErrorCode().compareTo("AccessDenied") == 0) {
        String arn = null;
        String msg = e.getMessage();
        // User: arn:aws:iam::123456789012:user/division_abc/subdivision_xyz/Bob is not authorized to perform: iam:GetUser on resource: arn:aws:iam::123456789012:user/division_abc/subdivision_xyz/Bob
        int arnIdx = msg.indexOf("arn:aws");
        if (arnIdx != -1) {
            int arnSpace = msg.indexOf(" ", arnIdx);
            arn = msg.substring(arnIdx, arnSpace);
        }
        System.out.println("ARN: " + arn);
}

Ответ 4

С новейшим API существует прямой способ найти идентификатор пользователя:

BasicAWSCredentials basicAWSCredentials = new BasicAWSCredentials("your access key", "your secret key");
AmazonIdentityManagementClient iamClient = new AmazonIdentityManagementClient(basicAWSCredentials);
String userId = iamClient.getUser().getUser().getUserId();

Ответ 5

Добавление этого здесь, потому что это верхний результат SO для "найти номер учетной записи aws", а также потому, что плохая практика использовать ключи вместо роли IAM для развернутых приложений в любом случае...

Если вы используете экземпляр AWS с ролью IAM на нем, вы можете сделать curl -s http://169.254.169.254/latest/meta-data/iam/info и получить ARN из роли экземпляра из ключа InstanceProfileArn результатов, не беспокоясь о попытках для синтаксического анализа сообщения об исключении или предоставления разрешений IAM экземпляру, который им не нужен.

Затем вам просто нужно проанализировать ARN для номера учетной записи.

Ответ 6

Я сделал забавное открытие - если вы вызываете GetRole с несуществующим RoleName, сообщение об ошибке, которое вы получите, содержит ARN вызывающей учетной записи, поэтому просто проанализируйте номер учетной записи. Это хорошо, потому что он работает во всех случаях, о которых я могу думать, даже если у вызывающего нет разрешений на вызов GetRole.

Здесь появляется сообщение об ошибке:

User: arn:aws:sts::669916120315:assumed-role/CloudMail_Server/i-31dd19cd is not authorized to perform: iam:GetRole on resource: role _no_such_role_

Часть сообщения "669916120315" представляет собой идентификатор учетной записи AWS.

Ответ 7

Пока я не считаю это идеальным сценарием, он выполняет свою работу. Это использует AWSSDK 3.0.

public string GetUserId()
{
    AmazonIdentityManagementServiceClient c = 
        new AmazonIdentityManagementServiceClient();

    GetUserRequest request = new GetUserRequest();
    GetUserResponse response = c.GetUser(request);

    //parse it from the ARN
    //should be similar to "arn:aws:iam::111111111111:user/username"
    string[] arnParts = response.User.Arn.Split(new char[] { ':' });
    return arnParts[4];
}

Ответ 8

Здесь код, чтобы получить новый материал STC getCallerIdentity, работающий (на Java):

private String getAccountIDUsingAccessKey(String accessKey, String secretKey) {
    AWSSecurityTokenService stsService = AWSSecurityTokenServiceClientBuilder.standard().withCredentials(
            new AWSStaticCredentialsProvider(new BasicAWSCredentials(accessKey, secretKey))).build();

    GetCallerIdentityResult callerIdentity = stsService.getCallerIdentity(new GetCallerIdentityRequest());
    return callerIdentity.getAccount();
}

Подходит для @SteffenOpel для получения необходимых подсказок, конечно.

Ответ 9

Владельцем группы безопасности по умолчанию является "ID учетной записи"

Ответ 10

ElasticTranscoder ListPresets возвращает структуру данных, которая включает в себя ARN, которые включают идентификатор учетной записи AWS.

В отличие от многих других популярных предложений эта команда aws-cli работает для основных учетных данных, пользователя IAM, роли IAM, ролей экземпляров и предположения о роли кросс-аккаунта:

aws elastictranscoder list-presets --query 'Presets[0].Arn' | 
  cut -d: -f5

Конечно, вам понадобится разрешение на вызов API ListPresets, но это верно для любого ответа.