应用程序
Spring中的简单REST API注册服务,在发送正确的POST请求后,将在数据库中创建新用户,并且Amazon SES发送带有注册链接的电子邮件以进行验证。
问题
在我的OS(Windows)应用程序中设置局部变量(AWS_ACCESS_KEY_ID
,AWS_SECRET_ACCESS_KEY
和AWS_DEFAULT_REGION
之后,在本地工作正常,但是问题在部署它后开始。我在AWS上的Amazon Linux AMI上有一个EC2实例:
{
"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新手,使用简单的命令会遇到问题,因此请谨慎使用需要一些控制台命令的解决方案。
答案 0 :(得分:2)
如果您在EC2上运行应用程序,请不要使用IAM用户。
相反,创建具有相同权限的IAM 角色,然后将该角色分配给实例。如果应用程序使用AWS开发工具包,它将能够毫无问题地获取凭证。
在您的情况下,问题可能是应用程序的环境与您的环境不同,如果您在bash会话中导出凭据,则在将其加载到其他用户或bash会话下时,它不会传递给应用程序。
答案 1 :(得分:0)
DefaultAWSCredentialsProvider在多个位置将查找凭据。您可以设置凭据配置文件,而不是将凭据设置为环境变量。请参阅此文档:Working with AWS Credentials。
确保您拥有AWS CLI installed,然后可以运行以下命令来配置您的配置文件: aws configure
单击here以获得aws configure命令的文档。
如果您已经配置了aws配置文件,但仍然无法正常工作,则很可能已为错误的linux用户配置了该配置文件。例如,如果一个名为tomcat8的Linux用户是正在运行您的tomcat实例的用户,那么您需要在/home/tomcat8/.aws/credentials /
上设置凭据配置文件