AWS Lambdaと同じ環境でLambdaのレイヤーを作る方法2

Q. Dockerに入れたみたいだけど、何するんだっけ? A. pip install

今度は、

cd var/app/tmp

を実行し、ここで

mkdir python

としてみます。

mkdir: cannot create directory 'python': Not a directory

エラーメッセージですね。検索しましょう。「cannot create directory」の結果がたくさん出てきますが、関係あるのは[ubuntu] mkdir cannot create directory : not a directorySnap cannot create user data directory: Not a directory - Unix & Linux Stack Exchangeでしょうか? 私の力では解決に繋がりませんでした……。神託が下りてきます。一度またDockerから出て、先ほどの、

docker run -i -t --rm --name docker_575_awxlinux2_container -v `pwd`/tmp:/var/app/tmp:z docker_575_awslinux2_image

の代わりに

docker run -i -t --rm --name docker_575_awxlinux2_container -v `pwd`/layer:/var/app/tmp:z docker_575_awslinux2_image

と、ホスト側のディレクトリ名を/tmpから/layerに変えるとmkdir pythonできます。なぜなのかはわかりませんが、とりあえずこれでも問題ないので進めます。

同期しているのはvar/app/tmpなので、

cd var/app/tmp

と移動し、改めて

mkdir python

としてディレクトリを作ります。ようやくできるようになっただろうと

pip install -t python requests

とすると…失敗します。

bash: pip: command not found

このコンテナにはまだpipが入っていませんでした。pip自体をインストールするために、「pip install」で検索し、pipの使い方とインストール | Python-izmを見つけます。

Q. pip自体のinstallってどうするんだっけ A. 公式通り、ダウンロードしてpythonで実行するとできる

https://bootstrap.pypa.io/get-pip.pyをダウンロードし、コンテナ内から実行します。

が、失敗します。

python get-pip.py
ERROR: This script does not work on Python 2.7 The minimum supported Python version is 3.7. Please use https://bootstrap.pypa.io/pip/2.7/get-pip.py instead.
Q. ダウンロードしたget-pipがpythonで実行ができないけど… A. Pythonをアップデートしよう

うーん入っているPythonが2.7で、古すぎるらしい。2.7のget-pipをしても良いけど、3.9の環境で動かすのでPythonのバージョンを上げるのが先か? でもPython 3.9はこのFROM amazonlinux:2で動かすんじゃなかったのか?

疑問に思ったので「amazonlinux:2 python 3.9」で検索し、AmazonLinux2にPython3.9をインストールするAmazon Linux 2 & Python3.9のDockerイメージ【DL可】を見つけます。そういえばAmazon Linux 2はPython3.9以外のものも動かすので、確かにPython3.9が最初から入っているわけはありませんでした。

Dockerfileを改良するだけで終わりそうなのと、せっかくなのでDockerfileを使ってみたかったのでAmazon Linux 2 & Python3.9のDockerイメージ【DL可】にしたがってみます。

FROM amazonlinux:latest

RUN yum install -y gcc openssl-devel bzip2-devel libffi-devel wget zip tar gzip make && \
    cd /opt && \
    wget https://www.python.org/ftp/python/3.9.6/Python-3.9.6.tgz && \
    tar xzf Python-3.9.6.tgz && \
    /opt/Python-3.9.6/configure --enable-optimizations && \
    make altinstall && \
    rm -f /opt/Python-3.9.6.tgz && \
    python3.9 -m pip install --upgrade pip

と書いてあり、多分latestは2だろうと思いながら眺めます。

3行目が少し不穏です。

まずは「yum」で検索すると、【 yum 】コマンド(基礎編)が見つかり、インストールに使うコマンドらしいです。openssl-develで検索してhttps://centos.pkgs.org/7/centos-x86_64/openssl-devel-1.0.2k-19.el7.x86_64.rpm.htmlを見つけ、Files for development of applications which will use OpenSSLとのこと。

他も調べるとPython3のインストールが出てきます。ちなみに「openssl-devel bzip2-devel libffi-devel」と検索してみると、なんとすごく近いことをしている元薬学生のpython/仮想通貨ブログを偶然見つけます。さっきのAmazon Linux 2 & Python3.9のDockerイメージ【DL可】も引用していますね。

webからファイルをダウンロードしたり、ダウンロードしたファイルを解凍したりするために必要なものをinstallし、ファイルをダウンロードしてインストールして…ということをやってくれているようですので、Dockerfileに改めて

FROM amazonlinux:latest

RUN yum install -y gcc openssl-devel bzip2-devel libffi-devel wget zip tar gzip make && \
    cd /opt && \
    wget https://www.python.org/ftp/python/3.9.6/Python-3.9.6.tgz && \
    tar xzf Python-3.9.6.tgz && \
    /opt/Python-3.9.6/configure --enable-optimizations && \
    make altinstall && \
    rm -f /opt/Python-3.9.6.tgz && \
    python3.9 -m pip install --upgrade pip

と書いて、imageを作るところ(dockerfileを書いた直後)からやり直します。

docker build -t docker_575_awslinux2_image .
docker run -i -t --rm --name docker_575_awxlinux2_container -v `pwd`/layer:/var/app/tmp:z docker_575_awslinux2_image
cd var/app/tmp/
mkdir python

とします。ちなみにさっきとは違い、3分ほどかかります。

pip install -t python requests

動きました。

でも、

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

が出ていますね。エラーではないですが検索すると、Python3系のアップロード pip installをするとRunning pip as root will break packages and permissions.が見つかり、仮想環境を使ったらどうかと言われています。今回は仮想と言えば仮想なんですが、venv的な仮想環境ではないので問題ないとして次へ進みます。また、ここでホスト側(ファインダーから確認できる手元のパソコン)のlayerディレクトリのpythonディレクトリにも、インストールされたものが確認できます。

続けて

pip install -t python jaconv
pip install -t python mecab-python3
pip install -t python ipadic
pip install -t python regex

を実行します。ホスト側のファインダーでlayer/pythonにkanehosi_tukeai.pyをコピーすることでコンテナ内のvar/app/tmp/pythonにkanehosi_tukeai.pyを入れ、slackのチャンネルに「古池や蛙飛びこむ水の音」と投稿して数秒後に

cd python
python3.9 kanehosi_tukeai.py

とすると…Slack「スッコココ!」とコンテナ内からもSlackへの投稿が実行できました。

今度こそLambdaで動くプログラムとレイヤーが用意できてそうです。次の記事では、これをLambda上で実行します。

© 2019- estie, inc.