无法在 EC2 实例上加载 AWS 凭证
Unable to load AWS credentials on EC2 Instance
申请
Spring 中的简单 REST API 注册服务,发送正确的 POST 请求后,新用户在数据库中创建,Amazon SES 发送一封注册电子邮件 link 验证。
问题
在我的 OS (Windows) 应用程序中设置局部变量(AWS_ACCESS_KEY_ID
、AWS_SECRET_ACCESS_KEY
和 AWS_DEFAULT_REGION
)后,本地工作正常,但是问题在部署后开始。我在 AWS 上有一个 Amazon Linux AMI 的 EC2 实例:
- 在 AWS Identity and Access Management (IAM) 创建用户,授予 AmazonSESFullAccess 角色
- 通过 CMD 使用带有私钥文件 *.pem 的 shh 进行记录
- 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' 命令
[=46= 重新配置了它]
一直出现异常,不知怎么的应用程序无法获取环境变量,我已经纠结了5个多小时,希望有人来救我...
一段代码(在本地工作正常):
AmazonSimpleEmailService client =
AmazonSimpleEmailServiceClientBuilder
.standard()
.withCredentials(DefaultAWSCredentialsProviderChain.getInstance())
.withRegion(Regions.EU_CENTRAL_1)
.build();
我完全是 Linux 菜鸟,在使用简单命令时遇到问题,所以请谨慎对待需要一些控制台命令的解决方案。
如果您是 运行 EC2 上的应用,请不要使用 IAM 用户。
而是创建具有相同权限的 IAM 角色,并将该角色分配给实例。如果应用程序使用 AWS SDK,它将能够毫无问题地获取凭证。
在您的情况下,问题可能是应用程序的环境与您的环境不同,如果您在 bash 会话中导出凭据,如果它在不同的用户或 bash 会话下加载,它将不会传递给应用程序。
DefaultAWSCredentialsProvider 有多个地方可以查找凭据。您可以设置一个凭据配置文件,而不是将您的凭据设置为环境变量。请参阅此文档:Working with AWS Credentials.
确保你有AWS CLI installed,然后你可以运行以下命令来配置你的配置文件:aws configure
单击 here 获取有关 aws configure 命令的文档。
如果您已经配置了您的 aws 配置文件但它仍然不起作用,您很可能为错误的 linux 用户配置了配置文件。例如,如果名为 tomcat8 的 linux 用户是 运行 宁你的 tomcat 实例的用户,那么你需要在 /home/tomcat8/.aws/credentials/
申请
Spring 中的简单 REST API 注册服务,发送正确的 POST 请求后,新用户在数据库中创建,Amazon SES 发送一封注册电子邮件 link 验证。
问题
在我的 OS (Windows) 应用程序中设置局部变量(AWS_ACCESS_KEY_ID
、AWS_SECRET_ACCESS_KEY
和 AWS_DEFAULT_REGION
)后,本地工作正常,但是问题在部署后开始。我在 AWS 上有一个 Amazon Linux AMI 的 EC2 实例:
- 在 AWS Identity and Access Management (IAM) 创建用户,授予 AmazonSESFullAccess 角色
- 通过 CMD 使用带有私钥文件 *.pem 的 shh 进行记录
- 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' 命令
[=46= 重新配置了它]一直出现异常,不知怎么的应用程序无法获取环境变量,我已经纠结了5个多小时,希望有人来救我...
一段代码(在本地工作正常):
AmazonSimpleEmailService client =
AmazonSimpleEmailServiceClientBuilder
.standard()
.withCredentials(DefaultAWSCredentialsProviderChain.getInstance())
.withRegion(Regions.EU_CENTRAL_1)
.build();
我完全是 Linux 菜鸟,在使用简单命令时遇到问题,所以请谨慎对待需要一些控制台命令的解决方案。
如果您是 运行 EC2 上的应用,请不要使用 IAM 用户。
而是创建具有相同权限的 IAM 角色,并将该角色分配给实例。如果应用程序使用 AWS SDK,它将能够毫无问题地获取凭证。
在您的情况下,问题可能是应用程序的环境与您的环境不同,如果您在 bash 会话中导出凭据,如果它在不同的用户或 bash 会话下加载,它将不会传递给应用程序。
DefaultAWSCredentialsProvider 有多个地方可以查找凭据。您可以设置一个凭据配置文件,而不是将您的凭据设置为环境变量。请参阅此文档:Working with AWS Credentials.
确保你有AWS CLI installed,然后你可以运行以下命令来配置你的配置文件:aws configure
单击 here 获取有关 aws configure 命令的文档。
如果您已经配置了您的 aws 配置文件但它仍然不起作用,您很可能为错误的 linux 用户配置了配置文件。例如,如果名为 tomcat8 的 linux 用户是 运行 宁你的 tomcat 实例的用户,那么你需要在 /home/tomcat8/.aws/credentials/