Spring Boot AWS cloudwatch和S3冲突(?)问题

时间:2019-07-14 21:15:47

标签: spring spring-boot amazon-s3 spring-cloud-aws

问题陈述
AWS'Fargate'应用程序可与aws执行器正常工作,但在添加s3支持时无法启动

详细信息
我有一个在AWS Fargate上运行的应用程序,它正在使用 spring-cloud-aws-actuator spring-cloud-starter-aws 程序包。
该应用程序在“ fargate”和本地(使用management.metrics.export.cloudwatch.enabled=false)中运行时,运行 fine 。我最近添加了从S3存储桶中读取数据的支持,可以在本地测试此代码运行良好,但是当我将其部署为“替代”时,应用程序将无法启动,并出现以下错误。

  

原因:org.springframework.beans.factory.BeanCreationException:
  创建在类路径资源[org / springframework / cloud / aws / autoconfigure / metrics / CloudWatchExportAutoConfiguration.class]中定义的名称为'amazonCloudWatchAsync'的bean时出错:   调用init方法失败;嵌套的异常是java.lang.IllegalStateException:
  没有可用的EC2元数据,因为该应用程序未在EC2环境中运行。仅当应用程序在EC2实例上运行时,才可以进行区域检测

由于此方法以前可行,所以我添加了S3代码,我只能推测问题与新代码有关,但是我真的不知道从哪里开始对此问题进行解决。

我做什么
在该程序中,我添加了代码以检查我是在本地运行还是在AWS中运行。如果我在本地运行,则使用 ProfileCredentialsProvider 创建一个 AmazonS3 对象,例如

           // running locally, create our own credentials
           AmazonS3 s3 = AmazonS3ClientBuilder.standard()
                    .withCredentials(new ProfileCredentialsProvider("myprofile"))
                    .withRegion(Regions.US_EAST_1)
                    .build();

当我检测到我正在使用AWS上的AWS(使用Spring配置文件)时,除了我使用 DefaultAWSCredentialsProviderChain 以外,其他操作与上述相同,也许是问题所在?但是我不确定如何在“ Fargate”中运行而不是在本地时从spring aws自动连接 AmazonS3 对象。

建议?
我知道以上内容含糊不清,如果您让我知道有什么帮助,很高兴提供更多详细信息。话虽这么说,我正在寻找一种在本地运行我的应用程序(用于测试)的方法,该方法允许我访问S3存储桶并禁用cloudwatch致动器代码,但允许在“ Fargate”环境中运行时同时使用这两种代码。

1 个答案:

答案 0 :(得分:0)

在同事的帮助下,我们找到了解决方法,我不确定它是否100%正确,但是它对我有用,并且是我决定要做的事情。在我的applictaion.properties中,添加了以下几行

cloud.aws.region.static=us-east-1
cloud.aws.stack.auto=false

设置静态区域似乎不正确,但是显然Spring CloudWatch代码没有检测到它正在ECS Fargate环境中运行,因此这是我们唯一能看到的。