LoginSignup
1
1

AWS lambda (arm) Python3.10.xにライブラリをLayerで追加する方法

Last updated at Posted at 2023-06-28

目的

aws:lambda(arm)にランタイムPython3.10で好きなライブラリを追加する

例としてpandaslambdaで使えるようにする

前提

  • 手元のPCのCPUがintel製x86
  • awsのアクセスキーを発行が手元にある状況
  • 使用するのはPython3.10.11

方針

  1. EC2インスタンスをAmazonLinux2(arm)で立てる
  2. EC2にSSHで接続
  3. OpenSSL 1.1.1 をインストール
  4. EC2Python3.10.11をインストール
  5. pippandasをインストールしzip
  6. 作成したzipS3にアップロード
  7. S3にアップしたzipからlambdaのレイヤーを作成
  8. lambdaにレイヤーを追加
  9. lambdaでバージョン確認

1.EC2インスタンスをAmazonLinux2(arm)で立てる

EC2インスタンスのAMIをAmazonLinux2で作成します。

image.png

アーキテクチャを64ビット(arm)に変更します。

image.png

適当なインスタンスタイプを選択します。

image.png

ログイン用のキーペアを作成または選択します。
今回はec2-lambda-layer-creation-instance-keyというキーペアを作成してキーペアをダウンロードします。

image.png

キーペアを作成後、インスタンスを起動します。

2.EC2にSSHで接続

手元のPCで先ほど作成してダウンロードしたキーペアがある場所までcdコマンドで移動します。

image.png

EC2インスタンスを選択後インスタンスに接続のSSHクライアントのタブからSSH接続するためのコマンド類をコピーして順番にターミナルで実行していきます。

基本的に黄色でハイライトしてある箇所をターミナルにコピペすればよいです

ssh.png

image.png

3.OpenSSL 1.1.1 をインストール

  1. OpenSSLのバージョンを確認

    $ openssl version
    OpenSSL 1.0.2k-fips  26 Jan 2017
    
  2. OpenSSL 1.1.1をインストール

    $ sudo yum install -y openssl11 openssl11-devel
    

    インストールに成功すると最後にComplete!と表示されます。

  3. OpenSSL 1.1.1のインストールを確認

    $ openssl11 version
    OpenSSL 1.1.1g FIPS  21 Apr 2020
    

    これでOpenSSL 1.1.1のインストールを確認できました。

4.EC2Python3.10.11をインストール

  1. pyenv 公式推奨ビルド環境の構築

    $ sudo yum install -y gcc zlib-devel bzip2 bzip2-devel readline-devel sqlite sqlite-devel tk-devel libffi-devel xz-devel
    
  2. 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
    
  3. Python3.10.xのインストール

    インストールできるPythonのバージョンを確認します。

    $ pyenv install -l 
    

    今回はPython3.10.11をインストールします。

    $ pyenv install 3.10.11
    
  4. Python3.10.xのインストールを確認します。

    次のコマンドで先ほどインストールしたPythonのバージョンが表示されたらインストール成功です。

    $ pyenv versions
    
  5. 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.pippandasをインストールし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.作成したzipS3にアップロード

  1. アップロードするS3のバケットを作成

    適当な名前のバケットを作成します。今回はs3-lambda-layers-bucketというバケット名で作成しました。

    image.png

  2. 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をご覧ください。

  3. S3にアップロードされたか確認

    s3.png

7.S3にアップしたzipからlambdaのレイヤーを作成

lambdaのサイドメニューからレイヤーを選択してレイヤーを作成します。

スクリーンショット 2023-06-28 23.29.51.png

  • Amazon S3からファイルをアップロードを選択して先ほどアップロードしたzipファイルのパスを貼り付けます
  • アーキテクチャとランタイムを指定します

8.lambdaにレイヤーを追加

テスト用に適当なlambda関数を作成します。

スクリーンショット 2023-06-28 23.26.56.png

  • ランタイムとアーキテクチャが先ほど作成したレイヤーと合っていることを確認してください。

作成した関数にレイヤーを追加する方法は作成した関数の名前の下にあるレイヤーをクリックするとページ下部に遷移します。そこでレイヤーを追加をクリックすると次のような画面に遷移します。

スクリーンショット 2023-06-28 23.27.41.png

ここでカスタムレイヤーから先ほど作成したレイヤーをプルダウンで選択します。
これでレイヤーの追加が完了です。

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の名前を適当に決めてテストを実行するだけで良いです。

スクリーンショット 2023-06-28 23.39.07.png

参考リンク

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1