【发布时间】:2021-08-21 21:39:56
【问题描述】:
我正在尝试使用千分尺将指标发送到 AWS cloudwatch,但是,我遇到了 AWS 凭证问题。
ERROR i.m.c.CloudWatchMeterRegistry - error sending metric data.
com.amazonaws.SdkClientException: Unable to load AWS credentials from any provider in the chain:
[com.amazonaws.auth.EC2ContainerCredentialsProviderWrapper@b23c49d: Failed to connect to service endpoint: , com.amazonaws.auth.profile.ProfileCredentialsProvider@7edf67de: profile file cannot be null]
at com.amazonaws.auth.AWSCredentialsProviderChain.getCredentials(AWSCredentialsProviderChain.java:136)r
at com.amazonaws.http.AmazonHttpClient$RequestExecutor.getCredentialsFromContext(AmazonHttpClient.java:1257)r
at com.amazonaws.http.AmazonHttpClient$RequestExecutor.runBeforeRequestHandlers(AmazonHttpClient.java:833)r
at com.amazonaws.http.AmazonHttpClient$RequestExecutor.doExecute(AmazonHttpClient.java:783)r
at com.amazonaws.http.AmazonHttpClient$RequestExecutor.executeWithTimer(AmazonHttpClient.java:770)r
at com.amazonaws.http.AmazonHttpClient$RequestExecutor.execute(AmazonHttpClient.java:744)r
at com.amazonaws.http.AmazonHttpClient$RequestExecutor.access$500(AmazonHttpClient.java:704)r
at com.amazonaws.http.AmazonHttpClient$RequestExecutionBuilderImpl.execute(AmazonHttpClient.java:686)r at com.amazonaws.http.AmazonHttpClient.execute(AmazonHttpClient.java:550)r
at com.amazonaws.http.AmazonHttpClient.execute(AmazonHttpClient.java:530)r at com.amazonaws.services.cloudwatch.AmazonCloudWatchClient.doInvoke(AmazonCloudWatchClient.java:2587)r
at com.amazonaws.services.cloudwatch.AmazonCloudWatchClient.invoke(AmazonCloudWatchClient.java:2554)r
at com.amazonaws.services.cloudwatch.AmazonCloudWatchClient.invoke(AmazonCloudWatchClient.java:2543)r
at com.amazonaws.services.cloudwatch.AmazonCloudWatchClient.executePutMetricData(AmazonCloudWatchClient.java:2297)r
at com.amazonaws.services.cloudwatch.AmazonCloudWatchAsyncClient$27.call(AmazonCloudWatchAsyncClient.java:1215)r
at com.amazonaws.services.cloudwatch.AmazonCloudWatchAsyncClient$27.call(AmazonCloudWatchAsyncClient.java:1209)r
at java.base/java.util.concurrent.FutureTask.run(Unknown Source)r
at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)r at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)r
at java.base/java.lang.Thread.run(Unknown Source)r
AmazonHttpClient 正在尝试使用 EC2ContainerCredentialsProviderWrapper 或 ProfileCredentialsProvider 检索凭证,但在 lambda 环境中,凭证可通过执行角色获得,而且我们有名为 AWS_ACCESS_KEY_ID 和 AWS_SECRET_ACCESS_KEY 的特定环境变量.
那么,有什么方法可以告诉 micrometer 使用不同的 AwsCredentials 提供程序,例如 EnvironmentVariableCredentialsProvider?
【问题讨论】:
-
您不能在提供
CredentialProvider的@Configuration文件中创建@Bean吗? -
您是如何创建
CloudWatchMeterRegistry的?自定义CloudWatchAsyncClient应该传递给它,然后它可以使用您想要的任何凭据提供程序。 -
@DejanPeretin 我不是自己创建的,它是作为
CloudWatchExportAutoConfiguration中的 bean 提供的。您能否发布创建自定义 CloudWatchMeterRegistry 所需的答案? -
@DejanPeretin 创建我的自定义 CloudWatchMeterRegistry bean 后,一切都开始工作了。我昨天试过了,但没有成功,因为 Terraform 没有更新我的 lambda 函数的代码。无论如何,它现在可以工作了,谢谢。
标签: spring-boot amazon-cloudwatch spring-boot-actuator micrometer spring-micrometer