使用AWS SSO时AWS Java SDK找不到配置文件

时间:2020-09-25 10:54:04

标签: java amazon-web-services sdk single-sign-on

使用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()

谢谢。

5 个答案:

答案 0 :(得分:1)

我可能是错的,但是IMO还没有办法基于https://docs.aws.amazon.com/sdk-for-java/v2/developer-guide/credentials.html在AWS开发工具包中使用AWS SSO。

AFAIK AWS SSO目前仅集成到AWS CLI-https://docs.aws.amazon.com/singlesignon/latest/userguide/integrating-aws-cli.html

答案 1 :(得分:0)

等待SDK 2集成SSO,ZoneOffset是一种解决方法:

安装它(使用Python 3):

OffsetDateTime nowExplicitSystemOffset = OffsetDateTime.now(ZoneId.systemDefault());

然后您可以运行它(它会在1小时左右获得令牌,因此您应该每小时运行一次以刷新):

aws-sso-cred-restore

您可以在Java应用中再次使用$ YOUR_PROFILE。

答案 2 :(得分:0)

当前,您不能本地使用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

https://github.com/ryansonshine/aws-sso-creds-helper

答案 3 :(得分:0)

对于 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")
}

您还需要在 default~/.aws/configuration

中设置 ~/.aws/credentials 配置文件

更多信息如下:

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

答案 4 :(得分:0)

在版本 2.15.332020 年 11 月)的 AWS SDK for Java V2 中添加了对 SSO 凭证提供程序的支持。旧版本的 SDK 不支持 SSO。 (参见 Feature RequestPR

如果您使用的是 maven,请通过在 dependencyManagement 部分中指定版本(如 documentation 中所述)来确保所有 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>