2016-07-29 133 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

相關問題