Cloud9でPythonを使ったLambda開発環境の構築をする

2022.07.07

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

こんにちは、データアナリティクス事業本部インテグレーション部コンサルティングチーム・新納(にいの)です。

Pythonを使ったLambda開発環境をCloud9で構築する機会がありました。PythonのバージョンやAWS CLIでちょっとした躓きポイントがあったので備忘として対応手順を残します。

AWS Lambdaで使用されるPythonバージョン確認(2022/7/6時点)

Cloud9で開発を行うにあたり、Lambda関数を作成するのに使用するPythonのバージョンと合わせておきます。まずはAWS Lambdaで使われているバージョンの確認を実施します。Lambda関数の作成時にランタイムをPython3.9に指定できますが、マイナーバージョンも含めた正確なバージョンを把握する目的で調査用のコードを実行します。

Lambda関数の作成

AWSマネジメントコンソールからAWS Lambdaの画面へアクセスし、ランタイムはPython 3.9にして関数を作成します。

調査用のコード

作成した関数に以下コードを記述してDeployし、Testから実行します。テストイベントはデフォルトのまま、イベント名だけ任意のものに変更しておきます。

import os
import sys

def lambda_handler(event, context):
    print("===[environment-variables]===")
    for key, value in os.environ.items():
        print(f'{key}: {value}')
    
    rtdir=os.environ.get("LAMBDA_RUNTIME_DIR")
    print("\n===[runtime directory:"+rtdir+"]===")
    
    print("===[LAMBDA_RUNTIME_DIR LIST]===")
    files = os.listdir(rtdir)
    for file in files:
        print(file)

    print("===[LAMBDA_RUNTIME_DIR sys.version]===")
    print(sys.version)
    
    return 0

結果

実行すると、バージョンは3.9.13との結果が返ってきました。(2022/7/6現在)

START RequestId: e82a6347-e9d2-4540-b4cd-969051e9d083 Version: $LATEST
===[environment-variables]===
AWS_LAMBDA_FUNCTION_VERSION: $LATEST
:
:
===[LAMBDA_RUNTIME_DIR sys.version]===
3.9.13 (main, Jun 10 2022, 16:49:31) 
[GCC 7.3.1 20180712 (Red Hat 7.3.1-15)]
END RequestId: e82a6347-e9d2-4540-b4cd-969051e9d083
REPORT RequestId: e82a6347-e9d2-4540-b4cd-969051e9d083  Duration: 1.39 ms   Billed Duration: 2 ms   Memory Size: 128 MB Max Memory Used: 36 MB  Init Duration: 103.62 ms

Cloud9環境にPythonをインストール

前述の調査でAWS Lambdaでは現在Python 3.9.13が使用されていることが分かりました。今度はCloud9環境に同じバージョンのPythonをインストールします。

AWSマネジメントコンソールからCloud9の画面に移動し、IDEを起動します。Cloud9での環境作成については以下のエントリをご参照ください。

Cloud9で使用されているPythonバージョンの確認

まずはPythonのバージョンを確認してみましょう。2022/7/6現在、Cloud9で使用されているバージョンは3.7.10であるようです。

$ python --version
Python 3.7.10

pyenvを導入する

バージョン3.7.10と後ほどインストールする3.9.13を切り替えて使えるようにするため、pyenvをインストールします。

$ git clone https://github.com/pyenv/pyenv.git ~/.pyenv                                                               
Cloning into '/home/ec2-user/.pyenv'...
remote: Enumerating objects: 21712, done.
remote: Counting objects: 100% (470/470), done.
remote: Compressing objects: 100% (344/344), done.
remote: Total 21712 (delta 336), reused 196 (delta 109), pack-reused 21242
Receiving objects: 100% (21712/21712), 4.38 MiB | 10.21 MiB/s, done.
Resolving deltas: 100% (14674/14674), done.

pyenv 2.3.2がインストールされました。

$ ~/.pyenv/bin/pyenv --version
pyenv 2.3.2-1-g207f33fc

パスを通すため、~/.bashrc に設定を追加します。

$ cat << 'EOT' >> ~/.bashrc
export PATH="$HOME/.pyenv/bin:$PATH"
eval "$(pyenv init -)"
EOT

sourceコマンドを実行し、設定ファイルを反映させます。

source ~/.bashrc

現在の状態だと、システムにインストールされているPythonが有効になっていることが確認できます。

$ pyenv versions
* system (set by /home/ec2-user/.pyenv/version)

Python 3.9.13のインストール

まずはPython3.9.13がインストール可能なバージョン一覧に存在するかどうかを以下コマンドで確認します。

$ pyenv install --list | grep 3.9.13

一覧にあると確認出来たので3.9.13をインストールします。

$ pyenv install 3.9.13
Downloading Python-3.9.13.tar.xz...
-> https://www.python.org/ftp/python/3.9.13/Python-3.9.13.tar.xz
Installing Python-3.9.13...
WARNING: The Python bz2 extension was not compiled. Missing the bzip2 lib?
WARNING: The Python lzma extension was not compiled. Missing the lzma lib?
Installed Python-3.9.13 to /home/ec2-user/.pyenv/versions/3.9.13

WARNINGがでているので、足りないパッゲージbzip2-develxz-develをインストールします。

$ sudo yum -y update
$ sudo yum -y install bzip2-devel
$ sudo yum -y install xz-devel

パッケージの一覧をgrepしてbzip2-develxz-develがインストールされていることを確認しておきましょう。

$ sudo yum list installed | grep bzip
bzip2.x86_64                          1.0.6-13.amzn2.0.3             installed  
bzip2-devel.x86_64                    1.0.6-13.amzn2.0.3             @amzn2-core
bzip2-libs.x86_64                     1.0.6-13.amzn2.0.3             installed  



$ sudo yum list installed | grep xz
xz.x86_64                             5.2.2-1.amzn2.0.3              installed  
xz-devel.x86_64                       5.2.2-1.amzn2.0.3              @amzn2-core
xz-libs.x86_64                        5.2.2-1.amzn2.0.3              installed

現段階ではpythonのバージョンはシステムの方(3.7.10)が選択されている状態なので、新たにインストールしたバージョンに切り替えます。

$ pyenv global 3.9.13

バージョンを確認すると、3.9.13のほうに切り替わっていることが確認できました。

 $ pyenv versions
  system
* 3.9.13 (set by /home/ec2-user/.pyenv/version)

最後にpipをアップデートしておきます。

$ pip install --upgrade pip
Requirement already satisfied: pip in /home/ec2-user/.pyenv/versions/3.9.13/lib/python3.9/site-packages (22.0.4)
Collecting pip
  Downloading pip-22.1.2-py3-none-any.whl (2.1 MB)
     ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 2.1/2.1 MB 44.9 MB/s eta 0:00:00
Installing collected packages: pip
  Attempting uninstall: pip
    Found existing installation: pip 22.0.4
    Uninstalling pip-22.0.4:
      Successfully uninstalled pip-22.0.4
Successfully installed pip-22.1.2

AWS CLIをアップデートする

バージョン1系のAWS CLIをアンインストール

2022/7/6現在、Cloud9に導入されているAWS CLIはデフォルトでバージョン1系です。

$ aws --version
aws-cli/1.19.112 Python/2.7.18 Linux/4.14.281-212.502.amzn2.x86_64 botocore/1.20.112

これをアンインストールし、新しいバージョンにアップデートしておきます。

 $ sudo pip uninstall awscli -y 
DEPRECATION: Python 2.7 reached the end of its life on January 1st, 2020. Please upgrade your Python as Python 2.7 is no longer maintained. pip 21.0 will drop support for Python 2.7 in January 2021. More details about Python 2 support in pip can be found at https://pip.pypa.io/en/latest/development/releaseprocess/#python-2-support Found existing installation: awscli 1.19.112 Uninstalling awscli-1.19.112: Successfully uninstalled awscli-1.19.112

バージョン2系のAWS CLIをインストール

バージョン2系のAWSCLIをインストールします。

$ curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip"
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100 44.7M  100 44.7M    0     0  16.8M      0  0:00:02  0:00:02 --:--:-- 16.8M
$ unzip awscliv2.zip 
: 
:
:
creating: aws/dist/cryptography/hazmat/bindings/ 
inflating: aws/dist/cryptography/hazmat/bindings/_openssl.abi3.so
$ sudo ./aws/install 
You can now run: /usr/local/bin/aws --version

タブ補完を有効にする

AWS CLIのコマンドはTabキーで補完可能です。開発効率アップのため、こちらの機能も有効にしておきます。

$ complete -C aws_completer aws
$ echo '# aws completer' >> ~/.bash_profile
$ echo complete -C \'$(which aws_completer)\' aws >> ~/.bash_profile

sourceコマンドで設定を適用して完了です。

$ source ~/.bash_profile

おわりに

Cloud9でPythonの開発環境を構築してみるの巻でした。お手軽に環境を作ったり壊したりできるのはクラウド上に開発環境があるメリットですね。特にCloud9であればリアルタイムで他のユーザーと一緒にコーディングでき、ターミナルからAWSサービスに簡単にアクセス可能なのもうれしいポイントです。開発環境の構築にお悩みの方のご参考になれば幸いです。