24

I use the following Maven dependency which autoconfigures all necessary parameters to make my project work on AWS:

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-aws</artifactId>
    <version>1.2.2.RELEASE</version>
</dependency>

I don't have any critical functionality depending on AWS though, it's just to load a few files from S3 at runtime. So during local development (and also testing), I don't need any AWS autoconfiguration.

The logical error I get when running locally is:

...
Caused by: java.lang.IllegalStateException: There is no EC2 meta data available, because the application is not running in the EC2 environment. Region detection is only possible if the application is running on a EC2 instance
    at org.springframework.util.Assert.state(Assert.java:392) ~[spring-core-4.3.2.RELEASE.jar:4.3.2.RELEASE]
    at org.springframework.cloud.aws.core.region.Ec2MetadataRegionProvider.getRegion(Ec2MetadataRegionProvider.java:39) ~[spring-cloud-aws-core-1.2.2.RELEASE.jar:1.2.2.RELEASE]
    at org.springframework.cloud.aws.core.config.AmazonWebserviceClientFactoryBean.createInstance(AmazonWebserviceClientFactoryBean.java:98) ~[spring-cloud-aws-core-1.2.2.RELEASE.jar:1.2.2.RELEASE]
    at org.springframework.cloud.aws.core.config.AmazonWebserviceClientFactoryBean.createInstance(AmazonWebserviceClientFactoryBean.java:44) ~[spring-cloud-aws-core-1.2.2.RELEASE.jar:1.2.2.RELEASE]
...

Is there a clean, working solution for both testing and local development?

delucasvb
  • 5,393
  • 4
  • 25
  • 35

2 Answers2

25

I've solved this for tests using the surefire plugin:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-surefire-plugin</artifactId>
    <version>2.21.0</version>
    <configuration>
        <classpathDependencyExcludes>
            <classpathDependencyExcludes>org.springframework.cloud:spring-cloud-aws-autoconfigure</classpathDependencyExcludes>
        </classpathDependencyExcludes>
    </configuration>
</plugin>

Local development was solved setting the following variables as VM parameters or in the Spring Cloud Config Server:

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

You can use any value for cloud.aws.region.static, but there has to be one.

I read both solutions in different places and thought it might help someone in the future to see them combined here.

delucasvb
  • 5,393
  • 4
  • 25
  • 35
  • 2
    I was wondering if there was a solution based on spring profiles. For instances I have disabled the spring security for a specific profile by adding this: spring: autoconfigure: exclude: org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration – Enrico Giurin Jan 12 '19 at 18:18
2

This error occurs when you run an application locally with aws cloud autoconfig enabled

For me, following settings helped:

spring:
    autoconfigure:
        exclude:
            - org.springframework.cloud.aws.autoconfigure.context.ContextInstanceDataAutoConfiguration
            - org.springframework.cloud.aws.autoconfigure.context.ContextStackAutoConfiguration
            - org.springframework.cloud.aws.autoconfigure.context.ContextRegionProviderAutoConfiguration

cloud:
    aws:
        region:
            static: ap-south-1
        stack:
            auto: false

You can learn more about it here: Doc

OM Bharatiya
  • 1,840
  • 14
  • 23