AWSラムダにおけるバイナリのトラブルシューティング


私は、この話題に関して記事を書くことを約束しましたgraphviz AWSラムダで働く図書館この記事では、私はバイナリの作業バージョンを作成するために使用するツールをカバーしたい.

ビルドターゲット


あなたのラムダのためにバイナリをコンパイルするのを見ているならば、あなたはアマゾンLinuxamazonlinux:2 ドッカーイメージ.以下に、対話的シェルの実行方法を示します.
$ docker run --rm -it amazonlinux:2 bash
どちらの場合でも、これらをインストールする必要がありますので、これらのデフォルトでコンパイルツールを出荷しないでください.sudo yum groupinstall "Development Tools" を開始するには、適切なリストを取得します.バイナリの共有依存関係を調べるにはldd .
バイナリをコンパイルしたら、開発環境にコピーする必要があります.

開発環境


カスタムバイナリを持つAWSラムダ関数で動作するとき、それは間違いなく高速フィードバックループを持っている.あなたはコンテナを実行することができますdocker-lambda このため、デフォルトでバンドルされているファイルシステムのパーミッションとバイナリを複製します.
あなたが一般的に使われたバイナリを産むならば/usr/bin/find , デフォルトでバンドルされていることを確認してください.
$ docker run --rm --entrypoint /bin/bash lambci/lambda:provided -c 'ls -lha /usr/bin'

私のマシンで動く


バイナリやライブラリを必要とすると、ラムダ展開に含めることができます.また、再利用する場合は、レイヤーとしてアップロードできます.それは本当にあなたの選択のServerlessの味が問題ではない.
レイヤは、/opt ディレクトリには、これらのカスタムバイナリを実行する必要があります.あなたの層を想定bin and lib これらの値を$ pathと$ ldountライブラリ環境変数に追加する必要があるディレクトリ.これは実行時に必要なので、言語固有のステップだけが必要です.ここでどのようにノードでそれを行うことができます.js
process.env.PATH = `${process.env.PATH}:/opt/bin`;
process.env.LD_LIBRARY_PATH = `${process.env.LD_LIBRARY_PATH}:/opt/lib`;
module.exports.handler= async () => {
  /* code */
}
ランタイム固有のものを含む環境変数の一覧についてはhere .

レイヤーツーリング


あなたがARNから層をダウンロードしたいならば、あなたが使用しているどのServerlessな味でも、AWS CLIを使用する必要があります.場合によっては、まだレイヤーの代替を参照している場合は、そのコンテンツを最初にそれをダウンロードする前にチェックしたい.バイナリを確認したり、ファイルのサイズを確認したりできます.
私は層に含まれるバイナリをチェックするのに役立つ小さなツールを構築しました.describeawslayer.com .

利便性は再現性を殺す


これは、DockerHookのレジストリの成功の背後にあるモットーですか?知っているAWS SAR が存在するが、依存関係をターゲットにする必要はない.層マネージャ(または層レジストリ)のためのまだ余地があるように感じます既存のレイヤーを使用して再利用のギャップを埋める.私も知っているawesome-lambda-layers しかし、それらの層で活発な使用法があるか、すべての記載されたアイテムのためにARNさえ言及するならば、それは表示に不足します.私は、このようなツールが開発ライフサイクルをスピードアップすることができると信じています.
あなたが異なるラムダの中であなたのバイナリをトラブルシューティングするために異なるツールを使用するならば、あるいは、あなたが異なる問題に遭遇するならば、私はコメント部であなたから連絡を聞きたいです.
その他のリソース
  • Official documentation for AWS Lambda layers
  • How do I create a Lambda layer using a simulated Lambda environment with Docker?
  • How do I use Amazon Linux AMI native binary packages in an AWS Lambda deployment package?