語境
我可以使用 Docker 和 CDK 部署到 AWS lambda。
這是我所做的:
我有一個 Java 包TestLambda。我用docker build -t test-lambda .那里來構建 docker 鏡像。
FROM public.ecr.aws/lambda/java:11
# /var/task should only contains *.class files
#COPY build/classes/java/main ${LAMBDA_TASK_ROOT}
# Always use /var/task/lib for dependencies
COPY build/dependency/* ${LAMBDA_TASK_ROOT}/lib/
COPY src/main/resources/log4j2.xml ${LAMBDA_TASK_ROOT}
ARG jarFile=TestLambda-0.0.1.jar
# Looks
COPY build/libs/${jarFile} ${LAMBDA_TASK_ROOT}/lib/
RUN cd ${LAMBDA_TASK_ROOT} && jar -xf ${LAMBDA_TASK_ROOT}/lib/${jarFile}
# Set the CMD to your handler (could also be done as a parameter override outside of the Dockerfile)
CMD [ "com.mywebsite.TestLambda::handle" ]
我有一個 CDK 包,我在其中定義了 Lambda 堆疊:
export interface LambdaStackProps extends cdk.StackProps {
readonly env : cdk.Environment
}
export class LambdaStack extends cdk.Stack {
// Make it public so that can be binded to Api Gateway
public readonly testLambda : lambda.Function;
constructor(scope: cdk.App, id: string, props: LambdaStackProps) {
super(scope, id, props);
this.testLambda = this.createLambda();
}
private createLambda() {
// Configure path to Dockerfile
const dockerfile = path.join(__dirname, "../../TestLambda/");
// Because here it uses Asset,
// need run cdk bootstrap aws://<AwsAccountId>/us-east-1
return new lambda.DockerImageFunction(this, 'TestLambdaHandler', {
functionName: 'TestLambdaHandler',
description: 'Lambda that render presigned url for S3 bucket.',
code: lambda.DockerImageCode.fromImageAsset(dockerfile),
timeout: cdk.Duration.minutes(2),
memorySize: 512,
role: this.createLambdaExecutionRole(),
tracing: lambda.Tracing.ACTIVE,
});
}
private createLambdaExecutionRole() {
return new iam.Role(this, "TestLambdaHandlerRole", {
description: "Execution role for TestLambdaHandler.",
assumedBy: new iam.ServicePrincipal("lambda.amazonaws.com"),
inlinePolicies: {
"TestLambdaHandlerRoleInlinePolicies" : new iam.PolicyDocument(
{
statements : [
new iam.PolicyStatement({
effect: iam.Effect.ALLOW,
resources: ["*"],
actions: [
"s3:Create*",
"s3:List*",
"s3:Set*",
"s3:Put*",
"s3:Get*",
]
}),
new iam.PolicyStatement({
effect: iam.Effect.ALLOW,
resources: ["*"],
actions: [
"logs:Get*", "logs:Describe*", "logs:Create*", "logs:Put*"
]
})
]
}
)
}
});
}
}
使用上面的代碼,我可以上傳 docker 鏡像并使用 command 部署到 AWS Lambda cdk deploy LambdaStack。
我的問題
以上代碼適用于一個 Java Lambda 函式。現在我想在我的Java包中添加更多的Java功能,并使用CDK包將docker鏡像作為一個整體進行部署。
我怎樣才能做到這一點?
正如你在我的 Dockerfile 中看到的,有一行CMD [ "com.mywebsite.TestLambda::handle" ]指定了應該運行的函式,而 Dockerfile 只能有一個 CMD。
我嘗試為我的新函式添加另一個 CMD,并使 Dockerfile 看起來像:
CMD [ "com.mywebsite.GetS3PresignedUrl::handleRequest" ]
CMD [ "com.mywebsite.activity.Test::handleRequest" ]
當然,我也更新了 TypeScript CDK 包,為第二個 lambda 函式添??加了相應的代碼。基本上是我上面代碼的副本。
部署后,我看到兩個 AWS lambda 函式。但是兩個 lambda 函式都呼叫com.mywebsite.activity.Test::handleRequest. 正如這里提到的,“如果你列出了多個,CMD那么只有最后一個CMD才會生效。”
我希望單個 docker 映像保存我所有的 Lambda 函式,我該怎么做?
uj5u.com熱心網友回復:
使用lambda.Function結構 insead。它允許您重用 docker 資產并覆寫處理程式。CMD從 Dockerfile 中洗掉條目。
const my_code = lambda.DockerImageCode.fromImageAsset(dockerfile);
const my_lambda = new lambda.Function(this, 'TestLambdaHandler', {
functionName: 'TestLambdaHandler',
description: 'Lambda that render presigned url for S3 bucket.',
code: my_code,
handler: 'com.mywebsite.activity.Test::handleRequest',
runtime: lambda.Runtime.FROM_IMAGE,
timeout: cdk.Duration.minutes(2),
memorySize: 512,
role: this.createLambdaExecutionRole(),
tracing: lambda.Tracing.ACTIVE,
});
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/361830.html
