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

Springboot、测微计和Aws Lambda功能

西门飞翮
2023-03-14

我试图使用测微计向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\u ACCESS\u KEY\u ID和AWS\u SECRET\u ACCESS\u KEY。

那么,有没有什么方法可以告诉测微计使用不同的AwsCredentials提供程序,例如,EnvironmentVariableCredentialsProvider?

共有3个答案

梁巴英
2023-03-14

当您将aws-java-sdk-sts添加到您的依赖项(并且将其放在类路径上)时,将导致扩展的提供者链。然后应该使用执行角色。

对于maven:

<dependency>
    <groupId>com.amazonaws</groupId>
    <artifactId>aws-java-sdk-sts</artifactId>
    <version>1.12.52</version>
</dependency>

对于gradle:

implementation group: 'com.amazonaws', name: 'aws-java-sdk-sts', version: '1.12.52'
董畅
2023-03-14

经过一些研究,我能够通过创建一个定制的CloudWatchMeterRegistry bean来发送指标,如下所示:

@Bean
@Primary
public CloudWatchMeterRegistry customCloudWatchMeterRegistry(
        CloudWatchConfig config, Clock clock, AwsRegionProperties awsRegionProperties) {

    AmazonCloudWatchAsync amazonCloudWatchAsync = AmazonCloudWatchAsyncClient
            .asyncBuilder()
            .withCredentials(new EnvironmentVariableCredentialsProvider())
            .withRegion(awsRegionProperties.getStatic())
            .build();

    return new CloudWatchMeterRegistry(config, clock, amazonCloudWatchAsync);
}

如您所见,现在我可以配置自定义凭据提供程序,在我的示例中是EnvironmentVariableCredentialsProvider。

重要提示:bean的名称不应该是cloudWatchMeterRegistry,因为这个类是org。springframework。云aws。自动配置。指标。CloudWatchExportAutoConfiguration已经有一个使用该名称声明的bean。

管景天
2023-03-14

您是否尝试过使用Configuration文件来更改Bean

@Configuration
public class ManualAWSCredentialProviderConfiguration {
  @Value("${AWS_ACCESS_KEY_ID}")
  protected String accessKey;

  @Value("${AWS_SECRET_ACCESS_KEY}")
  protected String secretKey;

  @Bean
  @Primary
  public AWSCredentialsProvider buildAWSCredentialsProviderManually() {
    return new AWSStaticCredentialsProvider(
      new BasicAWSCredentials(accessKey, secretKey)
    );
  }
}
 类似资料:
  • 我是测微计新手。有人能告诉我如何在spring boot中集中管理微服务指标吗? 在哪里可以获得influxdb中所有注册的服务信息、矩阵和存储的度量?

  • 我想将Micrometer的默认执行器度量(JVM内存等)发送到AWS ElasticSearch实例,并在Kibana中可视化数据。 我想我的设置是正确的,但我没有得到数据在吉巴纳。 以下是我的配置: URL在应用程序中是硬编码的,我只是在这里删除了它。我使用的url来自ES域的AWS仪表板,其中列出: 但是使用这个配置,我还没有能够得到任何数据显示在Kibana。 其他注意事项:我知道Micr

  • 关于带有@Counted和@ExceptionHandler的Java测微计的快速问题。 我有一个非常简单的@ExceptionHandler: 我认为这种组合非常有趣,因为它提供了异常发生的可见性。我们可以建立仪表板,警报等,相当酷。 不幸的是,当我查看生成的指标时,它类似于: 我对例外="没有"和结果="成功"感到很困惑 我可以问一下,这些值是如何首先进入度量的吗? 此外,如何将它们更改为更有

  • 使用我将跟踪的请求大小的摘要 < li >请求总数 < li >总请求大小总计 < li >最大请求大小 我可以这样做 但是,我可以使用计数器和最大尺寸的量规来实现相同的效果 问题是,除了更短之外,总结比更长的解决方案有什么好处吗?

  • 本文向大家介绍js仿微博实现统计字符和本地存储功能,包括了js仿微博实现统计字符和本地存储功能的使用技巧和注意事项,需要的朋友参考一下 随着移动设备和Web应用的普及,为了更好的便于用户的使用,对于网页或应用程序的用户体验要求就越来越高,确实是这样,作为用户更喜欢选择用户体验效果好的网站或应用程序,所以作为开发者的我们就需要开发出更人生化的应用程序了。 相信许多人有使用微博的经验,像微博这样的社交

  • 我们有一个奇特的监控系统,我们的Spring启动服务将指标发布到带有千分尺的流入数据库中。有一个很好的grafana前端,但问题是我们现在正处于这样一个阶段,我们必须在其他服务中获得一些可用的指标来进行推理。整个系统是由我的前任建立的,我目前对它的理解几乎为零。我可以添加和发布新的指标,但我一生都不能从中得到任何东西。 下面是一个简短示例:我们的网关会为摄像机发布到它的每张图像递增计数器。计数器的