AWS EC2 |使用 Rusoto SDK:找不到 AWS 凭证

AWS EC2 | using Rusoto SDK: Couldn't find AWS credentials

我正在尝试使用新的 Instance Metadata Service Version 2 (IMDSv2) API。

当我尝试按照 Retrieve instance metadata - Amazon Elastic Compute Cloud 中所述手动查询元数据时,它按预期工作。

但是,如果我尝试查询实例标签,它会失败并显示错误消息:

Couldn't find AWS credentials in environment, credentials file, or IAM role

标签查询由Rusoto SDK that I am using, that works when I set --http-tokens optional as described on Configure the instance metadata options - Amazon Elastic Compute Cloud完成。

我不完全理解为什么将机器设置为使用 IMDSv2 会影响 DescribeTags 请求,因为我认为它没有使用相同的 API - 所以我猜这是一方面效果。

如果我尝试使用 curl(而不是使用 SDK)进行手动查询:

https://ec2.amazonaws.com/?Action=DescribeTags&Filter.1.Name=resource-id&Filter.1.Value.1=ami-1a2b3c4d

我得到:

The action DescribeTags is not valid for this web service

谢谢:)

我使用的库 (Rusoto SDK 0.47.0) 不支持在主机设置为使用 IMDSv2 时获取所需的凭据。

解决方法是手动查询 IAM 角色凭据。 首先,您获得令牌:

GET /latest/api/token

接下来,使用令牌header“X-aws-ec2-metadata-token”和之前的值:

GET /meta-data/iam/security-credentials

之后,使用之前查询的结果(不要忘记设置token header),查询:

GET /meta-data/iam/security-credentials/<query 2 result>

这将提供以下数据:

struct SecurityCredentials {
#[serde(rename = "AccessKeyId")]
access_key_id: String,
#[serde(rename = "SecretAccessKey")]
secret_access_key: String,
#[serde(rename = "Token")]
token: String,
}

然后我需要做的是使用该数据构建一个自定义凭证提供程序(但这部分已经是特定于库的)。