node10.x以降のAWS LambdaからcURLを実行したい

2020/10/16に公開

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として追加する

いろいろと調べていたところ、下記が解決策となりました。

https://stackoverflow.com/questions/58956951/curl-on-aws-lambda-gives-command-not-found-error

手順としては、RedHat系のディストリビューションからcURLコマンドとリンクされている共有ライブラリ一式を入手して、Lambda Layersとして追加します。必要なファイル一式は下記から入手できます。

https://github.com/andey/curl-lambda-layer

自分はそのまま使ってしまいましたが、不安のある方は同じファイルを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