\

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レイヤーにデプロイする事で実行できるようになるかと思います。

投稿者 admin

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です