numero iam cuenta cli canonical aws java amazon-web-services

java - iam - numero de cuenta aws



¿Cómo puedo deducir el ID de cuenta de AWS de las Reasignaciones de BasicAWSC disponibles? (10)

Actualizar

AWS ha abordado silenciosamente este vacío de larga data mediante la introducción de la acción API de STS dedicada GetCallerIdentity , que devuelve detalles sobre la identidad de IAM cuyas credenciales se utilizan para llamar a la API , incluida la ID de cuenta de AWS. Hay algunas respuestas de ejemplo, por ejemplo:

<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>

Puede utilizar la interfaz de línea de comandos de AWS para obtener solo la identificación de la cuenta, aquí hay un ejemplo:

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

Respuesta inicial

Esto es al menos indirectamente posible a través de AWS Identity and Access Management (IAM) mediante la acción GetUser (disponible a través de getUser() en el AWS SDK para Java ):

Recupera información sobre el usuario especificado, incluida la ruta del usuario, GUID y ARN.

Si no especifica un nombre de usuario, IAM determina el nombre de usuario implícitamente basado en el ID de clave de acceso de AWS que firma la solicitud.

El tipo de datos de User devuelto ( Usuario de Clase ) contiene un elemento Arn ( getArn() ), que es el Nombre del recurso de Amazon (ARN) que especifica al usuario . Esto se detalla más en Identificadores para Entidades IAM, específicamente en la sección ARNs , que describe el formato del Tipo de Recurso del Usuario :

arn:aws:iam::{account_ID}:user/{path/to/user/UserName} Example: arn:aws:iam::123456789012:user/division_abc/subdivision_xyz/Bob

Parece que no puede encontrar esto en ningún lugar de los documentos; si estoy autenticado con BasicAWSCredentials, por ejemplo, AccessKeyId y SecretKey, ¿es posible obtener la ID de cuenta de AWS?


Agregando esto aquí, porque es el resultado SO superior para "encontrar un número de cuenta Aws", y porque es una mala práctica usar teclas en lugar de Roles IAM para aplicaciones implementadas de todos modos ...

Si está ejecutando desde una instancia de AWS que tiene un rol de IAM, puede hacer curl -s http://169.254.169.254/latest/meta-data/iam/info y obtener el ARN del rol de la instancia desde el InstanceProfileArn clave de los resultados, sin tener que preocuparse por intentar analizar un mensaje de excepción o conceder permisos de IAM a una instancia que no los necesita.

Entonces, solo tiene que analizar el ARN para el número de cuenta.


Aquí está el código para que funcione el nuevo STS getCallerIdentity (en 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(); }

Apoyos a @SteffenOpel para dar las pistas necesarias, por supuesto.


Con la última API, hay una forma directa de encontrar la ID de usuario:

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


El propietario del grupo de seguridad predeterminado es el "ID de cuenta"


Esta es una vieja pregunta, pero para las pobres almas que están por ahí: la respuesta basada en ARN es la respuesta más correcta que encontramos. También hay un campo OwnerId al llamar a DescribeInstances, pero puede que no haya instancias ..

Sin embargo, la realidad es un poco más compleja. A veces, el usuario de IAM no tiene permiso para emitir getUser (), y luego obtiene AmazonServiceException con

getErrorCode() = "AccessDenied"

En este caso, el ARN es una parte del mensaje de error de 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

Así que aquí las cosas son aún peores: tenemos que analizar un mensaje de error de texto libre y luego extraer el número de cuenta:

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); }


Hice un descubrimiento divertido: si llama a GetRole con un RoleName inexistente, el mensaje de error que recibe contiene el ARN de la cuenta de llamada, así que simplemente analice el número de cuenta de eso. Esto es bueno porque funciona en todos los casos que se me ocurre, incluso si la persona que llama no tiene permisos para llamar a GetRole.

Aquí está el mensaje de error que recibo:

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

La parte ''669916120315'' del mensaje de error es la ID de cuenta de AWS.


Si bien no considero que este sea un escenario ideal, hace el trabajo. Esto usa 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]; }


Si tiene las herramientas AWS CLI, puede:

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


ElasticTranscoder ListPresets devuelve una estructura de datos que incluye ARN que incluyen la identificación de cuenta de AWS.

A diferencia de muchas otras sugerencias populares, este comando aws-cli funciona para las credenciales básicas, el usuario de IAM, los roles de IAM, los roles de instancia y la suposición de roles entre cuentas:

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

Por supuesto, necesitará permiso para realizar la llamada API de ListPresets, pero eso es cierto para cualquier respuesta.