バイナリ共有ライブラリの依存関係を含み、Amazon Linux 2 Amazon マシンイメージ (AMI) で実行する AWS Lambda 関数を作成したいと考えています。パッケージを再コンパイルせずに Amazon Linux 2 AMI ソフトウェアパッケージを使用する方法はありますか?
簡単な説明
Lambda ランタイムに使用される Amazon Linux 2 AMI と Amazon Linux AMI は、同じネイティブバイナリパッケージをすべてサポートしているわけではありません。
回避策として、最初に Docker コマンドラインインターフェイス (CLI) を使用して Lambda コンテナイメージを構築できます。次に、コンテナイメージを使用して Lambda 関数を実行します。
解決方法
注: AWS Command Line Interface (AWS CLI) コマンドの実行中にエラーが発生した場合は、最新の AWS CLI バージョンを使用していることを確認してください。
以下の手順では、curl ライブラリを Docker イメージ (Lambda コンテナイメージ) にインストールする方法について説明します。次に、イメージを使用して Python バージョン 3.9 の Lambda 関数を実行する方法について説明します。他の言語に関しては、必要に応じて各ステップを変更します。
1. まだインストールしていない場合は、Docker CLI をインストールします。
2. lambda-project という名前のプロジェクトディレクトリを作成します。
3. テキストエディタを使用して、次のサンプルコードを含む Dockerfile を lambda-project ディレクトリに作成します。
FROM public.ecr.aws/lambda/python:3.9
# Copy function code
COPY lambda_function.py ${LAMBDA_TASK_ROOT}
# Install the binary packages using yum install
RUN yum install -y curl
# Set the CMD to your handler (could also be done as a parameter override outside of the Dockerfile)
CMD [ "lambda_function.lambda_handler" ]
4. テキストエディタを使用して、次のサンプルコードを含む lambda_function.py ファイルを lambda-project ディレクトリに作成します。
import subprocess
def lambda_handler(event, context):
my_output = subprocess.check_output(["curl","-X", "GET", "https://www.httpbin.org/get"], stderr=subprocess.STDOUT, shell=False)
print(my_output.decode('utf8'))
重要: 以下のすべてのコマンド (ステップ 5 ~ 10) は lambda-project ディレクトリで実行します。
5. 次の docker build Docker CLI コマンドを実行して、Lambda コンテナイメージを作成します。
docker build -t hello-world
6. コンテナイメージをローカルで起動して、コンテナイメージの設定をテストします。コンテナイメージをローカルで起動するには、次の docker run Docker CLI コマンドを実行します。
docker run -p 9000:8080 hello-world
curl -XPOST "http://localhost:9000/2015-03-31/functions/function/invocations" -d '{}'
7. 次の get-login-password AWS CLI コマンドを実行して、Amazon Elastic Container Registry (Amazon ECR) レジストリに対して Docker を認証します。
重要: us-east-1 を実際の AWS リージョンに置き換えます。123456789012 を実際の AWS アカウント ID に置き換えます。
aws ecr get-login-password --region us-east-1 | docker login --username AWS --password-stdin 123456789012.dkr.ecr.us-east-1.amazonaws.com
詳細については、Amazon ECR ユーザーガイドの「認可トークンを使用する」を参照してください。
8. 次の create-repository AWS CLI コマンドを実行して、Amazon ECR リポジトリを作成します。
重要: hello-world は Amazon ECR リポジトリの名前に置き換えます。
aws ecr create-repository --repository-name hello-world --image-scanning-configuration scanOnPush=true --image-tag-mutability MUTABLE
詳細については、Amazon ECR ユーザーガイドの「ステップ 3: リポジトリを作成する」を参照してください。
9. 次の docker tag Docker CLI コマンドを実行して、コンテナイメージにタグ付けしてリポジトリにプッシュします。
重要: 123456789012 は実際の AWS アカウント ID に置き換えます。us-east-1 を実際の AWS リージョンに置き換えます。
docker tag hello-world:latest 123456789012.dkr.ecr.us-east-1.amazonaws.com/hello-world:latest
10. 次の docker push Docker CLI コマンドを実行して、コンテナイメージをリポジトリにプッシュします。
重要: 123456789012 は実際の AWS アカウント ID に置き換えます。us-east-1 を実際の AWS リージョンに置き換えます。
docker push 123456789012.dkr.ecr.us-east-1.amazonaws.com/hello-world:latest
これで、コンテナイメージが Amazon ECR リポジトリに保存されました。詳細については、Amazon ECR ユーザーガイドの「ステップ 4: Amazon ECR にイメージをプッシュする」を参照してください。
11. 作成したコンテナイメージを使用して Lambda 関数を作成してテストします。手順については、Lambda デベロッパーガイドの「コンテナイメージとして定義された Lambda 関数の作成」を参照してください。