node10.x以降のAWS LambdaからcURLを実行したい
cURLがエラーとなる
かなり前に作られたnode8.10を使用Lambda関数に不具合が発生したため修正をしました。いざデプロイをしようとしたところnode8.10はeolとのことで更新ができません。仕方がなくnode12.xに移行したところ、子プロセスとして起動していたcURLがcommand not found
となって困ってしまいました。
どうやらnode10.xから採用されたAmazon Linux 2ではcURLが含まれていないとのこと。本来はNodde.jsで用意されたrequest等を使えばよいのですが、CORSの関係で不都合なことが…
cURL関係のファイル一式をLayerとして追加する
いろいろと調べていたところ、下記が解決策となりました。
手順としては、RedHat系のディストリビューションからcURLコマンドとリンクされている共有ライブラリ一式を入手して、Lambda Layersとして追加します。必要なファイル一式は下記から入手できます。
自分はそのまま使ってしまいましたが、不安のある方は同じファイルをRedHat/CentOSのディストリビューションから抜いてください。
展開したディレクトリ下に移動して、zip -r ../curl-lambda-layer.zip .
として圧縮します。展開したときに下記のようになればOKです。
$ unzip -l curl-lambda-layer.zip
Archive: curl-lambda-layer.zip
Length Date Time Name
--------- ---------- ----- ----
0 10-16-2020 11:42 bin/
208536 10-16-2020 11:42 bin/curl
0 10-16-2020 11:42 lib/
60512 10-16-2020 11:42 lib/liblber-2.4.so.2
40872 10-16-2020 11:42 lib/libcrypt-2.12.so
330896 10-16-2020 11:42 lib/libldap-2.4.so.2.10.3
158936 10-16-2020 11:42 lib/libnsspem.so
543784 10-16-2020 11:42 lib/libcurl.so.4
185368 10-16-2020 11:42 lib/libsmime3.so
543784 10-16-2020 11:42 lib/libcurl.so.4.6.0
165040 10-16-2020 11:42 lib/libexpat.so.1.5.2
67184 10-16-2020 11:42 lib/libcares.so.2.1.0
61968 10-16-2020 11:42 lib/libmetalink.so.3.1.0
336472 10-16-2020 11:42 lib/libssl3.so
162080 10-16-2020 11:42 lib/libssh2.so.1.0.1
1337168 10-16-2020 11:42 lib/libnss3.so
40872 10-16-2020 11:42 lib/libcrypt.so.1
165040 10-16-2020 11:42 lib/libexpat.so.1
61968 10-16-2020 11:42 lib/libmetalink.so.3
60512 10-16-2020 11:42 lib/liblber-2.4.so.2.10.3
330896 10-16-2020 11:42 lib/libldap-2.4.so.2
106160 10-16-2020 11:42 lib/libsasl2.so.2.0.23
106160 10-16-2020 11:42 lib/libsasl2.so.2
162080 10-16-2020 11:42 lib/libssh2.so.1
67184 10-16-2020 11:42 lib/libcares.so.2
--------- -------
5303472 25 files
ポイントは、先頭にディレクトリ名が含まれてしまうとLayer上で展開したときに実行パスが通らないため注意が必要です。
Layerのドキュメントを見る限りでは、おそらく/opt/bin
と/opt/lib
に展開され、パスも通っているものと思われます。
AWS上でLayerを作成して追加
AWS Lambdaのダッシュボードの左側のメニューにレイヤーをクリックして、レイヤーの作成を実行します。適当な名前をつけて、先程のzipファイルを選択し、ランタイムオプションでNode.js 12.xを選択して作成します。
実行したいLambda関数を開くと、デザイナー部分にLayersという部分があります。レイヤーを選択する際に、カスタムレイヤーから作成したレイヤーを選択し追加します。
Lambda関数を実行してみると問題なくcURLコマンドが実行できました。
Discussion