目的
aws:lambda(arm)
にランタイムPython3.10
で好きなライブラリを追加する
例としてpandas
をlambda
で使えるようにする
前提
- 手元のPCのCPUが
intel製
のx86
-
aws
のアクセスキーを発行が手元にある状況 - 使用するのは
Python3.10.11
方針
-
EC2
インスタンスをAmazonLinux2(arm)
で立てる -
EC2
にSSHで接続 -
OpenSSL 1.1.1
をインストール -
EC2
にPython3.10.11
をインストール -
pip
でpandas
をインストールしzip
化 - 作成した
zip
をS3
にアップロード -
S3
にアップしたzip
からlambda
のレイヤーを作成 -
lambda
にレイヤーを追加 -
lambda
でバージョン確認
1.EC2
インスタンスをAmazonLinux2(arm)
で立てる
EC2
インスタンスのAMIをAmazonLinux2
で作成します。
アーキテクチャを64ビット(arm)
に変更します。
適当なインスタンスタイプを選択します。
ログイン用のキーペアを作成または選択します。
今回はec2-lambda-layer-creation-instance-key
というキーペアを作成してキーペアをダウンロードします。
キーペアを作成後、インスタンスを起動
します。
2.EC2
にSSHで接続
手元のPCで先ほど作成してダウンロードしたキーペアがある場所までcd
コマンドで移動します。
EC2
インスタンスを選択後インスタンスに接続のSSHクライアント
のタブからSSH接続するためのコマンド類をコピーして順番にターミナルで実行していきます。
基本的に黄色でハイライトしてある箇所をターミナルにコピペすればよいです
3.OpenSSL 1.1.1
をインストール
-
OpenSSL
のバージョンを確認$ openssl version OpenSSL 1.0.2k-fips 26 Jan 2017
-
OpenSSL 1.1.1
をインストール$ sudo yum install -y openssl11 openssl11-devel
インストールに成功すると最後に
Complete!
と表示されます。 -
OpenSSL 1.1.1
のインストールを確認$ openssl11 version OpenSSL 1.1.1g FIPS 21 Apr 2020
これで
OpenSSL 1.1.1
のインストールを確認できました。
4.EC2
にPython3.10.11
をインストール
-
pyenv 公式推奨ビルド環境の構築
$ sudo yum install -y gcc zlib-devel bzip2 bzip2-devel readline-devel sqlite sqlite-devel tk-devel libffi-devel xz-devel
-
pyenv のインストール
次のコマンドを順番に実行します
$ sudo yum install -y git $ curl https://pyenv.run | bash
以下のコマンドで環境変数を設定します。
$ echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bashrc $ echo 'command -v pyenv >/dev/null || export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bashrc $ echo 'eval "$(pyenv init -)"' >> ~/.bashrc
シェルを再起動します。
$ exec $SHELL -l
pyenvのインストールの確認
$ pyenv --version pyenv 2.3.21
-
Python3.10.x
のインストールインストールできるPythonのバージョンを確認します。
$ pyenv install -l
今回は
Python3.10.11
をインストールします。$ pyenv install 3.10.11
-
Python3.10.xのインストールを確認します。
次のコマンドで先ほどインストールしたPythonのバージョンが表示されたらインストール成功です。
$ pyenv versions
-
Python
のバージョンの切り替えpyenvでPythonのバージョンを変更します。今回は
global
でバージョンを変更します。# 全体でバージョン変更 $ pyenv global 3.10.11 $ python --version Python 3.10.11 # カレントディレクトリのみバージョン変更 $ pyenv local 3.10.11 $ python --version Python 3.10.11
5.pip
でpandas
をインストールしzip
化
次のコマンドを順番に実行してpandas
をインストールします。
$ pip install --upgrade pip
$ mkdir python
$ cd python
$ pip install pandas -t .
$ cd ../
$ zip -r python.zip python
-
-t
オプションで指定したディレクトリにインストール -
python.zip
という名前のzip
を作成する必要があります。
6.作成したzip
をS3
にアップロード
-
アップロードするS3のバケットを作成
適当な名前のバケットを作成します。今回は
s3-lambda-layers-bucket
というバケット名で作成しました。 -
zipをS3にアップロード
今回は、IAMのアクセスキーを使用して
S3
にファイルをアップロードするプログラムを使用してアップロードします。EC2
インスタンスから次のコマンドでクローンしてREADMD.md
に従いインストールしてください。$ git clone https://github.com/kkml4220/file-upload-to-S3 $ cd file-upload-to-S3 $ pip install -r requirements.txt $ python setup.py AWS_ACCESS_KEY_IDを入力してください:************ AWS_SECRET_ACCESS_KEYを入力してください:********* AWS_S3_BUCKET_NAMEを入力してください:s3-lambda-layers-bucket # 先ほど作成したバケット名 AWS_DEFAULT_REGIONを入力してください:************ $ python main.py ../python.zip # 先ほど作成したzipへの相対パス
詳しくはREADME.mdをご覧ください。
-
S3にアップロードされたか確認
7.S3
にアップしたzip
からlambda
のレイヤーを作成
lambda
のサイドメニューからレイヤー
を選択してレイヤーを作成します。
- Amazon S3からファイルをアップロードを選択して先ほどアップロードした
zip
ファイルのパスを貼り付けます - アーキテクチャとランタイムを指定します
8.lambda
にレイヤーを追加
テスト用に適当なlambda
関数を作成します。
- ランタイムとアーキテクチャが先ほど作成したレイヤーと合っていることを確認してください。
作成した関数にレイヤーを追加する方法は作成した関数の名前の下にあるレイヤーをクリックするとページ下部に遷移します。そこでレイヤーを追加をクリックすると次のような画面に遷移します。
ここでカスタムレイヤーから先ほど作成したレイヤーをプルダウンで選択します。
これでレイヤーの追加が完了です。
9.lambda
でバージョン確認
作成したlambda
の関数を仮置きで次のように書き換えてDeploy
します。
import json
import pandas
def lambda_handler(event, context):
# TODO implement
return {
'statusCode': 200,
'body': json.dumps('Hello from Lambda!'),
"version": f"pandas: {pandas.__version__}"
}
適当なテストイベントを作成してレスポンスで次のように表示されれば成功です。
-
event
の名前を適当に決めてテストを実行するだけで良いです。