1

作为先决条件,请参阅页面。

所以我可以创建一个小应用程序,它实际上是他们提供的代码的复制粘贴。它确实为给定的用户运行,我已将全局变量更改为正确的值,并且我可以通过 AWS CLI 承担我想要的 STS 角色。但是,此代码仍不会承担适当的角色。

我将代码导出为可执行 jar,将其放到我的 EC2 实例(基本 AWS linux 实例)上,然后运行它。我确实让它从 STS 凭证中输出正确且正确的密钥,但是一旦它到达 S3 客户端,我就会被拒绝访问(403)。

我的角色如下:

  • EC2没有角色,但在凭证文件中有一个用户访问信息(我们称他为MyUser)
  • MyUser 能够承担 STS 角色和 IAM 功能(IAM 功能不是必需的,仅用于测试目的)
  • STS 角色只能由 MyUser 承担,并允许在帐户内完全访问 S3

AWS 文档有时会受到打击或错过,但我找不到其他人遇到此代码问题。就像我说的,如果我通过 CLI 执行相同的过程来承担 STS 角色,我可以做到这一点并且它可以正常工作,这使得这更加令人困惑。

提前感谢任何可以提供帮助的人!

4

1 回答 1

3

根据他们的文档,您链接的页面有错误的代码。AssumeRole 方法有不同的示例代码是不正确的。还有其他文档可以解决此问题,请参阅此页面。API 文档示例有

AssumeRoleResult response = client.assumeRole(request);

其中 AssumeRole 函数返回一个 AssumeRoleResult 对象,该对象具有与从 GetSessionTokenRequest 类返回的凭据不同的凭据。返回的凭据具有不同的长度/大小,并且由于某种原因无效。

修复:

他们文档上显示的此代码无效。

stsClient.assumeRole(roleRequest);
GetSessionTokenRequest getSessionTokenRequest = new GetSessionTokenRequest();
getSessionTokenRequest.setDurationSeconds(900);
GetSessionTokenResult sessionTokenResult = stsClient.getSessionToken(getSessionTokenRequest);
Credentials sessionCredentials = sessionTokenResult.getCredentials();

上面的代码应替换为在此处找到的以下代码。

AssumeRoleResult response = stsClient.assumeRole(roleRequest);
Credentials sessionCredentials = response.getCredentials();
于 2018-08-15T14:12:41.137 回答