2017-02-19 83 views
4

我們正在開發一個項目,以使用由API網關請求觸發的lambda函數來處理文件。該功能然後將文件存入S3存儲桶並開始讀取。直到這個點,一切正常像預期,但在文件讀取開始我們收到以下錯誤:使用庫運行AWS lambda函數時出現NoClassDefFoundError

(...) 
/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.101-3.b13.24.amzn1.x86_64/jre/lib/rt.jar: error reading zip file 
2017-02-06 19:15:06 <9025af71-eca0-11e6-82d2-9ff4b9184005> ERROR JRestlessHandlerContainer:339 - container failure 
/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.101-3.b13.24.amzn1.x86_64/jre/lib/rt.jar: error reading zip file 
/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.101-3.b13.24.amzn1.x86_64/jre/lib/rt.jar: error reading zip file 
END RequestId: (some id) 
REPORT RequestId: (some id) Duration: 3047.44 ms Billed Duration: 3100 ms  Memory Size: 1536 MB Max Memory Used: 94 MB 

Exception in thread "main" java.lang.Error: java.lang.NoClassDefFoundError: java/lang/Throwable$WrappedPrintWriter 
    at lambdainternal.AWSLambda.<clinit>(AWSLambda.java:59) 
    at java.lang.Class.forName0(Native Method) 
    at java.lang.Class.forName(Class.java:348) 
    at lambdainternal.LambdaRTEntry.main(LambdaRTEntry.java:94) 
Caused by: java.lang.NoClassDefFoundError:  java/lang/Throwable$WrappedPrintWriter 
    at java.lang.Throwable.printStackTrace(Throwable.java:721) 
    at lambdainternal.UserFault.trace(UserFault.java:43) 
    at lambdainternal.UserFault.makeUserFault(UserFault.java:26) 
    at lambdainternal.AWSLambda.startRuntime(AWSLambda.java:290) 
    at lambdainternal.AWSLambda.<clinit>(AWSLambda.java:57) 
    ... 3 more 
START RequestId: (some id) Version: $LATEST 
END RequestId: (some id) 

我們用自己的自定義文件讀/過程庫(Java項目),由於該文件是也根據我們的需求定製,我們使用Maven將其添加到我們的項目中。使用Maven的陰影插件生成我們的拉姆達的jar:

<plugin> 
     <groupId>org.apache.maven.plugins</groupId> 
     <artifactId>maven-shade-plugin</artifactId> 
     <version>2.3</version> 
     <configuration> 
       <createDependencyReducedPom>false</createDependencyReducedPom> 
     </configuration> 
     <executions> 
       <execution> 
        <phase>package</phase> 
        <goals> 
         <goal>shade</goal> 
        </goals> 
       </execution> 
      </executions> 
    </plugin> 

本地測試項目,它工作正常,我們可以得到的文件信息。我們的代碼使用JAX-RS和Spring來處理API網關(我們不確定這是否會干擾結果)。但是,直到現在,當使用lambda運行項目時,我們無法解決這個問題。在我們的測試中,我們特意增加了功能超時和內存,但不管限制如何,錯誤依然存在。

預先感謝您。

+0

你能顯示你的整個pom.xml文件嗎?你有沒有看到這個:http://docs.aws.amazon.com/lambda/latest/dg/java-create-jar-pkg-maven-no-ide.html – Zigglzworth

+0

這裏顯示的這個「容器故障」確實可以表明該錯誤在AWS端。您應該將其發送給他們的支持團隊或AWS論壇。 –

+0

嗨@JeshanBabooa,這也是我們所懷疑的。我們已經在AWS論壇上發佈了這個問題,但直到現在我們還沒有答案,並決定在這裏發佈。 –

回答

0

你還有問題嗎?可能是因爲您正在使用的特定區域中正在維護Lambda服務。這個錯誤告訴我JRE已損壞,並且無法訪問rt.jar提供的庫。必要時聯繫支持。您可以檢查AWS健康here

+0

嗨,是的,錯誤依然存在。我們仍在尋找解決方案。 –

+0

不確定反對票。我們在過去與蘭姆達斯有類似的問題,他們自己解決。就像我說的,如果您因使用服務和獲取錯誤而被收費,請聯繫支持人員。 – Nektie

1

使用日誌技術,調試我們的代碼並聯系AWS支持,我們發現其中一個庫正在禁止目錄中創建文件,如下所述:https://aws.amazon.com/lambda/faqs/,因此Lambda函數失敗。

他們解釋說,如果你需要創建文件,你必須使用/ tmp目錄,我們沒有注意到這一點,直到我們有這個問題。我們一遍又一遍地閱讀文檔,但這一件事仍然引起我們的注意,我認爲它發生了。無論如何,在庫中更改此函數後,函數現在可以按預期完美執行。

謝謝大家的幫助。

+0

您能否指出常見問題解答中的具體問題?我無法通過瀏覽找到它。 –

+1

好吧,我也找不到它(這很奇怪,但我相信自從上次看到它以後他們已經更新了該頁面)。無論如何,我發現這個有用的鏈接:https://docs.aws.amazon.com/lambda/latest/dg/limits。html搜索'/ tmp目錄可用於...' –