【问题标题】:Is it possible to run a Spring Cloud AWS application on Elastic Beanstalk?是否可以在 Elastic Beanstalk 上运行 Spring Cloud AWS 应用程序?
【发布时间】:2016-12-03 15:12:39
【问题描述】:

我正在尝试在 Elastic Beanstalk 上运行“hello world”复杂性的 Web 应用程序。我在 Elastic Beanstalk 上使用 Spring Boot 没有问题。

但是当我尝试使用 Spring Cloud 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:stack-id”和“aws:cloudformation:stack-name”的标签,我的理解是 Beanstalk 在幕后使用 CloudFormation 堆栈。我已经尝试通过@EnableStackConfiguration 手动指定堆栈的名称,但由于名称是生成的,我宁愿不这样做,即使它确实有效。

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

提前致谢, k

【问题讨论】:

    标签: amazon-elastic-beanstalk spring-cloud


    【解决方案1】:

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

    首先,Elastic Beanstalk 在幕后使用 CloudFormation,所以这就是存在“堆栈”的原因。

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

    第三,在使用 Elastic Beanstalk 时,您有机会将执行角色与您的实例相关联 - 否则您实例中的代码无法使用 AWS 开发工具包执行任何操作。为了探索 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 禁用这些

      希望此信息对将来的某人有所帮助

    【讨论】:

    • 谢谢,这对我很有帮助。
    【解决方案2】:

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

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

    cloud.aws.stack.auto = false
    

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

    【讨论】:

      猜你喜欢
      • 2019-06-11
      • 2016-07-01
      • 2018-07-30
      • 2017-09-28
      • 1970-01-01
      • 2012-06-26
      • 2019-08-28
      • 1970-01-01
      • 2014-08-04
      相关资源
      最近更新 更多