LoginSignup
1
0

AWS Lambdaでpython-gnupgを使用可能にする実装方法

Last updated at Posted at 2023-12-20

はじめに

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"であることに気を付けなければならない。

lambda_function.py
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を設定することを忘れずに。

テスト実行でエラーが発生しないことが確認できれば問題なく実装できている。

1
0
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
0