[英]'Profile file contained no credentials for profile' error when doing PutItem using AWS Java SDK
[英]AWS Java SDK not finding profile when using AWS SSO
当我使用 AWS SSO 登录时,我无法访问 aws。 我从我的电脑登录使用:
aws sso login --profile staging
配置文件配置如下:
[profile staging]
sso_start_url = https://som-nice-working-url
sso_region = us-east-1
sso_account_id = 1234
sso_role_name = the-role-name
region = eu-west-1
output = yaml
登录后,我可以通过 aws cli 访问 aws。
然后我设置变量: AWS_PROFILE=staging
但是在 java 上我收到以下异常:
com.amazonaws.SdkClientException: Unable to load AWS credentials from any provider in the chain: [EnvironmentVariableCredentialsProvider: Unable to load AWS credentials from environment variables (AWS_ACCESS_KEY_ID (or AWS_ACCESS_KEY) and AWS_SECRET_KEY (or AWS_SECRET_ACCESS_KEY)), SystemPropertiesCredentialsProvider: Unable to load AWS credentials from Java system properties (aws.accessKeyId and aws.secretKey), WebIdentityTokenCredentialsProvider: You must specify a value for roleArn and roleSessionName, com.amazonaws.auth.profile.ProfileCredentialsProvider@369a95a5: No AWS profile named 'staging', com.amazonaws.auth.EC2ContainerCredentialsProviderWrapper@6d6f6ca9: Failed to connect to service endpoint: ]
我尝试将 ProfileCredentialsProvider 与“staging”一起使用,但结果是一样的。
我应该使用什么CredentialsProvider
?
我的代码使用的是 DefaultProviderChain:
AWSGlueClient.builder()
.withRegion("eu-west-1")
.build()
谢谢你。
我可能是错的,但是 IMO 还无法基于https://docs.aws.amazon.com/sdk-for-java/v2/developer-guide/credentials.html在 AWS SDK 中使用 AWS SSO。
AFAIK AWS SSO 目前仅集成到 AWS CLI - https://docs.aws.amazon.com/singlesignon/latest/userguide/integrating-aws-cli.html
对于 Java 应用程序,您将需要SSO Dependency 。
在撰写本文时,最新版本是2.16.76
// Gradle example
dependencies {
implementation(platform("software.amazon.awssdk:bom:2.16.70"))
implementation("software.amazon.awssdk:sso:2.16.76")
}
您还需要在~/.aws/configuration
或~/.aws/credentials
设置default
配置文件
更多信息如下:
https://docs.aws.amazon.com/sdk-for-java/latest/developer-guide/credentials.html https://docs.aws.amazon.com/sdk-for-java/latest/developer-guide /setup.html#setup-credentials https://docs.aws.amazon.com/sdk-for-java/latest/developer-guide/setup-additional.html#setup-additional-credentials
但是,您还应该能够将AWS_PROFILE
环境变量设置为您的配置文件,并且它也应该可以在没有 SSO 依赖的情况下神奇地工作。
在您的示例中,具体来说:
AWS_PROFILE=staging
等待 SDK 2 集成 SSO, aws-sso-cred-restore
是一种解决方法:
安装它(使用 Python 3):
pip3 install aws-sso-cred-restore
然后你可以运行它(它会获得一个大约 1 小时可用的令牌,所以你应该每小时运行一次以刷新):
aws-sso-cred-restore --profile $YOUR_PROFILE
您可以在 Java 应用程序中再次使用您的 $YOUR_PROFILE。
目前,您无法在本机上为 SDK 使用 SSO 凭据。 在此期间,您可以使用命令行工具来解决此问题
安装(npm):
npm install -g aws-sso-creds-helper
用法:
ssocreds -p my-profile
[aws-sso-creds-helper]: Getting SSO credentials for profile my-profile
[aws-sso-creds-helper]: Successfully loaded SSO credentials for profile my-profile
AWS SDK for Java V2 版本2.15.33
( 2020 年 11 月)中添加了对 SSO 凭证提供程序的支持。 旧版本的 SDK 不支持 SSO。 (请参阅功能请求和PR )
如果您使用的是 maven,请通过在dependencyManagement
部分中指定版本来确保所有 SDK 模块的版本兼容,如文档中所述。 例如
<dependencyManagement>
<dependencies>
<dependency>
<groupId>software.amazon.awssdk</groupId>
<artifactId>bom</artifactId>
<version>2.17.8</version> <!--Must be 2.15.33 or higher-->
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<dependency>
<groupId>software.amazon.awssdk</groupId>
<artifactId>dynamodb</artifactId>
</dependency>
<dependency>
<groupId>software.amazon.awssdk</groupId>
<artifactId>sso</artifactId>
</dependency>
</dependencies>
我这样做的方式有点麻烦,但它有效:
.aws/config
aws sso login --profile <your_profile>
.aws/sso/cache
如描述的内容在这里{
"startUrl": "https://my-sso-portal.awsapps.com/start",
"region": "us-east-1",
"accessToken": "eyJlbmMiOiJBM….",
"expiresAt": "2020-06-17T10:02:08UTC"
}
software.amazon.awssdk:sso
的依赖项SsoCredentialsProvider
:CredentialsProvider ssoCredentialsProvider = ((SsoCredentialsProvider.Builder) SsoCredentialsProvider.builder())
.ssoClient(SsoClient.builder(<REGION_FROM_JSON>).region().build())
.refreshRequest( () ->
GetRoleCredentialsRequest.builder()
.roleName("<ROLE_FROM_PROFILE>")
.accountId("<ACCOUNT_ID_FROM_PROFILE>")
.accessToken("<ACCESS_TOKEN_FROM_JSON>")
.build()
).build();
将 AWS SDK 用于 Java 时,您可以尝试使用缓存的临时凭证中的值为您的 Java 应用程序提供一些环境变量。
使用以下方式登录:
aws sso login
读取缓存文件:
cat ~/.aws/cli/cache/<generated>.json
使用缓存文件中的字段设置环境变量:
AWS_ACCESS_KEY_ID=<AccessKeyId>
AWS_SECRET_ACCESS_KEY=<SecretAccessKey>
AWS_SESSION_TOKEN=<SessionToken>
使用这些环境变量运行您的 Java 应用程序。
在后台,EnvironmentVariableCredentialsProvider class 读取这些环境变量。
每次 session 令牌过期时,您都需要重置这些环境变量。
这是@nluk 提供的增强答案。 您只需要 iam 配置文件名称即可从.aws
文件夹和config
文件中获取 sso 配置文件。
在 pom 中添加:
<dependency>
<groupId>software.amazon.awssdk</groupId>
<artifactId>sso</artifactId>
<version>2.19.16</version>
</dependency>
然后:您可以使用 sdk2 sso 工具:
import software.amazon.awssdk.auth.credentials.AwsSessionCredentials;
import software.amazon.awssdk.auth.credentials.ProfileProviderCredentialsContext;
import software.amazon.awssdk.profiles.ProfileFile;
import software.amazon.awssdk.services.sso.auth.SsoProfileCredentialsProviderFactory;
//....
String awsProfile = "my-profile-name"
ProfileFile profileFile = ProfileFile.defaultProfileFile();
profileFile
.getSection("profiles", awsProfile)
.ifPresent(
profile -> {
ProfileProviderCredentialsContext profileProvider =
ProfileProviderCredentialsContext.builder()
.profile(profile)
.profileFile(profileFile)
.build();
// cast to get the token
AwsSessionCredentials awsCredentials =
(AwsSessionCredentials)
new SsoProfileCredentialsProviderFactory()
.create(profileProvider)
.resolveCredentials();
// then get the temporary credentials
// awsCredentials.accessKeyId();
// awsCredentials.secretAccessKey();
// awsCredentials.sessionToken();
});
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.