はじめに
PGP暗号化をLambdaで実装する際に、layerにLambdaのバージョンに対応するライブラリ(python-gnupg)を設定するだけではエラーが発生し使用できなかった。
どうやらライブラリが不足しているようなエラー内容だった。
その際にどういう手順で実装したかを記述する。
前提
- Lambdaのランタイムはpython3.9
- Lambdaのバージョンに対応するlayer(python-gnupg)は作成済みであること。
(今回はpython3.9に対応するライブラリpython-gnupg0.5.2をpipでinstallし、zipファイル固めてLambdaのlayerにアップロードした。) - EC2インスタンスはAmazon Linux2
- { }でくくられている部分は変数名なので適宜変更すること。
今回使用するAWSサービス
- Lambda
- S3
- EC2
実装手順
1. EC2インスタンスを起動しログインをする
① EC2インスタンスでLambdaをパッケージ(zip)化した上でLambdaに反映させるため、EC2インスタンスを起動しログインをしておく。
② Amazon Linux2では既にインストール済みではあるが、確認のため以下のコマンドを実施した。
[ec2-user@~]$ sudo yum install -y gcc make glibc-static
[ec2-user@~]$ sudo yum install bzip2
2. 不足のライブラリをダウンロードする
https://www.gnupg.org/download/
① こちらのリンクから、「GnuPG 1.4 Tarball」をダウンロードする。
② S3に「gnupg-1.4.23.tar.bz2」をアップロードする。今回は{BUCKET_NAME}バケットの直下にアップロードした。
③ 以下のコマンドでEC2内にダウンロードする。
[ec2-user@~]$ aws s3 cp s3://{BUCKET_NAME}/gnupg-1.4.23.tar.bz2 /home/ec2-user
3. ダウンロードしたgnupgをビルドする
① 以下のコマンドを実行する。
[ec2-user@~]$ tar xjf /home/ec2-user/gnupg-1.4.23.tar.bz2
[ec2-user@~]$ cd gnupg-1.4.23/
[ec2-user@gnupg-1.4.23]$ ./configure
[ec2-user@gnupg-1.4.23]$ make CFLAGS='-static'
[ec2-user@gnupg-1.4.23]$ cd ../
4. パッケージ化して、Lambdaにアップロードする
今回は、pgp_lambdaというディレクトリ以下でパッケージ化の作業を行う。
以下のコマンドを実行する。
[ec2-user@~]$ mkdir pgp_lambda
[ec2-user@~]$ cd gnupg-1.4.23/
ビルドしたものをコピーする。
[ec2-user@gnupg-1.4.23]$ cp g10/gpg /home/ec2-user/pgp_lambda/
[ec2-user@gnupg-1.4.23]$ cd ../
[ec2-user@~]$ cd pgp_lambda/
先程作成したフォルダにてpython-gnupgをインストールする。
[ec2-user@pgp_lambda]$ pip install -t . python-gnupg
gnupg.pycとpython_gnupg-0.5.1.dist-infoは不要そうなので、不要なファイルは取り合えずpython-gnupgからは移動させておいた。
[ec2-user@pgp_lambda]$ mv gnupg.pyc /home/ec2-user/
[ec2-user@pgp_lambda]$ mv python_gnupg-0.5.1.dist-info /home/ec2-user/
以下のコマンドで「lambda_function.py」ファイルを作成する。
[ec2-user@pgp_lambda]$ touch lambda_function.py
本来この「lambda_function.py」に処理のコードを記述するのだが、今回はライブラリを使用可能にする実装方法なので、gpgのオブジェクトが生成できればいいので、以下のコードにする。
Lambdaが使用できる一時領域が"/tmp"であることに気を付けなければならない。
import gnupg
def lambda_handler(event, context):
gpg = gnupg.GPG(gnupghome="/tmp", gpgbinary="./gpg")
権限の変更をする。
[ec2-user@pgp_lambda]$ chmod o+r gnupg.py lambda_function.py
[ec2-user@pgp_lambda]$ chmod o+rx gpg
zip化する。
[ec2-user@pgp_lambda]$ zip lambda_function.zip gnupg.py gpg lambda_function.py
S3にアップロードする。
[ec2-user@pgp_lambda]$ aws s3 cp /home/ec2-user/pgp_lambda/lambda_function.zip s3://{BUCKET_NAME}/
S3のアップロードしたzipをダウンロードし、Lambdaの関数にzipでコードを反映させる。
もちろん、 作成したLambda関数のlayerにpython-gnupgを設定することを忘れずに。
テスト実行でエラーが発生しないことが確認できれば問題なく実装できている。