AWS Lambdaの最新のランタイムではAmazon Linux 2が使われていて、OpenSSLパッケージを見つける事ができません。このような環境でOpenSSLコマンドを使う方法を説明します。
OpenSSLコマンドの確認
ランタイムがPython3.8(Amazon Linux 2)のLambda関数でOpenSSLコマンドを実行してみました。
import subprocess
def lambda_handler(event, context):
output = subprocess.run(['openssl', 'version'], stdout=subprocess.PIPE)
print(output.stdout.decode())
しかし、コンソールにコマンドが見つからない場合のエラーが出力されます。
OpenSSLのバイナリを取得
EC2でAmazon Linux 2 AMIのインスタンスを立ち上げます。インスタンスにSSHで接続して、OpenSSLパッケージのパスを確認します。
$ which openssl
/usr/bin/openssl
SCPでローカルに保存します。
$ mkdir openssl
$ scp -i <鍵ファイルのパス> [email protected]:/usr/bin/openssl ./openssl
Lambdaレイヤーを作成
先ほどローカルに保存したOpenSSLのバイナリをZIPファイルにします。
$ zip -r openssl.zip openssl/
Lambdaレイヤーを作成します。
Lambda関数を作成
新しくLambda関数を作成して、Lambdaレイヤーを設定します。LambdaレイヤーのPATHを追加して、OpensSSLコマンドを実行します。
import os
import subprocess
os.environ['PATH'] = os.environ['PATH'] + ':/opt/openssl'
def lambda_handler(event, context):
output = subprocess.run(['openssl', 'version'], stdout=subprocess.PIPE)
print(output.stdout.decode())
これでOpenSSLのバージョンが出力されます。
まとめ
Lambda関数で秘密鍵や証明書を作成しようとした際に、最新のランタイムでOpenSSLコマンドが使えなくて困りました。他にもOS依存のパッケージをLambdaで使いたい場合は、Lambdaと同じOS(Amazon Linux)をEC2で立ち上げて、バイナリをLambdaレイヤーにデプロイする事で実行できるようになるかと思います。