如何从可用的 BasicAWSCredentials 中推断出 AWS 账户 ID?
似乎在文档的任何地方都找不到这个;如果我已通过 BasicAWSCredentials(例如 AccessKeyId 和 SecretKey)的身份验证,是否可以获取 AWS 账户 ID?
似乎在文档的任何地方都找不到这个;如果我已通过 BasicAWSCredentials(例如 AccessKeyId 和 SecretKey)的身份验证,是否可以获取 AWS 账户 ID?
AWS 刚刚通过引入专用的 STS API 操作 GetCallerIdentity 悄悄解决了这一长期存在的差距,该操作返回有关其凭证用于调用 API 的 IAM 身份的详细信息,包括 AWS 账户 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 命令行界面仅获取账户 ID,下面是一个示例:
$ aws sts get-caller-identity --output text --query Account
121371349383
这至少可以通过 AWS Identity and Access Management (IAM) 通过 GetUser 操作(可通过适用于 Java 的 AWS 开发工具包中的 getUser() 获得)间接实现:
检索有关指定用户的信息,包括用户的路径、GUID 和 ARN。
如果您未指定用户名,IAM 将根据签署请求的 AWS 访问密钥 ID 隐式确定用户名。
返回的用户数据类型(类用户)包含一个 Arn 元素 (getArn()),该元素是指定用户的 Amazon 资源名称 (ARN)。IAM 实体的标识符中对此进行了进一步详细说明,特别是在 ARN 部分中,该部分描述了用户资源类型的格式:
arn:aws:iam::{account_ID}:user/{path/to/user/UserName}
Example: arn:aws:iam::123456789012:user/division_abc/subdivision_xyz/Bob
这是一个古老的问题,但对于那里的可怜灵魂来说 - 基于ARN的答案是我们找到的最正确的答案。调用 DescribeInstances 时还有一个 OwnerId 字段,但可能没有实例。
然而,现实情况要复杂一些。有时,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);
}