【问题标题】:AWS Java SDK not finding profile when using AWS SSO使用 AWS SSO 时 AWS Java SDK 未找到配置文件
【发布时间】:2021-01-11 16:58:00
【问题描述】:

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

谢谢。

【问题讨论】:

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


    【解决方案1】:

    对于 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
    

    【讨论】:

      【解决方案2】:

      我可能是错的,但是 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

      【讨论】:

        【解决方案3】:

        就我而言,只需添加 aws-sso 依赖项:

            <dependency>
               <groupId>software.amazon.awssdk</groupId>
               <artifactId>sso</artifactId>
            </dependency>
        

        允许默认凭据提供程序链在ProfileCredentialsProvider 下获取 sso:

        要开箱即用,您需要指定[default] 配置文件。否则,简单地使用.credentialsProvider(ProfileCredentialsProvider.create("xyz")) 也适用于[profile xyz]

        如果全部失败,请手动添加凭据提供程序:

        1. 设置您的个人资料文件.aws/config
        2. 使用cli登录aws sso login --profile &lt;your_profile&gt;
        3. .aws/sso/cache 中生成一个json 文件,其内容如here 所述
        {
         "startUrl": "https://my-sso-portal.awsapps.com/start",
         "region": "us-east-1",
         "accessToken": "eyJlbmMiOiJBM….",
         "expiresAt": "2020-06-17T10:02:08UTC"
        }
        
        1. 在您的项目中包含对software.amazon.awssdk:sso 的依赖项
        2. 使用 json 文件中的数据创建 SsoCredentialsProvider
        CredentialsProvider ssoCredentialsProvider = ((SsoCredentialsProvider.Builder) SsoCredentialsProvider.builder())
        .ssoClient(SsoClient.builder().region(<REGION_FROM_JSON>).build())
        .refreshRequest( () ->
            GetRoleCredentialsRequest.builder()
              .roleName("<ROLE_FROM_PROFILE>")
              .accountId("<ACCOUNT_ID_FROM_PROFILE>")
              .accessToken("<ACCESS_TOKEN_FROM_JSON>")
              .build()
        ).build();
        

        【讨论】:

          【解决方案4】:

          等待 SDK 2 集成 SSO,aws-sso-cred-restore 是一种解决方法:

          安装它(使用 Python 3):

          pip3 install aws-sso-cred-restore
          

          然后你可以运行它(它会得到一个可用 1 小时左右的 Token,所以你应该每小时运行一次来​​刷新):

          aws-sso-cred-restore --profile $YOUR_PROFILE
          

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

          【讨论】:

            【解决方案5】:

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

            如果您使用的是 maven,请确保所有 SDK 模块的版本都兼容,方法是在 dependencyManagement 部分指定版本,如documentation 中所述。例如

            <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>
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2019-06-16
              • 2019-11-21
              • 2017-12-03
              • 2020-12-14
              • 2021-04-27
              • 1970-01-01
              • 2018-02-09
              相关资源
              最近更新 更多