ドキュメントのどこにもこれが見つからないようです。AccessKeyId や SecretKey などの BasicAWSCredentials で認証されている場合、AWS アカウント ID を取得できますか?
12 に答える
アップデート
AWS は、専用の STS API アクションGetCallerIdentityを導入することで、この長年のギャップに静かに対処しました。これは、AWS アカウント ID を含む、API を呼び出すために使用される認証情報を持つ IAM ID に関する詳細を返します。たとえば、いくつかのサンプル応答があります。
<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 Command Line Interfaceを使用して、アカウント ID のみを取得できます。以下に例を示します。
$ aws sts get-caller-identity --output text --query Account
121371349383
最初の回答
これは、GetUserアクション ( AWS SDK for JavaのgetUser()で利用可能) を使用して、 AWS Identity and Access Management (IAM)を介して少なくとも間接的に可能です。
ユーザーのパス、GUID、ARN など、指定されたユーザーに関する情報を取得します。
ユーザー名を指定しない場合、IAM は、リクエストに署名する AWS アクセス キー ID に基づいて暗黙的にユーザー名を決定します。
返されたUserデータ型 ( Class User ) には、 user を指定する Amazon リソースネーム (ARN)であるArn要素 ( getArn() ) が含まれています。これについては、IAM エンティティの識別子、特にセクションARNsで詳しく説明しています。ここでは、ユーザー リソース タイプの形式について説明しています。
arn:aws:iam::{account_ID}:user/{path/to/user/UserName}
Example: arn:aws:iam::123456789012:user/division_abc/subdivision_xyz/Bob
AWS CLI ツールがあれば、次のことができます。
aws iam get-user | awk '/arn:aws:/{print $2}'
最新の API では、ユーザー ID を直接見つける方法があります。
BasicAWSCredentials basicAWSCredentials = new BasicAWSCredentials("your access key", "your secret key");
AmazonIdentityManagementClient iamClient = new AmazonIdentityManagementClient(basicAWSCredentials);
String userId = iamClient.getUser().getUser().getUserId();
私はこれを理想的なシナリオとは考えていませんが、仕事は完了しています。これは 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];
}
面白い発見がありました。存在しない RoleName で GetRole を呼び出すと、返されるエラー メッセージに呼び出し元のアカウントの 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 アカウント ID です。