是否可以在Elastic Beanstalk上运行Spring Cloud AWS应用程序?

时间:2016-07-29 02:38:55

标签: elastic-beanstalk spring-cloud

我试图运行" hello world"的Web应用程序。 Elastic Beanstalk的复杂性。使用Elastic Beanstalk上的Spring Boot,我没有问题。

但是当我尝试使用Spring Cloud AWS时,遇到了无数问题。参考指南从未提及在Beanstalk上运行是可能的,所以也许我正在咆哮错误的树?

我似乎遇到的根问题是当试图识别"堆栈时,stackResourceRegistryFactoryBean爆炸了#34;正在使用 - 即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实例上存在标签,用于&#34; aws:cloudformation:stack-id&#34;和&#34; aws:cloudformation:stack-name&#34;如果它是相关的,我的理解是Beanstalk在幕后使用CloudFormation堆栈。我已尝试通过@EnableStackConfiguration手动指定堆栈的名称,但由于生成了名称,所以即使它确实有效,我也不要这样做。

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

提前谢谢, ķ

2 个答案:

答案 0 :(得分:3)

好的,所以随着时间的推移,我已就这个话题回答了我自己的问题。

首先,Elastic Beanstalk在幕后使用CloudFormation,因此这就是为什么有一个&#34;堆栈&#34;。

接下来,Spring Cloud AWS尝试通过绑定到可能已在同一堆栈中创建的其他资源来更轻松地建立与DB的连接。这是合理的 - 如果你期待的话。如果没有,正如@barthand所说,使用cloud.aws.stack.auto = false关闭此功能可能比让应用程序无法启动更好。

第三,使用Elastic Beanstalk时,您有机会将执行角色与您的实例相关联 - 否则您实例中的代码无法使用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. 是的,运行Spring Cloud AWS绝对是可能的(而且很简单!) Elastic Beanstalk中的程序。
  2. 特殊要求 - 需要打开关联角色的权限以包括CloudFormation读取操作,或者......
  3. 使用cloud.aws.stack.auto = false

    禁用它们

    希望此信息可以帮助将来某人

答案 1 :(得分:1)

默认情况下,

spring-cloud-aws似乎假设您使用自定义CloudFormation模板运行您的应用。

如果是Elastic Beanstalk,您只需要告诉spring-cloud-aws辞职,自动获取有关堆栈的信息:

cloud.aws.stack.auto = false

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