[英]AWS CDK: How to create a Docker Lambda function with Typescript?
[英]How to customize docker build context when deploy a dockized .NET6 lambda using AWS cdk?
我正在嘗試使用AWS CDK中的Code.fromAssetImage方法部署停靠的.NET Lambda 應用程序。
我的文件夾結構如下所示
Lambda.Lab - 根文件夾
AWSLambda1
- .NET6 AWS Lambda 項目
Dockerfile
AWSLambda1.Data
- .NET6 類庫項目infra-stack.ts
- 堆棧文件我通過在AWSLambda1
項目文件夾下成功運行以下命令來測試構建 Dockerfile。 請注意,我在命令末尾使用..
將構建上下文從 Dockerfile 所在的位置向上移動,以便訪問依賴類庫AWSLambda1.Data
docker build -t AWSLambda1 ..
碼頭工人文件
FROM public.ecr.aws/lambda/dotnet:6 AS base
FROM mcr.microsoft.com/dotnet/sdk:6.0-bullseye-slim as build
WORKDIR /src
COPY ["AWSLambda1/AWSLambda1.csproj", "AWSLambda1/"]
COPY ["AWSLambda1.Data/AWSLambda1.Data.csproj", "AWSLambda1.Data/"]
RUN dotnet restore "AWSLambda1/AWSLambda1.csproj"
#WORKDIR "/src/AWSLambda1"
COPY . .
RUN dotnet build "AWSLambda1/AWSLambda1.csproj" --configuration Release --output /app/build
# --configuration Release --output /app/build
FROM build AS publish
RUN dotnet publish "AWSLambda1/AWSLambda1.csproj" \
--configuration Release \
--runtime linux-x64 \
--self-contained false \
--output /app/publish \
-p:PublishReadyToRun=true
FROM base AS final
WORKDIR /var/task
COPY --from=publish /app/publish .
CMD ["AWSLambda1::AWSLambda1.Function::FunctionHandler"]
所以我的問題是如何使用 AWS CDK 部署相同的東西? 我可以看到需要解決的兩個問題
AWSLambda1
和AWSLambda1
都被 CDK 項目捕獲AWSLambda1
項目的上一級下面是我的infra-stack.ts
,我嘗試解決這個問題,但到目前為止還沒有運氣。
import { Stack, StackProps, Duration, CfnOutput } from 'aws-cdk-lib';
import { Construct } from 'constructs';
// import * as sqs from 'aws-cdk-lib/aws-sqs';
import * as lambda from 'aws-cdk-lib/aws-lambda';
import * as path from 'path';
import { Code, Handler } from 'aws-cdk-lib/aws-lambda';
export class InfraStack extends Stack {
constructor(scope: Construct, id: string, props?: StackProps) {
super(scope, id, props);
const fn = new lambda.Function(this, 'lambda-docker-attempt1', {
runtime: lambda.Runtime.FROM_IMAGE,
handler: Handler.FROM_IMAGE,
//attempt 1
//code: Code.fromAssetImage(path.join(__dirname,'../../lambda.app/AWSLambda1')),
//[100%] fail: docker build --tag cdkasset-b0efaad78ead998b80e6ab6595a21d7fe24c06ec70f65d4e9005540eabf13161 .
//exited with error code 1: COPY failed: file not found in build context or excluded by .dockerignore: stat AWSLambda1/AWSLambda1.csproj: file does not exist
//attempt 2
// code: Code.fromAssetImage(path.join(__dirname,'../../lambda.app/'),{
// file: '/AWSLambda1/Dockerfile',
// }),
//[100%] fail: docker build --tag cdkasset-1005a75db171185bca51ea88ef8b74313d444af0d936e946ebe7493d684ab9dc --file /AWSLambda1/Dockerfile .
//exited with error code 1: unable to prepare context: unable to evaluate symlinks in Dockerfile path: CreateFile C:\AWSLambda1: The system cannot find the file specified.
//attempt 3
code: Code.fromAssetImage(path.join(__dirname,'../../'),{
file: '/lambda.app/AWSLambda1/Dockerfile',
}),
//[100%] fail: docker build --tag cdkasset-1005a75db171185bca51ea88ef8b74313d444af0d936e946ebe7493d684ab9dc --file /AWSLambda1/Dockerfile .
//exited with error code 1: unable to prepare context: unable to evaluate symlinks in Dockerfile path: CreateFile C:\AWSLambda1: The system cannot find the file specified.
timeout: Duration.seconds(30),
});
}
}
我發現了一個關於 DockerImageAsset 的舊討論,這似乎與我的問題相似,但我的問題僅用於 lambda 部署。
我是 AWS CDK 的新手,不確定我正在尋找的東西是否可行或現在。 任何建議都非常感謝。 非常感謝提前!!!
多虧了我可愛的同事亞歷克斯,它變成了“嘗試 2”是最接近的答案,只需稍作改動即可刪除file
路徑的前面“/”,然后它就變成了實際答案。 下面附上完整的答案。 希望這可以幫助任何有同樣問題的人。
import { Stack, StackProps, Duration } from 'aws-cdk-lib';
import { Construct } from 'constructs';
import * as lambda from 'aws-cdk-lib/aws-lambda';
import * as path from 'path';
import { Code, Handler } from 'aws-cdk-lib/aws-lambda';
export class InfraStack extends Stack {
constructor(scope: Construct, id: string, props?: StackProps) {
super(scope, id, props);
const fn = new lambda.Function(this, 'lambda-docker-attempt1', {
runtime: lambda.Runtime.FROM_IMAGE,
handler: Handler.FROM_IMAGE,
code: Code.fromAssetImage(path.join(__dirname,'../../lambda.app/'),{
file: 'AWSLambda1/Dockerfile',
}),
timeout: Duration.seconds(30),
});
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.