[Ubuntu] Lambdaのローカル実行 (sam local invoke) でdockerが認識されない

事象

AWS SAM (Serverless Application Model)を利用してlambda関数をローカル実行しようとした際、以下のエラーが発生することがあります。

$ echo {} | sam local invoke HelloWorldFunction
/usr/lib/python3/dist-packages/paramiko/transport.py:237: CryptographyDeprecationWarning: Blowfish has been deprecated and will be removed in a future release
  "class": algorithms.Blowfish,
Error: Running AWS SAM projects locally requires Docker. Have you got it installed and running?

dockerのインストールができていない場合はdockerをインストールしてください。 ここでは、dockerは起動しているもののSAM CLIがdockerを認識していない場合の対応について解説します。 以下のコマンドを実行することでdocker daemonが起動しているかどうかを確認できます。 筆者の環境はUbuntu 22.04です。

$ docker ps

解決策

DOCKER_HOSTをdocker desktopで起動しているcontextで指定する必要があります。

$ echo {} | DOCKER_HOST=unix:///home/edge2992/.docker/desktop/docker.sock sam local invoke HelloWorldFunction

samが見に行っているdockerのcontextがデーモンとして起動しているdockerと異なる際に発生しているようです。 dockerコマンド外からの接続には指定しているcontextが使われず、DOCKER_HOSTが利用されています。 contextは以下のように確認できます。

$ docker context ls
NAME                TYPE                DESCRIPTION                               DOCKER ENDPOINT                                     KUBERNETES ENDPOINT   ORCHESTRATOR
default             moby                Current DOCKER_HOST based configuration   unix:///var/run/docker.sock                                               
desktop-linux *     moby                Docker Desktop                            unix:///home/edge2992/.docker/desktop/docker.sock      

この手順に従うことで、sam local invokeでのLambda関数のローカル実行が正常に行えるようになります。

参考

comments powered by Disqus