我使用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()
谢谢你。
7条答案
按热度按时间eqzww0vc1#
对于Java应用程序,您将需要SSO Dependency。
截至编写本文时,最新版本为
2.16.76
您还需要在
~/.aws/configuration
或~/.aws/credentials
中设置default
配置文件更多信息如下:
https://docs.aws.amazon.com/sdk-for-java/latest/developer-guide/setup.html#setup-credentialshttps://docs.aws.amazon.com/sdk-for-java/latest/developer-guide/setup-additional.html#setup-additional-credentials
但是,您也应该能够将
AWS_PROFILE
环境变量设置为概要文件,它应该可以在没有SSO依赖的情况下神奇地工作。在您的示例中,具体而言:
bvk5enib2#
在我的例子中,只需添加aws-sso依赖项:
允许默认凭据提供程序链选取
ProfileCredentialsProvider
下的sso:要开箱即用,您需要指定
[default]
配置文件,否则,简单地使用.credentialsProvider(ProfileCredentialsProvider.create("xyz"))
也可以使用[profile xyz]
。如果全部失败,请手动添加凭据提供程序:
1.设置配置文件
.aws/config
1.使用cli
aws sso login --profile <your_profile>
登录1.在
.aws/sso/cache
中生成json文件,其内容如here所述1.在项目中包含对
software.amazon.awssdk:sso
的依赖项1.使用json文件中的数据创建
SsoCredentialsProvider
:hsvhsicv3#
AWS SDK for Java V2的
2.15.33
版本(2020年11月)中添加了对SSO凭据提供程序的支持。较早版本的SDK不支持SSO。(请参阅Feature Request和PR)如果您使用的是maven,请按照documentation中的说明在
dependencyManagement
部分指定版本,以确保所有SDK模块的版本都兼容。8wtpewkr4#
我可能是错的,但是IMO还没有办法在AWS SDK中基于https://docs.aws.amazon.com/sdk-for-java/v2/developer-guide/credentials.html使用AWS SSO。
AFAIK AWS SSO目前仅集成到AWS CLI -https://docs.aws.amazon.com/singlesignon/latest/userguide/integrating-aws-cli.html中
k10s72fa5#
等待SDK 2集成SSO,
aws-sso-cred-restore
是一种解决方法:安装它(使用Python 3):
然后,您可以运行此(它得到一个令牌可用约1小时,所以你应该运行它每小时刷新):
您可以在Java应用程序中再次使用$YOUR_PROFILE。
qij5mzcb6#
使用AWS SDK for Java时,您可以尝试使用缓存的临时凭据中的值为Java应用程序提供一些环境变量。
登录方式:
读取缓存文件:
使用缓存文件中的字段设置环境变量:
使用这些环境变量运行Java应用程序。
在底层,EnvironmentVariableCredentialsProvider类读取这些环境变量。
每次会话令牌过期时,您都需要重置这些环境变量。
fzsnzjdm7#
这是一个增强的答案的@nluk提供。您只需要iam配置文件名称从
.aws
文件夹和config
文件中获取sso配置文件。在pom中添加以下内容:
那么:你可以使用sdk 2 sso工具: