所以我复制了这个项目,它使用swift作为自定义lambda运行时,并使用makefile作为构建方法。
现在我创建了一个AWS CodePipeline,它使用sam包
使用CodeBuild打包我的项目,并最终通过CloudForm部署它。
我的lambda的codeUri
设置在根文件夹中,就像我在上面链接的repo中看到的那样。我认为这是应该的,正如我在自定义运行时部分的sam文档中看到的那样。问题是sampackage
打包了我的整个项目,而lambda在部署时抱怨zip太大。
我将如何设置makefile
以及template.yml
,以便sam包
仅打包我的lambdas?
所以我用了一个稍微不同的策略。这是为那些发现他们自己处于同样情况的人准备的。
我正在运行各种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
构建并打包所有。sh
从scripts
文件夹中启动此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