当前位置: 首页 > 知识库问答 >
问题:

AWS SDK for Java v2无法从EC2实例加载凭据

汪翰墨
2023-03-14

我插入了我的AWS_ACCESS_KEY_ID,并在~/.aws/凭证AWS_SECRET_ACCESS_KEY,它们似乎有效。但是,我的 Java 应用程序(在该 EC2 实例上运行并使用 AWS Java v2 开发工具包)无法看到它们。我在使用java代码将文件上传到S3时遇到了此异常。

Unable to load credentials from any of the providers in the chain AwsCredentialsProviderChain(credentialsProviders=[SystemPropertyCredentialsProvider(), EnvironmentVariableCredentialsProvider(), WebIdentityTokenCredentialsProvider(), ProfileCredentialsProvider(), ContainerCredentialsProvider(), InstanceProfileCredentialsProvider()]) : [SystemPropertyCredentialsProvider(): Unable to load credentials from system settings. Access key must be specified either via environment variable (AWS_ACCESS_KEY_ID) or system property (aws.accessKeyId)., EnvironmentVariableCredentialsProvider(): Unable to load credentials from system settings. Access key must be specified either via environment variable (AWS_ACCESS_KEY_ID) or system property (aws.accessKeyId)., WebIdentityTokenCredentialsProvider(): Either the environment variable AWS_WEB_IDENTITY_TOKEN_FILE or the javaproperty aws.webIdentityTokenFile must be set., ProfileCredentialsProvider(): Profile file contained no credentials for profile 'default': ProfileFile(profiles=[]), ContainerCredentialsProvider(): Cannot fetch credentials from container - neither AWS_CONTAINER_CREDENTIALS_FULL_URI or AWS_CONTAINER_CREDENTIALS_RELATIVE_URI environment variables are set., InstanceProfileCredentialsProvider(): The requested metadata is not found at http://169.254.169.254/latest/meta-data/iam/security-credentials/]

仅供参考,在我的ec2实例中运行以下命令时,使用aws cli上传文件效果良好:<code>aws s3 cp foo。txt s3://mybucket名称

仅供参考,当我在本地机器上使用STS客户端作为凭证提供者运行相同的应用程序时,它可以正确运行

根据AWS文件,

使用默认凭据提供程序链在不提供任何参数的情况下初始化新的服务客户端时,AWS SDK for Java会尝试通过使用由defaultawscredialsproviderchain类实现的默认凭据提供程序链来查找AWS凭据。默认凭据提供程序链按以下顺序查找凭据:

>

  • 环境变量 - AWS_ACCESS_KEY_ID和AWS_SECRET_ACCESS_KEY。

    aws的Java系统属性。accessKeyId和aws.secretKey。

    来自环境或容器的Web身份令牌凭据。

    默认凭证配置文件-通常位于~/。aws/凭证(位置可能因平台而异),并由许多aws SDK和aws CLI共享。

    Amazon ECS容器凭据-如果设置了环境变量AWS_container_credentials_RELATIVE_URI,则从Amazon ECS加载。

    实例配置文件凭证——用于EC2实例,通过Amazon EC2元数据服务交付。

    如果我理解正确,默认凭证提供者链将为我做所有事情,无需提及任何凭证提供者。对吗?

  • 共有2个答案

    班安平
    2023-03-14

    除非绝对必要,否则不要在EC2上使用IAM用户凭据。相反,使用适当的IAM角色启动EC2实例(或稍后编辑实例以应用IAM角色)。

    然后,SDK将自动检索凭据,并自动为您轮换凭据(不像IAM用户凭据是固定的,因此您的暴露程度更高)。您不需要指明要使用哪个凭据提供程序。SDK会帮你做到这一点。

    而且,不言而喻,始终为 IAM 角色提供其实际需要的最小权限集。

    如果您觉得必须使用IAM用户凭据,则这些凭据可以存储在~/. aws/凭据文件中,但请确保它位于您的应用程序将运行的同一操作系统用户的HOME文件夹下,否则您的应用程序加载的AWS SDK将无法检索凭据。

    淳于升
    2023-03-14

    不要在. aws下使用凭据文件,而是尝试设置EC2环境变量。这是一个有效的信用提供程序,在AWS SDK forJavaV2 DEV Guide中被描述为环境变量提供程序。

    要将此提供程序与 AWS Java v2 服务客户端配合使用,请使用:

    Region region = Region.US_EAST_1;
         RdsDataClient dataClient = RdsDataClient.builder()
                   .credentialsProvider(EnvironmentVariableCredentialsProvider.create())
                    .region(region)
                    .build(); 
    

    此解决方案运行良好。

     类似资料:
    • 问题内容: 我正在尝试从EC2实例i-78a8df00连接到RDS实例mysql。**。us- east-1.rds.amazonaws.com。他们俩都在美国东部地区。我将EC2实例的安全组(sg- **)添加到RDS安全组,但这无济于事。这似乎是防火墙/ DNS问题,因为运行此命令时超时: 错误2003(HY000):无法连接到“ mysql。**。us- east-1.rds.amazona

    • 从EC2实例i-78a8df00中,我正在尝试连接到RDS实例他们都在美国东部地区。我将EC2实例的安全组(SG-*********)添加到RDS安全组中,但这没有帮助。运行此命令时超时,可能是防火墙/DNS问题: 错误2003(HY000):无法连接到“ 我可以从我的本地机器使用与上面相同的线路连接到RDS实例。我尝试了各种论坛解决方案,但那些都没有帮助。

    • 我已经对一个使用亚马逊 SQS 的 Java Spring启动 (v1.4.2) 应用程序进行了泊坞化(通过Spring云启动器-aws-消息传递 v1.1.3,它拉入了 aws-java-开发工具包-sqs v1.11.18)。现在,为了向应用程序提供对 AWS 的访问权限,我遵循以下模式: 这通常允许我绕过例外:。 我的问题是:当我将此服务部署到服务器时,我收到由com.amazonaws引起

    • 我已经创建了AWS ec2实例并关联到一个安全组。在关联的安全组中,我已经向所有人开放了HTTP(HTTP, TCP,80,0.0.0.0/0)、SSH(SSH, TCP,22,0.0.0.0/0)和ICMP(All ICMP, All, N/A,0.0.0.0/0)。 但当我尝试ping到实例时,它失败了;给出请求超时。入站规则设置 此外,使用PuTTY或openssh连接到实例也会失败。它给出

    • 我使用terraform创建了一个新的EC2实例来安装vertica,但无法在实例中访问Internet或pinggoogle.com。 我已使用私有子网设置了 ec2 实例,并使用公有子网设置了 nat 网关。 主路由表允许 0.0.0.0/0 作为目标,目标作为 nat 网关。另一个路由表将子网关联作为私有子网 10.103.2.0/24。互联网网关也连接到 VPC。 我的ec2实例安全组允许