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

AWS实例配置文件不适用于Spring Cloud AWS

锺离慈
2023-03-14

我有一个小型Spring Boot应用程序,使用Spring Cloud AWS(1.0.0.release)访问SQS队列。它被部署在一个设置了实例配置文件的EC2实例上。AWS方面的工作似乎是正常的,因为我可以访问相关的元数据链接:iam/infoiam/security-credentials/role-name,它们确实包含正确的信息。为了确定起见,我已经使用了aws cmdline实用程序(aws sqs列表-队列),它确实有效,所以我想安装是可以的。但是,当应用程序启动时,它会读取application.properties(其中包含cloud.aws.credentials.instanceprofile=true)行,然后删除以下警告:com.amazonaws.util.ec2metadatautils:无法检索请求的元数据,最后抛出以下异常:

Caused by: com.amazonaws.AmazonServiceException: The security token included in the request is invalid. (Service: AmazonSQS; Status Code: 403; Error Code: InvalidClientTokenId; Request ID: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx)
        at com.amazonaws.http.AmazonHttpClient.handleErrorResponse(AmazonHttpClient.java:1071)
        at com.amazonaws.http.AmazonHttpClient.executeOneRequest(AmazonHttpClient.java:719)
        at com.amazonaws.http.AmazonHttpClient.executeHelper(AmazonHttpClient.java:454)
        at com.amazonaws.http.AmazonHttpClient.execute(AmazonHttpClient.java:294)
        at com.amazonaws.services.sqs.AmazonSQSClient.invoke(AmazonSQSClient.java:2291)
        at com.amazonaws.services.sqs.AmazonSQSClient.getQueueUrl(AmazonSQSClient.java:516)
        at com.amazonaws.services.sqs.buffered.AmazonSQSBufferedAsyncClient.getQueueUrl(AmazonSQSBufferedAsyncClient.java:278)
        at org.springframework.cloud.aws.messaging.support.destination.DynamicQueueUrlDestinationResolver.resolveDestination(DynamicQueueUrlDestinationResolver.java:78)
        at org.springframework.cloud.aws.messaging.support.destination.DynamicQueueUrlDestinationResolver.resolveDestination(DynamicQueueUrlDestinationResolver.java:37)
        at org.springframework.messaging.core.CachingDestinationResolverProxy.resolveDestination(CachingDestinationResolverProxy.java:88)
        at org.springframework.cloud.aws.messaging.listener.AbstractMessageListenerContainer.start(AbstractMessageListenerContainer.java:295)
        at org.springframework.cloud.aws.messaging.listener.SimpleMessageListenerContainer.start(SimpleMessageListenerContainer.java:38)
        at org.springframework.context.support.DefaultLifecycleProcessor.doStart(DefaultLifecycleProcessor.java:173)
        ... 17 common frames omitted

...这意味着由于某种原因,Spring Cloud AWS无法获得实例配置文件凭据。我已经在com.amazonaws.request上启用了debug日志级别,并且发送请求时似乎没有访问密钥和密钥。

DEBUG --- com.amazonaws.request                    : Sending Request: POST https://sqs.eu-west-1.amazonaws.com / Parameters: (Action: GetQueueUrl, Version: 2012-11-05, QueueName: xxxxxxxxxxxxx, ) Headers: (User-Agent: aws-sdk-java/1.9.3 Linux/3.14.35-28.38.amzn1.x86_64 Java_HotSpot(TM)_64-Bit_Server_VM/25.45-b02/1.8.0_45 AmazonSQSBufferedAsyncClient/1.9.3, )

有谁知道我遗漏了什么,或者至少有什么提示如何进一步调试它吗?

编辑:在浏览了一下spring-cloud-aws代码之后,我有点向前迈进了。与jar捆绑在一起的配置文件application.properties有一些accesskeysecretkey的文本值。我定制的application.properties没有这些属性,这可能导致spring使用绑定文件中的值作为默认值。我将它们包含在空值中,这将异常更改为com.amazonaws.AmazonClientException:无法从链中的任何提供者加载AWS凭据。AWS SDK似乎配置了DefaultProviderChain,但它仍然无法获取实例配置文件凭据。

共有1个答案

鲍健柏
2023-03-14

这个问题的解决办法来自两个截然不同的事实。

>

  • 实例配置文件凭据将仅在application.propertiesinstanceprofile属性设置为true和将accesskey设置为null(ContextCredentialsAutoConfiguration)时使用。

    即使您将提供自定义的application.properties文件,Spring也将读取与app jar捆绑在一起的application.properties文件(如果存在的话)。如果是这种情况,来自两个文件的属性将汇总起来创建一个执行环境。我怀疑首先解析绑定文件,然后再解析自定义文件,覆盖绑定文件中存在的任何属性。

    在我的例子中,捆绑的application.properties有accessKey和secretKey占位符(带有假值),开发人员只要想在EC2环境之外进行测试,就会填写这些占位符。这使得accessKey不为空,因此排除了实例配置文件路径。我只是从jar中删除了application.properties文件,这就解决了问题。

  •  类似资料:
    • 我将nginx设置为一种静态文件服务器。出于某种原因,只有当我去123.123.123.123/或123.123.123.123时,它才会起作用。然而,当我去123.123.123.123/static/content/或123.123.123.123/static/content/another.mp3它返回404未找到。下面是位于中并链接到的配置文件。我真的很困惑为什么它不起作用。 如有任何指

    • 从EC2实例中使用AWS CLI时,如何指定要使用实例配置文件凭据?文件说: 这是自动的还是我需要调用元数据服务并将返回的凭据保存到文件...然后进行调用?

    • 我已经看过并尝试了几乎所有关于这个话题的其他帖子,但运气不好。 我使用的是python 3.6,所以我使用的是以下AMI

    • 我试图初始化log4j记录器使用SpringIOC和使用财产onfigurator.configure配置记录器,但财产onfigurator.configure不工作。 我的问题是如何将配置(log4j.properties)传递给Logger类? 波姆。xml 混淆班 log4j。性质

    • 我有用React编写的自定义组件库(汇总构建)。我不想在外部项目中使用creategbloalstyle BCS它的性能不佳。我添加了带有font-face(相对路径)的CSS文件,但这些字体在外部项目中不起作用。你知道如何修复它吗?src > 指数css带 @字体{字体系列:“font1”;字体显示:交换;字体重量:900;src:url(assets/font1/heavy/heavy.wof

    • 本文向大家介绍VC读配置文件实例,包括了VC读配置文件实例的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了VC读配置文件的方法,分享给大家供大家参考。具体实现方法如下: 配置文件格式: 希望本文所述对大家的VC程序设计有所帮助。