Linuxがなくてもできる!Lambda レイヤーの作成方法を紹介

スポンサーリンク
ノウハウ
スポンサーリンク

はじめに

「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を通して他のサービスを実行した場合は実行サービス側で料金が発生します。

手順概要

  1. CloudShellを起動して作業環境を準備
  2. Dockerfileを作成してレイヤー用ライブラリをパッケージ化するコンテナを定義
  3. Dockerイメージをビルドし、zipファイルを生成
  4. 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開発の幅を広げてみましょう!

[商品価格に関しましては、リンクが作成された時点と現時点で情報が変更されている場合がございます。]

徹底攻略AWS認定デベロッパー – アソシエイト教科書&問題集 第2版 [DVA…
価格:3,960円(税込、送料無料) (2024/9/28時点)

楽天で購入

 

 

タイトルとURLをコピーしました