souvikc
souvikc

Reputation: 1031

Spring boot startup error for AWS application : There is not EC2 meta data available

I am getting the below error when I am trying to run a Spring boot-AWS application locally :

There is not 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

My aws-config.xml looks like below :

<aws-context:context-credentials>
<aws-context:simple-credentials access-key="*****" secret-key="*****"/>
</aws-context:context-credentials>  
<aws-context:context-region auto-detect="false" region="ap-south-1" />  
<aws-context:context-resource-loader/>  
<aws-messaging:annotation-driven-queue-listener max-number-of-messages="10" wait-time-out="20" visibility-timeout="3600"/> 

I am trying to listen with a SQSListner in the below class :

@Configuration
@EnableSqs
@ImportResource("classpath:/aws-config.xml")
@EnableRdsInstance(databaseName = "******", 
               dbInstanceIdentifier = "*****", 
               password = "******")
public class AwsResourceConfig {
    @SqsListener(value = "souviksqs", deletionPolicy = SqsMessageDeletionPolicy.ON_SUCCESS)
    public void receiveNewFileUpload(S3EventNotification event) {
        try {
            if ( event != null && !CollectionUtils.isNullOrEmpty( event.getRecords() ) && event.getRecords().get( 0 ) != null ) {
                S3Entity entry = event.getRecords().get(0).getS3();
                System.out.println("############ File Uploaded to ###################### " + entry.getBucket().getName() + "/" + entry.getObject().getKey());
            }
        } catch (Exception e) {
            System.out.println("Error reading the SQS message " + e);
            
        }
    }
}

Edit : Just noticed that the error comes when I include the following aws-messaging maven dependency :

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-aws-messaging</artifactId>
     <version>${spring-cloud-aws-version}</version>
</dependency>

I am using spring-cloud-aws-version - 1.2.1.RELEASE

Upvotes: 47

Views: 36415

Answers (8)

theINtoy
theINtoy

Reputation: 3658

Using the information from souvikc and an answer from another question, I came up with (I'll take the hard coded region out eventually but just elated it finally works!):


@Configuration
@EnableContextInstanceData
@EnableSqs
@Profile("!local")
@Slf4j
public class AwsEc2Config {

    @Bean
    public RegionProvider regionProvider() {
        return new StaticRegionProvider("eu-west-1");
    }

    @Bean
    public SimpleMessageListenerContainerFactory simpleMessageListenerContainerFactory(AmazonSQSAsync amazonSQS) {
        SimpleMessageListenerContainerFactory factory = new SimpleMessageListenerContainerFactory();
        factory.setAmazonSqs(amazonSQS);
        factory.setMaxNumberOfMessages(10);
        factory.setAutoStartup(true);
        factory.setWaitTimeOut(20);

        return factory;
    }
}

Upvotes: 2

Naga
Naga

Reputation: 133

adding these properties to my application.properties in spring boot proj helped me.

cloud.aws.region.static=us-west-2
cloud.aws.region.auto=false
cloud.aws.stack.auto=false

Upvotes: 12

Micha&#235;l COLL
Micha&#235;l COLL

Reputation: 1287

using the response of @Shubham-Pandey you can add a VM option to run your app locally :

-Dcloud.aws.region.static=us-east-1

Upvotes: 0

Shubham Pandey
Shubham Pandey

Reputation: 1828

I was using springframework.cloud.aws.autoconfigure, got the same problem. The reason behind it is, we need to configure region manually when we run application in NON AWS ENVIRONMENT, ie. Local. So put this property in your application-local.properties and you should be good.

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

Upvotes: 85

priortd
priortd

Reputation: 49

I had the same issue and I was able to prevent spring cloud aws from auto configuring the region by adding this exclude on the Spring configuration.

    @SpringBootApplication(exclude = ContextRegionProviderAutoConfiguration.class)

Upvotes: 3

Robbo_UK
Robbo_UK

Reputation: 12129

If using application.yml I did it with the following

spring:
  application:
    name: App Name
  autoconfigure:
    exclude:
      - org.springframework.cloud.aws.autoconfigure.messaging.MessagingAutoConfiguration
      - org.springframework.cloud.aws.autoconfigure.context.ContextStackAutoConfiguration
      - org.springframework.cloud.aws.autoconfigure.context.ContextRegionProviderAutoConfiguration

Upvotes: 11

Titans
Titans

Reputation: 71

I also faced the same issue but it did not get resolved after adding the aws region property. I was able to resolved the same when I removed spring-cloud-starter-aws dependency from my pom

Upvotes: 2

souvikc
souvikc

Reputation: 1031

Found the Issue. I was using spring-cloud-starter-aws-messaging for SQS messaging. The above dependency includes many Auto Detect classes which eventually was firing up even if they were not required.

Instead I have used spring-cloud-aws-messaging which solved the issue along with many other auto detect issues.

Upvotes: 24

Related Questions