[英]AWS Lambda Application with Java resource
我有一個可以在本地運行的項目,但在 AWS 上失敗了。 要在本地運行項目,我執行sam build
然后sam local start-api --host 0.0.0.0
。 然后我調用http://localhost:3000/skill2/task1
並獲得 hello world 響應。 當我調用 api 網關https://p4x0n2nemc.execute-api.us-east-2.amazonaws.com/Prod/skill2/task1
時,它失敗了。 我在 cloudwatch 中看到的錯誤是
Class not found: helloworld.App: java.lang.ClassNotFoundException
java.lang.ClassNotFoundException: helloworld.App. Current classpath: file:/var/task/
我使用此命令創建了 helloworld 應用程序並將其復制到我的 AWS Lambda 應用程序中。
sam init --name java11-demo-app --runtime java11 --dependency-manager gradle --app-template hello-world
這是 AWS Lambda 應用程序的 Github 存儲庫和 Java 資源
https://github.com/bennebbenneb/sample-app
如何更新此 AWS Lambda 應用程序,以便它在 NodeJS 資源之外創建 Java 資源? 我不想手動 zip 向上 Java 項目並上傳它。 我希望將 Java 代碼構建為管道的一部分。
本地構建 output sam build
Java Lambda 在本地主機上工作
AWS Lambda 可以從 AWS 控制台創建應用程序。 這些是 CloudFormation 項目。 https://us-east-2.console.aws.amazon.com/lambda/home?region=us-east-2#/create/application
buildspec.yml 如果您想使用 AWS CodeBuild 進行部署(這將是一個不尋常的流程):
---
version: '0.2'
phases:
install:
commands:
- echo Entered the install phase...
- npm install --global lerna
- lerna bootstrap --concurrency=1 -- --production
build:
commands:
- sam build
- sam deploy --stack-name stackoverflow-stack --capabilities CAPABILITY_IAM --no-fail-on-empty-changeset
--s3-bucket your-bucket-name-here --parameter-overrides AppId=your-app-id-here
buildspec.yml 如果您只想生成可以直接部署的 CloudFormation 模板文件(使用 CodeDeploy 或其他方式)。 它與您已經擁有的幾乎相同,但有以下區別:
sam build
sam package
代替aws cloudformation package
。 sam package
使用.aws-sam/template.yaml
(sam build 的輸出)而不是template.yaml
作為第一個默認值。---
version: '0.2'
phases:
install:
commands:
- echo Entered the install phase...
- npm install --global lerna
- lerna bootstrap --concurrency=1 -- --production
build:
commands:
- sam build
- sam package --s3-bucket your-bucket-name-here --output-template-file
template-export.yml
artifacts:
files:
- template-export.yml
Edit2:OP 的構建項目是由 Lambda 應用程序創建的。 構建項目使用aws/lambda/nodejs:10-1.0
有兩個問題:
以下 buildspec.yaml 可用於修復這兩個問題:
---
version: '0.2'
phases:
install:
commands:
- echo Entered the install phase...
- npm install --global lerna
- lerna bootstrap --concurrency=1 -- --production
- yum install -y amazon-linux-extras
- amazon-linux-extras install java-openjdk11
- export JAVA_HOME=$(realpath $(dirname $(realpath `which java`))/../..)
- pip install aws-sam-cli --upgrade
build:
commands:
- sam build
- sam package --s3-bucket cf-templates-fgoi5xu7d2hs-us-east-1 --output-template-file
template-export.yml
artifacts:
files:
- template-export.yml
JAVA_HOME
解決方案取自這里。 這有點hacky,但它有效。
Java 和 NodeJS 有 Docker 圖像。 我建議使用 Docker 圖像作為 lambda 的基礎。
適用於 Java
示例 Dockerfile 如下:
FROM public.ecr.aws/lambda/java:11
# Copy function code and runtime dependencies from Gradle layout
COPY build/classes/java/main ${LAMBDA_TASK_ROOT}
COPY build/dependency/* ${LAMBDA_TASK_ROOT}/lib/
# Set the CMD to your handler (could also be done as a parameter override outside of the Dockerfile)
CMD [ "com.example.LambdaHandler::handleRequest" ]
示例 Gradle 任務定義以准備運行時依賴項:
task copyRuntimeDependencies(type: Copy) {
from configurations.runtimeClasspath
into 'build/dependency'
}
對於 NodeJS
示例 Dockerfile 如下:
FROM public.ecr.aws/lambda/nodejs:12
# Copy function code
COPY app.js ${LAMBDA_TASK_ROOT}
# Set the CMD to your handler (could also be done as a parameter override outside of the Dockerfile)
CMD [ "app.handler" ]
在本地測試兩個圖像
要構建您的圖像:
docker build -t <image name> .
要在本地運行您的圖像:
docker run -p 9000:8080 <image name>
在單獨的終端中,您可以使用 cURL 在本地調用 function:
curl -XPOST "http://localhost:9000/2015-03-31/functions/function/invocations" -d '{"payload":"hello world!"}'
Reference:
您也可以嘗試創建多層 lambda。 不確定它是否有效。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.