はじめに
「Lambda関数にレイヤーを追加したいけれど、必要なレイヤーが見つからない!」「自分でレイヤーをパッキングしたいけど、Linuxの開発環境がない!」そんなお悩みをお持ちの方はいらっしゃいませんか?
実際、私自身も利用したいライブラリ用のレイヤーが見つからなかったり、Linuxの開発環境が手元になくてレイヤーを作成できず、困った経験があります。
そんな中、Dockerコンテナ使ったレイヤー作成方法が紹介されていました。コンテナイメージ内でライブラリをダウンロードしzip化、レイヤーに登録する方法です。
コンテナイメージ内でLambda レイヤーと拡張機能を動作させる

でもDockerの開発環境が必要でしょ?
そんな声が上がると思いますが、ご安心ください。
2023/12/27のアップデートによってCloudShellでDockerが利用できるようになっており、AWSマネジメントコンソール上で、レイヤーを作ることが可能となりました。
この記事では、CloudShell上でDockerコンテナを利用してレイヤー作成環境を構築し、ライブラリをパッケージ化してレイヤー登録する方法を紹介します。
環境構成
レイヤーを作成に使うサービスの環境構成は以下の通りです。
CloudShellについて
Cloudhell(正式名称はAWS CloudShell)について簡単に紹介します。
CloudhellはAWS管理コンソール上から起動できるブラウザベースのShellです。
CloudhellではBash、Powershell、Z shellが利用可能で、git、make、pip、sudo、tar、tmux、vim、wget、zipが事前にインストールされています。AWS CLIも実行できます。
スペックは以下になります。
- CPU:1vCPU
- メモリ:2GB
- ストレージ:1GB
Cloudhellの環境はセッション終了後すぐに削除されず、最後のセッション終了後120日後に自動的に削除されます。120日以内に再アクセスすることでCloudhell内のデータを保持することができます。
CloudShell料金
CloudShell自体は追加料金なしで利用可能です。
ただし、CloudShellを通して他のサービスを実行した場合は実行サービス側で料金が発生します。
手順概要
- CloudShellを起動して作業環境を準備
- Dockerfileを作成してレイヤー用ライブラリをパッケージ化するコンテナを定義
- Dockerイメージをビルドし、zipファイルを生成
- Lambdaレイヤーに登録して利用可能にする
1. CloudShellを起動
AWS管理コンソールのサービス検索画面で「CloudShell」を検索します。「CloudShell」をクリックします。
しばらくするとターミナルの画面が表示されます。
2. Dockerファイルを作成
ECRからLambdaのコンテナイメージを指定したDockerファイルを作成します。以下利用するランタイムに合わせてECRイメージ名とインストール先のパスを確認してください。
①ECRイメージ名
Lambdaランタイム | ECRイメージ名 |
---|---|
python 3.13 | public.ecr.aws/lambda/python:3.13 |
python 3.12 | public.ecr.aws/lambda/python:3.12 |
Node.Js 22.x | public.ecr.aws/lambda/nodejs:22 |
Node.Js 20.x | public.ecr.aws/lambda/nodejs:20 |
Java 21 | public.ecr.aws/lambda/java:21 |
Java 17 | public.ecr.aws/lambda/java:17 |
Ruby 3.3 | public.ecr.aws/lambda/ruby:3.3 |
Ruby 3.2 | public.ecr.aws/lambda/ruby:3.2 |
.NET 8 | public.ecr.aws/lambda/dotnet:8 |
.NET 6 | public.ecr.aws/lambda/dotnet:6 |
Amazon Linux 2023 | public.ecr.aws/lambda/provided:al2023 |
Amazon Linux 2 | public.ecr.aws/lambda/provided:al |
他のイメージはこちらから検索可能です。Amazon ECR Public Gallery
②インストール先のパス
Lambdaランタイム | ECRイメージ名 |
---|---|
python | python python/lib/python3.xx/site-packages |
Node.js | nodejs/node_modules nodejs/node16/node_modules (NODE_PATH) nodejs/node18/node_modules (NODE_PATH) nodejs/node20/node_modules (NODE_PATH) |
Java | java/lib (CLASSPATH) |
Ruby | ruby/gems/3.2.0 (GEM_PATH) ruby/lib (RUBYLIB) |
すべてのランタイム | bin (PATH) lib (LD_LIBRARY_PATH) |
今回はpython3.12を例にレイヤーを作成します。
ファイル名:Dockerfile
FROM public.ecr.aws/lambda/python:3.12
WORKDIR /work
# システム更新と必要なパッケージのインストール
RUN dnf update && dnf install -y zip
RUN pip install --upgrade pip && \
pip install requests -t /python/lib/python3.12/site-packages/
ENTRYPOINT [""]
CMD zip -r requests-3.12.zip /python/
3. イメージをビルドして、zip ファイルを生成
以下を実行しzipファイルを作成します。
docker build -t requests-3.12 . -f Dockerfile
# [+] Building 66.2s (8/8) FINISHED
# => [internal] load build definition from Dockerfile 0.0s
# => => transferring dockerfile: 411B 0.0s
# => [internal] load metadata for public.ecr.aws/lambda/python:3.12 1.6s
# => [internal] load .dockerignore 0.0s
# => => transferring context: 2B 0.0s
# => [1/4] FROM public.ecr.aws/lambda/python:3.12@sha256:fb2ae6a223a4aa8332099f2cfce89b8ea36503f17335e86a5da9b52a79c48d8e 26.6s
# => => resolve public.ecr.aws/lambda/python:3.12@sha256:fb2ae6a223a4aa8332099f2cfce89b8ea36503f17335e86a5da9b52a79c48d8e 0.0s
# => => sha256:6cf6e91e2b6562639a52f5f0364950ff0140a89428e32a2806af54aa8f77e7c4 1.58kB / 1.58kB 0.0s
# => => sha256:d0e32a72b2b17fe5cee31808096f10dfc68b71512b270a62e14217bf67aa7d90 35.83MB / 35.83MB 0.4s
# => => sha256:cfe4b64d8d5233c83ece3cb8e551e6e28fd4ec5be77648ac7b384ebf3959d533 417B / 417B 0.4s
# => => sha256:fb2ae6a223a4aa8332099f2cfce89b8ea36503f17335e86a5da9b52a79c48d8e 772B / 772B 0.0s
# => => sha256:5bd733d8e23d4f6dfeaefba846424f4eb9fab900604dd929cf647eea4bf8a48f 87.99kB / 87.99kB 0.3s
# => => sha256:239e646fc7b0b547387bc2db04e8478a64ffd9dde4faeb4d2eec98142841b668 4.38kB / 4.38kB 0.0s
# => => sha256:35e8cd243a506790d0fe4ac7e61c71ab19aa4b83441559be52d388b93be5fe78 2.68MB / 2.68MB 0.5s
# => => sha256:5e9df991226277b58227af8cfd009679df1aa2240246dd8e8c7a22f14287c144 143.76MB / 143.76MB 3.4s
# => => sha256:f9a30838f134c23905c785b125c426c847ee353854ef17aac406b3d7da6e85fa 14.16kB / 14.16kB 0.7s
# => => extracting sha256:d0e32a72b2b17fe5cee31808096f10dfc68b71512b270a62e14217bf67aa7d90 5.0s
# => => extracting sha256:5bd733d8e23d4f6dfeaefba846424f4eb9fab900604dd929cf647eea4bf8a48f 0.0s
# => => extracting sha256:cfe4b64d8d5233c83ece3cb8e551e6e28fd4ec5be77648ac7b384ebf3959d533 0.0s
# => => extracting sha256:35e8cd243a506790d0fe4ac7e61c71ab19aa4b83441559be52d388b93be5fe78 0.9s
# => => extracting sha256:5e9df991226277b58227af8cfd009679df1aa2240246dd8e8c7a22f14287c144 13.3s
# => => extracting sha256:f9a30838f134c23905c785b125c426c847ee353854ef17aac406b3d7da6e85fa 0.0s
# => [2/4] WORKDIR /work 3.5s
# => [3/4] RUN dnf update && dnf install -y zip 19.8s
# => [4/4] RUN pip install --upgrade pip && pip install requests -t /python/lib/python3.12/site-packages/ 9.6s
# => exporting to image 4.8s
# => => exporting layers 4.8s
# => => writing image sha256:44712b06f968f1587fdbfff92cb13b840579cef8ed5026aefd653aa8ef3ba434 0.0s
# => => naming to docker.io/library/requests-3.12
docker run -v "${PWD}":/work requests-3.12
# adding: python/ (stored 0%)
# adding: python/lib/ (stored 0%)
# adding: python/lib/python3.12/ (stored 0%)
# adding: python/lib/python3.12/site-packages/ (stored 0%)
# adding: python/lib/python3.12/site-packages/charset_normalizer/ (stored 0%)
・
・
・
# adding: python/lib/python3.12/site-packages/requests-2.32.3.dist-info/REQUESTED (stored 0%)
# adding: python/lib/python3.12/site-packages/requests-2.32.3.dist-info/WHEEL (stored 0%)
requests-3.12が作成できました。
ls -l
# -rw-r--r--. 1 cloudshell-user cloudshell-user 317 Nov 12 16:43 Dockerfile
# -rw-r--r--. 1 root root 1062298 Nov 12 16:54 requests-3.12.zip
4. Lambda レイヤーを登録
CloudShell上でAWS CLIを実行し、作成した requests-3.12 を Lambda レイヤーに登録します。
aws lambda publish-layer-version \
--layer-name requests-312 \
--zip-file fileb://requests-3.12.zip \
--compatible-runtimes python3.12 \
--region ap-northeast-1
# {
# "Content": {
# "Location": "https://awslambda-ap-ne-1-layers.s3.ap-northeast-1.amazonaws.com/XXXXXXXX",
# "CodeSha256": "XXXXXXXX",
# "CodeSize": XXXXXXXX
# },
# "LayerArn": "arn:aws:lambda:ap-northeast-1:XXXXXXXXXXXX:layer:requests-312",
# "LayerVersionArn": "arn:aws:lambda:ap-northeast-1:XXXXXXXXXXXX:layer:requests-312:1",
# "Description": "",
# "CreatedDate": "2024-11-12T16:56:42.911+0000",
# "Version": 1,
# "CompatibleRuntimes": [
# "python3.12"
# ]
# }
Lambdaの画面からレイヤーを確認するとrequests-312が作成されています。
6. まとめ
この記事では、Linuxの開発環境がなくても簡単にLambdaのレイヤーを作成する手順をご紹介しました。
外部レイヤーなどで使いたいライブラリが見つからない場合はこちらの方法でレイヤーを作成してみてください。
効率的にレイヤーを作成して、Lambda開発の幅を広げてみましょう!
|