🐳

[AWS Lambda]DockerのPython環境で外部モジュールインポート用のファイルを作成する

2022/06/11に公開

なぜDockerを利用しようと思ったのか

  • 先日、AWS公式のハンズオンお役立ち Twitter Bot を作りながら学ぶ AWS ドリルでLambdaにトライしました。
  • ハンズオンでは必要なPythonの外部ライブラリのインストールをAWS CloudShellを利用していた。
  • Cloudshellだと毎回必要なライブラリのインストールをコマンド打つ必要がある。
  • dockerを利用するれば、Dockerfileに汎用的なライブラリを溜めていけるかなと思った。
  • dockerを触りたかったから。

1.Pythonのコンテナを起動する

1-1.事前準備Dockerfile etc.

 docker-python
  ├── Dockerfile //コンテナイメージを定義
  ├── docker-compose.yml //コンテナの起動条件を定義
  └── opt //コンテナのボリュームと同期するディレクトリとして用意

github

1-2.コンテナを起動する

$ docker compose up -d --build
	  :
	  :
	  :
 => exporting to image                                                                                                        0.1s
 => => exporting layers                                                                                                       0.1s
 => => writing image sha256:d0302a769966fc8d378864ebe60832b325ff5da5a649de0b41a95b5528c52392                                  0.0s  => => naming to docker.io/library/docker-python_python3                                                                      0.0s

Use 'docker scan' to run Snyk tests against images to find vulnerabilities and learn how to fix them
[+] Running 2/2
 ⠿ Network docker-python_default  Created                                                                                     0.0s
 ⠿ Container python3              Started //これが表示されたらOK

2.コンテナのシェルを起動して必要なライブラリをインストールする

2-1.シェルを起動する

$ docker compose exec [container_name] bash
$ docker compose exec python3 bash
root@6e9ee9529331:~# //このように表示が変わればシェルが起動されている状態

//lsコマンドを実行して同期するディレクトリ名が表示されていればOK
root@6e9ee9529331:~# ls
opt

2-2. 必要なライブラリをインストールする

pip install [ライブラリ名] -t [ディレクトリ]

-t : インストール先のディレクトリを[ディレクトリ]で指定する

root@6e9ee9529331:~# cd opt/
root@6e9ee9529331:~/opt# pip install requests -t .
Collecting requests
  Downloading requests-2.28.0-py3-none-any.whl (62 kB)
     ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 62.8/62.8 kB 1.1 MB/s eta 0:00:00
Collecting certifi>=2017.4.17
  Downloading certifi-2022.5.18.1-py3-none-any.whl (155 kB)
     ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 155.2/155.2 kB 2.1 MB/s eta 0:00:00
Collecting idna<4,>=2.5
  Downloading idna-3.3-py3-none-any.whl (61 kB)
     ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 61.2/61.2 kB 3.6 MB/s eta 0:00:00
Collecting charset-normalizer~=2.0.0
  Downloading charset_normalizer-2.0.12-py3-none-any.whl (39 kB)
Collecting urllib3<1.27,>=1.21.1
  Downloading urllib3-1.26.9-py2.py3-none-any.whl (138 kB)
     ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 139.0/139.0 kB 4.7 MB/s eta 0:00:00
Installing collected packages: urllib3, idna, charset-normalizer, certifi, requests
Successfully installed certifi-2022.5.18.1 charset-normalizer-2.0.12 idna-3.3 requests-2.28.0 urllib3-1.26.9
WARNING: Running pip as the 'root' user can result in broken permissions and conflicting behaviour with the system package manager. It is recommended to use a virtual environment instead: https://pip.pypa.io/warnings/venv
root@6e9ee9529331:~/opt# ls
bin			       charset_normalizer		    idna-3.3.dist-info	       urllib3
certifi			       charset_normalizer-2.0.12.dist-info  requests		       urllib3-1.26.9.dist-info
certifi-2022.5.18.1.dist-info  idna				    requests-2.28.0.dist-info
root@6e9ee9529331:~/opt#

3.インストールしたライブラリをzipファイルに圧縮する

zip -r [格納先] [圧縮対象]

-r : 再帰的な処理をする(指定したディレクトリの下層全てを圧縮対象にする)

root@6e9ee9529331:~/opt# zip -r ./modules.zip .
  adding: bin/ (stored 0%)
  adding: bin/normalizer (deflated 28%)
	  :
	  :
	  :
  adding: urllib3-1.26.9.dist-info/WHEEL (deflated 14%)
  adding: urllib3-1.26.9.dist-info/top_level.txt (stored 0%)
  
root@6e9ee9529331:~/opt# ls modules.zip
modules.zip

コンテナのシェル操作は終了。exitで離脱する。

root@6e9ee9529331:~/opt# exit
exit

4.コンテナと同期しているディレクトリにzipがあるか確認

$ pwd
/***/***/***/docker/docker-python/opt
$ ls modules.zip
-rw-r--r--   1 fuji  staff  800306  6 11 15:32 modules.zip

5.Lambda関数の作成とzipファイルのアップロード

5-1.任意の関数名を入力して、関数を作成をクリックする。

5-2.コードタブの右側のプルダウンから.zipファイルを選択する

5-3.アップロードボタンをクリックして、ローカルのzipファイルを選択する

5-4.以下のようにzipファイルが展開された形で表示されていることを確認する

Discussion