Lambda で Amazon Linux 2 AMI ネイティブバイナリパッケージを使用するにはどうすればよいですか?

最終更新日: 2022 年 3 月 28 日

バイナリ共有ライブラリの依存関係を含み、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.    テキストエディタを使用して、次のサンプルコードを含む Dockerfilelambda-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 関数の作成」を参照してください。


この記事はお役に立ちましたか?


請求に関するサポートまたは技術サポートが必要ですか?