目的
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 -lpyenvのインストールの確認
$ 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の名前を適当に決めてテストを実行するだけで良いです。












