当前位置: 首页 > 知识库问答 >
问题:

部署自定义运行时lambda时,sam包太大

柯轶
2023-03-14

所以我复制了这个项目,它使用swift作为自定义lambda运行时,并使用makefile作为构建方法

现在我创建了一个AWS CodePipeline,它使用sam包使用CodeBuild打包我的项目,并最终通过CloudForm部署它。

我的lambda的codeUri设置在根文件夹中,就像我在上面链接的repo中看到的那样。我认为这是应该的,正如我在自定义运行时部分的sam文档中看到的那样。问题是sampackage打包了我的整个项目,而lambda在部署时抱怨zip太大。

我将如何设置makefile以及template.yml,以便sam包仅打包我的lambdas?

共有1个答案

黄啸
2023-03-14

所以我用了一个稍微不同的策略。这是为那些发现他们自己处于同样情况的人准备的。

我正在运行各种shell脚本来启动/scripts文件夹中的swift build

.
├── Package.resolved
├── Package.swift
├── README.md
├── Sources
│   └── YourFirstLambda
│       ├── main.swift
│       └── requirements.txt
├── buildspec.yml
├── samconfig.toml
├── scripts
│   ├── build-and-package-all.sh
│   ├── build-and-package.sh
│   └── package.sh
└── template.yml

构建并打包所有。shscripts文件夹中启动此shell脚本。如果更改所有dir路径,则可以更改此行为。

这将启动构建和打包。sh数组lambdas中定义的每个函数的脚本。

declare -a lambdas=("YourFirstLambda" "YourSeconLambda")
workspace="$(pwd)/.."

## now loop through the above array

if [ -f /.dockerenv ]; then
    # This is executed if run inside docker
    echo "I'm inside matrix ;(";
    for lambda in "${lambdas[@]}"
        do 
            # Second parameter is wheather we are inside a docker container or not
            ./build-and-package.sh $lambda "FALSE"
    done
else
    echo "I'm living in real world!";
    for lambda in "${lambdas[@]}"
        do
            # Second parameter is wheather we are inside a docker container or not
            ./build-and-package.sh $lambda "TRUE"
    done
fi

build-and-package.sh

这个脚本运行

  • 快速构建

在docker容器上,如果生成并打包所有。sh在裸机上执行。这很有用,因为您可以在未安装swift的机器上运行此功能。

另一方面,如果我们已经在docker容器中,我们将在裸机上运行swft build。当您想使用AWS CodeBuild构建您的函数时,这种情况可能就像我一样。它们还使用docker容器,因此无需在docker容器内启动docker容器。

set -eu

executable=$1
isBareMetal=$2
workspace="$(pwd)/.."
if [ $isBareMetal == "TRUE" ]; then
       echo "-------------------------------------------------------------------------"
       echo "building \"$executable\" lambda"
       echo "-------------------------------------------------------------------------"
              docker run --rm -v "$workspace":/workspace -w /workspace/ codebuild-swift \
                     bash -cl "swift build --product $executable -c release"
       echo "done"

       echo "-------------------------------------------------------------------------"
       echo "packaging \"$executable\" lambda"
       echo "-------------------------------------------------------------------------"
              docker run --rm -v "$workspace":/workspace -w /workspace/ codebuild-swift \
                     bash -cl "sh scripts/package.sh $executable"
       echo "done"
else
       echo "-------------------------------------------------------------------------"
       echo "building \"$executable\" lambda"
       echo "-------------------------------------------------------------------------"
              cd $workspace
              swift build --product $executable -c release  
       echo "done"

       echo "-------------------------------------------------------------------------"
       echo "packaging \"$executable\" lambda"
       echo "-------------------------------------------------------------------------"
              sh $workspace/scripts/package.sh $executable
       echo "done"
fi

最后,我们将swift lambda打包到一个包装箱中。拉链<代码>包。sh

set -eu
executable=$1
target=".build/lambda/$executable"
rm -rf "$target"
mkdir -p "$target"
cp ".build/release/$executable" "$target/"
# add the target deps based on ldd
ldd ".build/release/$executable" | grep swift | cut -d' ' -f3 | xargs cp -Lv -t "$target"
cd "$target"
ln -s "$executable" "bootstrap"
zip --symlinks lambda.zip *

模板中。yml您应该有一个章节来描述您的lambda,如下所示:

...
YourLambdaFunction:
    Type: AWS::Serverless::Function
    Properties:
      Timeout: 5
      Handler: Provided
      Runtime: provided
      MemorySize: 128
      Description: Test Lambda
      Role: !GetAtt Role.Arn
      CodeUri: .build/lambda/YourLambdaFunction/lambda.zip
...

现在可以使用sam构建sam部署sam包。Sam只上传压缩后的lambda,该lambda应在30Mb范围内。如果您没有太多的依赖项,可能会减少。

您将需要安装了swft的docker容器。我的docker映像被标记为codeBuild-swft,并使用以下docker文件。如果以不同的方式命名docker映像,则必须更新build-and-package.sh

FROM swift:5.2-amazonlinux2

RUN yum -y install \
    git \
    libuuid-devel \
    libicu-devel \
    libedit-devel \
    libxml2-devel \
    sqlite-devel \
    python-devel \
    ncurses-devel \
    curl-devel \
    openssl-devel \
    tzdata \
    libtool \
    gcc-c++ \
    jq \
    tar \
    zip \
    glibc-static

上面的shell脚本都基于这个站点:sift-AWS-Lambda运行时入门

 类似资料:
  • 我正在构建一个Ruby 2.7 Lambda应用程序。 我的应用程序依赖于github中存在的gem。 我想编写一个脚本,可以构建包含此依赖项的部署zip文件。 当我运行时,我的gem安装到供应商/bundle/ruby/2.7.0/bundler/gems/my-gem-GITHASH。 对于Lambda包装,我认为我需要构造以下内容 供应商/bundle/ruby/2.7.0/gems/my-

  • 我尝试创建一个自定义spi,在我的keycloak项目中,遵循基本的keycloack结构,我添加了扩展provider的自定义provider接口,正如keycloak文档所说,定制提供程序工厂并为它们实现定制spi,它们在源代码中是这样做的,之后,我为我的提供程序和提供程序工厂创建一个自定义实现,如文档所述,我在Meta-INF/Services中创建文件,我正在使用ear aproach来部

  • 我正在尝试使用AWS CDK而不是无服务器在AWS Lambda中使用Bref自定义运行时。 CDK代码如下所示。 这里是完整的源代码https://github.com/petrabarus/cdk-bref-function 当我尝试使用AWS CLI手动调用时,它显示错误。 Cloudwatch日志显示了如下内容。 如果我将部署与无服务器框架进行比较,那么配置(层、代码等)几乎是相同的。我错

  • 故事 我用的是keycloak 6.0.1。我有一个领域有两种类型的用户:管理员和常规用户。我需要一个主题,可以区分他们之间,因为登录是不同的(3字段vs 2字段)。因此,我希望扩展提供程序FreeMarkerLoginFormsProvider以传递一个自定义参数。我正在使用keycloak部署器部署我的SPI。 Keycloak在部署时不幸引发异常: 我也尝试过模块方法,但得到一个NullPo

  • 关于Wildfly8.1.0中的应用程序部署,我遇到了一个奇怪的问题 在应用程序刚开始的时候,部署速度很快,但今天变得非常慢,我在服务器日志中看到,在org.hibernate.annotations.common.version和org.hibernate.dialct.dialion行之间花费了5分钟 也没有错误信息... 一旦启动,应用程序就会毫无问题地运行 我真的不知道该怎么办 我对应用程

  • 问题内容: 我已经创建了自己的文件,并通过将其设置为系统类加载器。它已经初始化,并且一切正常,但是找不到我要加载的类。这是: 我已确认该罐子存在,并且路径正确。这是我在程序中如何称呼它: 这是我得到的例外(第166行是指我尝试创建新行的行: 我什至尝试像这样显式加载类: 是什么原因造成的?它不应该“正常工作”吗? 更新: 这是来自的重要代码 更新2: 这是一个SSCCE:http : //nucl