【问题标题】:Unable to load AWS credentials on EC2 Instance无法在 EC2 实例上加载 AWS 凭证
【发布时间】:2020-04-26 17:23:33
【问题描述】:

应用程序

Spring 中的简单 REST API 注册服务,发送正确的 POST 请求后,在数据库中创建新用户,Amazon SES 发送一封带有注册链接的电子邮件以进行验证。

问题

在我的操作系统 (Windows) 应用程序中设置局部变量(AWS_ACCESS_KEY_IDAWS_SECRET_ACCESS_KEYAWS_DEFAULT_REGION)后本地运行正常,但问题在部署后开始。我在 AWS 上有一个带有 Amazon Linux AMI 的 EC2 实例:

  • 在 AWS Identity and Access Management (IAM) 创建用户,授予 AmazonSESFullAccess 角色
  • 通过 CMD 使用 shh 和私钥文件 *.pem 进行日志记录
  • Tomcat8 服务已启动
  • MySQL 服务已启动
  • 已部署应用程序 *.war 文件
  • 使用“export”命令创建了环境变量,我检查了“printenv”以确保一切正常
  • 发送 POST 请求后出现异常(如下),这意味着用户已创建,但 Amazon SES 未发送电子邮件确认,因为无法进行身份验证
{
    "timestamp": "2020-04-26T15:44:44.010+0000",
    "message": "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: To use assume role profiles the aws-java-sdk-sts module must be on the class path., com.amazonaws.auth.profile.ProfileCredentialsProvider@23fac1a3: profile file cannot be null, com.amazonaws.auth.EC2ContainerCredentialsProviderWrapper@68aa5a98: The requested metadata is not found at http://169.254.169.254/latest/meta-data/iam/security-credentials/]"
}
  • 我再次检查了我的 EC2 实例上的本地环境变量,它看起来很好,但为了确保我使用“aws configure”命令重新配置了它

  • 异常不断出现,不知何故应用程序无法获取环境变量,我已经为此奋斗了 5 个多小时,所以希望有人能来救我...

一段代码(在本地运行良好):

        AmazonSimpleEmailService client =
                AmazonSimpleEmailServiceClientBuilder
                        .standard()
                        .withCredentials(DefaultAWSCredentialsProviderChain.getInstance())
                        .withRegion(Regions.EU_CENTRAL_1)
                        .build();

我完全是 Linux 菜鸟,对简单命令有问题,所以请对需要一些控制台命令的解决方案保持温和。

【问题讨论】:

  • 运行 printenv 以列出所有环境变量并共享/验证 AWS 密钥是否存在。另外,还要检查 ~/.aws/credentials 文件
  • 根据报错你必须添加一些额外的依赖(aws-java-sdk-sts):WebIdentityTokenCredentialsProvider: To use assume role profiles the aws-java-sdk-sts module must be on the class path
  • @ChristopheRoussy 我相信他们只有在使用 AWS 配置文件时才需要包含该依赖项。我认为他们没有使用 AWS 配置文件,因为他们试图在服务器本地存储凭据。
  • 正如我所提到的,'printenv' 正确显示了设置变量。问题已通过@Oleksii Donoha 解决方案解决,感谢回复。

标签: java amazon-web-services amazon-ec2 amazon-ses


【解决方案1】:

如果您在 EC2 上运行应用程序,请不要使用 IAM 用户。

改为创建具有相同权限的 IAM 角色,并将该角色分配给实例。如果应用使用 AWS SDK,它将能够毫无问题地获取凭证。

在您的情况下,问题可能是应用程序的环境与您的不同,如果您在 bash 会话中导出凭据,如果它在不同的用户或 bash 会话下加载,它将不会传递给应用程序。

【讨论】:

  • 使用 AmazonsSESFullAccess 在 IAM 中创建角色并将其分配给 EC2 实例解决了该问题。我认为这可能是用户问题,但没想到解决方案如此简单......非常感谢。
  • 很高兴有帮助,请考虑将答案标记为解决方案 :)
  • 我会将声明从“您不必使用 IAM 用户”加强为“不要使用 IAM 用户”。
  • @jarmod 我的意思是,你可以,这是一种反模式,但你可以。但我同意,会编辑。
  • 谢谢,成功了!还要感谢@DEJG 的确认回复
【解决方案2】:

DefaultAWSCredentialsProvider 有多个地方会查找凭证。您可以设置凭据配置文件,而不是将凭据设置为环境变量。请参阅此文档:Working with AWS Credentials

确保您拥有AWS CLI installed,然后您可以运行以下命令来配置您的配置文件:aws configure

单击 here 获取有关 aws configure 命令的文档。

如果您已经配置了您的 aws 配置文件,但它仍然无法工作,那么您很可能为错误的 linux 用户配置了配置文件。例如,如果名为 tomcat8 的 linux 用户是运行您的 tomcat 实例的用户,那么您需要在 /home/tomcat8/.aws/credentials/ 处设置凭据配置文件

【讨论】:

  • 正如我所提到的,我已经使用 AWS CLI 通过使用“aws configure”来配置 AWS 凭证。设置了凭据,仍然发生错误。通过将 IAM 角色设置为 EC2 实例而不是用户,@Oleksii Donoha 回复解决了问题。
猜你喜欢
  • 1970-01-01
  • 2017-02-11
  • 2016-12-07
  • 1970-01-01
  • 2018-02-01
  • 2018-12-12
  • 1970-01-01
  • 2015-07-03
  • 2020-08-19
相关资源
最近更新 更多