2016-07-29 55 views
1

我正试图在Elastic Beanstalk上运行“hello world”复杂性的Web应用程序。使用Elastic Beanstalk上的Spring Boot做这件事情没有任何问题。是否可以在Elastic Beanstalk上运行Spring Cloud AWS应用程序?

但是当我尝试使用Spring AWS云,我遇到无数的问题。参考指南从来没有提到在Beanstalk上运行是可能的,所以也许我正在吠叫错误的树?

问题的根源我似乎遇到是stackResourceRegistryFactoryBean试图确定正在使用的“堆栈”时吹起来 - 即CloudFormation堆栈。但我正在使用Elastic Beanstalk,而不是CloudFormation。根的例外是:

Caused by: org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.springframework.cloud.aws.core.env.stack.config.StackResourceRegistryFactoryBean]: Factory method 'stackResourceRegistryFactoryBean' threw exception; nested exception is java.lang.IllegalAccessError: tried to access class org.springframework.cloud.aws.core.env.stack.config.AutoDetectingStackNameProvider from class org.springframework.cloud.aws.autoconfigure.context.ContextStackAutoConfiguration$StackAutoDetectConfiguration 
    at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:189) 
    at org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod(ConstructorResolver.java:588) 
    ... 89 more 
Caused by: java.lang.IllegalAccessError: tried to access class org.springframework.cloud.aws.core.env.stack.config.AutoDetectingStackNameProvider from class org.springframework.cloud.aws.autoconfigure.context.ContextStackAutoConfiguration$StackAutoDetectConfiguration 
    at org.springframework.cloud.aws.autoconfigure.context.ContextStackAutoConfiguration$StackAutoDetectConfiguration.stackResourceRegistryFactoryBean(ContextStackAutoConfiguration.java:71) 
    at org.springframework.cloud.aws.autoconfigure.context.ContextStackAutoConfiguration$StackAutoDetectConfiguration$$EnhancerBySpringCGLIB$$432c7658.CGLIB$stackResourceRegistryFactoryBean$0(<generated>) 
    at org.springframework.cloud.aws.autoconfigure.context.ContextStackAutoConfiguration$StackAutoDetectConfiguration$$EnhancerBySpringCGLIB$$432c7658$$FastClassBySpringCGLIB$$47c6e7d2.invoke(<generated>) 
    at org.springframework.cglib.proxy.MethodProxy.invokeSuper(MethodProxy.java:228) 
    ... 

没有出现在生成的EC2实例标签为“AWS:cloudformation:堆栈ID”和“AWS:cloudformation:堆栈名称”如果是相关的,我的理解是Beanstalk在幕后使用CloudFormation堆栈。我已经尝试通过@EnableStackConfiguration手动指定堆栈的名称,但由于名称是生成的,我宁愿不这样做,即使它确实有效。

所以我的问题是: 1)是否有可能运行在弹性魔豆基于AWS-春季云应用? 2)如果是这样,是否需要特殊步骤?例如,我已经发现了有关该角色所需的CloudFormation读访问权限。 3)有没有办法禁用试图从堆栈中获取资源名称的Spring Cloud AWS部分?在这一点上我的应用程序不需要这个。

在此先感谢, ķ

回答

0

spring-cloud-aws似乎由您使用您的自定义模板CloudFormation运行你的应用程序的默认假设。

弹性魔豆的情况下,你只需要告诉spring-cloud-aws从自动获取有关堆栈信息辞职:

cloud.aws.stack.auto = false 

不知道为什么它没有在文档中提到。对于基本的Java应用程序,Elastic Beanstalk似乎是一个明显的选择。

2

好吧,随着时间的推移我已经回答了我对这个主题的自己的问题。

首先,弹性魔豆在后台使用CloudFormation,所以这就是为什么有一个“堆栈”。

接下来,春季云AWS试图通过结合可能已经在相同的堆栈中创建其他资源,使星展银行和连接这样简单。这是合理的 - 如果你期待它。如果没有,就像@barthand所说的那样,最好将cloud.aws.stack.auto = false关闭此功能,否则应用程序无法启动。

三,当使用弹性魔豆,你有机会到执行角色与实例关联 - 否则在你的实例的代码不能做太多与AWS SDK东西。为了探索CloudFormation堆栈中的资源,Spring Cloud AWS尝试进行一些API调用,并且默认情况下这些都是不允许的。为了让他们允许,我添加了这些权限的角色:

"Statement": [ 
    { 
     "Effect": "Allow", 
     "Action": [ 
      "cloudformation:DescribeStacks", 
      "cloudformation:DescribeStackEvents", 
      "cloudformation:DescribeStackResource", 
      "cloudformation:DescribeStackResources", 
      "cloudformation:GetTemplate", 
      "cloudformation:List*" 
     ], 
     "Resource": "*" 
    } 
] 

因此,要回答我原来的问题:(!易)

  1. 是的,它是绝对有可能运行一个春天的云AWS Elastic Beanstalk中的程序。
  2. 特殊要求 - 需要打开相关联的角色的权限,包括CloudFormation读操作,或...
  3. 禁用这些使用cloud.aws.stack.auto =假

    希望这些信息可以帮助别人未来

+0

谢谢,这对我非常有帮助。 – shawnjohnson

相关问题