簡體   English   中英

AWS Lambda 應用程序與 Java 資源

[英]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

sam build添加到 buildspec.yml 時出錯在此處輸入圖像描述

刪除Architectures配置后出錯在此處輸入圖像描述

AWS Lambda 應用程序創建的資源在此處輸入圖像描述

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有兩個問題:

  • SAM CLI 版本已過時
  • Java 未安裝,因為該圖像旨在用於基於 nodejs 的 Lambda 功能。 Java 是構建基於 Java 的 AWS 所必需的

以下 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM