0

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

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

原因: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 上(使用 Spring 配置文件)时,除了我使用DefaultAWSCredentialsProviderChain之外,我执行与上述相同的操作,也许这就是问题所在?但我不确定如何在“Fargate”中运行时从 spring aws 自动装配AmazonS3对象,但在本地运行时则不然。

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

4

1 回答 1

0

在一位同事的帮助下,我们找到了解决这个问题的方法,我不确定它是否 100% 正确,但它对我有用,也是我决定要做的。在我的 applictaion.properties 我添加了以下几行

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

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

于 2019-07-22T17:56:36.760 回答