---
title: Lambda+PythonでLayerを使うときにハマったこと
tags: 
author: [uechi kohei](https://convert.docswell.com/user/uechikohei)
site: [Docswell](https://www.docswell.com/)
thumbnail: https://bcdn.docswell.com/page/YE9N3GMRE3.jpg?width=480
description: Serverless LT初心者向け LT大会 #41 https://serverlesslt.connpass.com/event/305399/
published: January 10, 24
canonical: https://convert.docswell.com/s/uechikohei/KVVN9E-2024-01-10-220603
---
# Page. 1

![Page Image](https://bcdn.docswell.com/page/YE9N3GMRE3.jpg)

Lambda+PythonでLambda Layerを
使うときにハマったこと
Serverless LT初心者向け LT大会 #41
（うえち こうへい）
上地 航平


# Page. 2

![Page Image](https://bcdn.docswell.com/page/GE8KMVLG7D.jpg)

目次
● Lambda と Lambda Layerの概要
○
○
○
AWS Lambdaとは？
Lambda Layerをざっくり理解しよう
Lambda Layerのユースケース
● 実際にLambda Layerを使ってみた
○
○
○
○
step1. レイヤーコンテンツをパッケージ化する
step2. Lambda layerとしてアップロードする
ハマったエラー
■ ʻDEFAULT_CIPHERSʼ ImportErrorエラー
つまり、どのように解消したか


# Page. 3

![Page Image](https://bcdn.docswell.com/page/LELZ35LXJR.jpg)

自己紹介
❏
名前
❏
❏
上地航平(うえち こうへい )
経歴
❏
スケボー業界 (未経験転職 )…&gt;クラウド運用 …&gt;開発 ←ｲﾏｺｺ
❏
❏
社内業務の効率化・フォロー・自動化を担うサービスの開発と運用に従事
好きなAWSサービス
❏
CloudFormation


# Page. 4

![Page Image](https://bcdn.docswell.com/page/4JMVD3M3JW.jpg)

Lambda と Lambda Layerの概要


# Page. 5

![Page Image](https://bcdn.docswell.com/page/PJR24QVRE9.jpg)

AWS Lambdaとは？
❏ AWSが提供する FaaS(Function as a Service)
❏ サーバーのプロビジョニング / 管理が不要
❏ 短い関数など、すぐプログラムの実行ができるサービス
❏ 対応言語：Java、Go、PowerShell、Node.js、C#、Python、Ruby
（よくある質問 -&gt; Q: AWS Lambda がサポートする言語は何ですか?
https://aws.amazon.com/jp/lambda/faqs/ ）
❏ リクエストベースの従量料金体制


# Page. 6

![Page Image](https://bcdn.docswell.com/page/PEXD25ZY7X.jpg)

Python書きたい
AWS Lambdaとは？
❏ Lambdaを使うと、何が嬉しいのか？
❏ コーディング前の下準備が不要
【従来の構成】
・VPC、EC2を構築
・Pythonをインストール ...大変
④コーディング
⑤プログラム実行
VPCやEC2といった
インフラ環境から用意する必
要がある。
③環境構築
(言語やミドルウェア)
①VPC構築
②EC2構築


# Page. 7

![Page Image](https://bcdn.docswell.com/page/3EKXM6847D.jpg)

AWS Lambdaとは？
❏ Lambdaを使うと、何が嬉しいのか？
❏ コーディング前の下準備が不要
Python書きたい
→ Lambdaならすぐ書ける !嬉
しい!
②コーディング
③プログラム実行
【Lambda(サーバーレス )構成】
インフラ環境は不要のため、
コーディングから初める事が可能
①Lambda構築


# Page. 8

![Page Image](https://bcdn.docswell.com/page/L735Y62DE5.jpg)

Lambda Layerをざっくり理解しよう
●Lambda Layerとは、
追加のコードまたはデータを含むことができる .zip ファイルアーカイブです。
（AWS公式より https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/chapter-layers.html ）
●単体のLambda関数は、最大5つのLambda Layerを参照可能。
↳.zip化したコードの内容を共有できます。
つまりLambda Layerを活用することで、コードの再利用や外部ライブラリの使用が可能になります。


# Page. 9

![Page Image](https://bcdn.docswell.com/page/87DD5VZ27G.jpg)

Lambda Layerのユースケース
① Lambda関数でコーディング中、外部ライブラリを使いたくなった時に活躍
標準ライブラリ以外の外部ライブラリを使う場合、Lambda Layerが必要になる。
● 標準ライブラリとは？（デフォルト使用可能）
Pythonをインストールした時点で使えるモジュール (.pyファイル)
例：Python
例：datetime,time,json,os などなど
● 外部ライブラリとは？（lambda Layerが必要）
“pip install 〇〇 “ で別途インストールする必要のあるモジュール (.py
ファイル)
例：requests,pandas などなど


# Page. 10

![Page Image](https://bcdn.docswell.com/page/VJPXGVDL78.jpg)

Lambda Layerのユースケース
① Lambda関数でコーディング中、外部ライブラリを使いたくなった時に活躍
標準ライブラリ以外の外部ライブラリを使う場合、Lambda Layerが必要になる。
例：Python


# Page. 11

![Page Image](https://bcdn.docswell.com/page/2EVL6Z16JQ.jpg)

Lambda Layerのユースケース
② 複数のLamdba関数間でコードの再利用が可能となる。
Lambda関数から切り離し、Lambda Layerへアップロードすることで依存関係が低下する。
Lambda関数自体のコード記述量も少なくなり軽量化する。
def lambda_handler():
処理A()
処理B()
…
def 処理A
… … …
def 処理B
… … …
Lambda関数①
Lambda関数②
Lambda関数③


# Page. 12

![Page Image](https://bcdn.docswell.com/page/57GXN422EL.jpg)

Lambda Layerのユースケース
② 複数のLamdba関数間でコードの再利用が可能となる。
Lambda関数から切り離し、Lambda Layerへアップロードすることで依存関係が低下する。
Lambda関数自体のコード記述量も少なくなり軽量化する。
def 処理B … … …
.zipアップロード
Python.zip
共有可能
Lambda Layer
（5つまで）
def lambda_handler():
def処理A()
lambda_handler():
処理B()
処理A()
…
処理B()
def処理C()
処理A … … …
def
… 処理B
… … …
Lambda関数①
Lambda関数②
Lambda関数③


# Page. 13

![Page Image](https://bcdn.docswell.com/page/4EQ8QGP9JP.jpg)

実際にLambda Layerを使ってみた


# Page. 14

![Page Image](https://bcdn.docswell.com/page/KJ42N5XRE1.jpg)

実際にLambda Layerを使ってみた
slack にメッセージを送信するLambda関数をPython3.9で実装する。
slack APIにリクエスト送信する仮定でrequests外部ライブラリが必要となる。
実行
外部ライブラリである”requests”が使用できない
のでエラーとなる。


# Page. 15

![Page Image](https://bcdn.docswell.com/page/LE1M5WNV7G.jpg)

step1. 外部ライブラリをパッケージ化する
現状、Lambda関数に外部ライブラリrequestsが含まれておらず使用できない。
ローカル環境でrequestsライブラリを含むPython実行環境を作成し.zip化する。
# ① ローカルPC環境で外部ライブラリをパッケージ化する
mkdir python
pip install -t python requests
zip -r9 layer.zip python
● カレントディレクトリにpythonという名前のフォルダを作成する。
● そのフォルダ内にrequestsライブラリとその依存関係をインストールする。
● .zip形式でパッケージ化する。


# Page. 16

![Page Image](https://bcdn.docswell.com/page/GEW35643E2.jpg)

step2. Lambda layerとしてアップロードする
② zipファイルをアップロード
① Lambdaコンソールから「レイヤーの作成」


# Page. 17

![Page Image](https://bcdn.docswell.com/page/47ZVNY2GE3.jpg)

step2. Lambda layerとしてアップロードする
③Lambda Layerが作成され、ARNが表示されるのでコピーしておく。


# Page. 18

![Page Image](https://bcdn.docswell.com/page/YJ658DVQ7V.jpg)

step2. Lambda layerとしてアップロードする
対象のLambda関数下部より、「レイヤーの追加」セクションがあるのでクリック


# Page. 19

![Page Image](https://bcdn.docswell.com/page/GJ5Y93D2J4.jpg)

step2. Lambda layerとしてアップロードする
詳細画面に遷移するので
「ARNを指定する（Specify an ARN）」を選択
アップロードしたLambda LayerのARNを入力する。
↳ requestsライブラリを使えるようになる。


# Page. 20

![Page Image](https://bcdn.docswell.com/page/LE35Y6M1J5.jpg)

ハマったエラー
● Lambda関数を実行したところSlackメッセージ送信できなかった。
ʻDEFAULT_CIPHERSʼ ImportErrorエラーが出てしまった。
&quot;errorMessage&quot;: &quot;Unable to import module &#039;lambda_function&#039;: cannot import
name &#039;DEFAULT_CIPHERS&#039; from &#039;urllib3.util.ssl_&#039;
(/opt/python/urllib3/util/ssl_.py)&quot;,
● 調査結果
似た事象が 2023年5⽣上旬より発⽣しておりrequestsのGithubリポジトリでも issueを確認
https://github.com/psf/requests/issues/6443
→実はrequestsライブラリをインストールする際、 urllib3ライブラリも同時にインストールされる。
urllib3は2023年5⽣頃にv1.0系からv2.0系へアップデートされていた。
現在urllib3(v2.0未満)を使用することが推奨されている。
https://urllib3.readthedocs.io/en/latest/v2-migration-guide.html#importerror-cannot-import-name-default-ciph
ers-from-urllib3-util-ssl


# Page. 21

![Page Image](https://bcdn.docswell.com/page/8EDD5V6KEG.jpg)

つまり、どのように解消したか
以下の手順でレイヤーコンテンツをパッケージ化する事で、requestsとurllib3の外部ラ
イブラリの依存関係が正常となり解消する。
# ① requirements.txtファイルを生成
vim requirements.txt
# ② requirements.txtファイルに以下2行を必ず追記する。
同様のステップ 2.で
作成したzipパッケージをアップ
ロードする。
requests
#（ここでurllib3ライブラリのverを2未満となるように指定）
urllib3&lt;2
# ③ ローカルPC環境で外部ライブラリをパッケージ化する
mkdir python
pip install -r requirements.txt -t ./python
zip -r9 layer.zip python
解消


# Page. 22

![Page Image](https://bcdn.docswell.com/page/V7PXGVY3E8.jpg)

実行確認の結果：正常
実行
無事、Slackにもメッセージを受信できました。


# Page. 23

![Page Image](https://bcdn.docswell.com/page/2JVL6ZGN7Q.jpg)

参照資料
・Lambda + Python3.9でrequests2.3.0を使 ったら ʻDEFAULT_CIPHERSʼ ImportErrorが 発⽣した話
(https://iret.media/74569)
・AWS Lambda 料金について
(https://aws.amazon.com/jp/lambda/pricing/)
・Q: AWS Lambda がサポートする言語は何ですか ?
(https://aws.amazon.com/jp/lambda/faqs/)
・Lambda Layerとは
（https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/chapter-layers.html)
・ImportError: cannot import name &#039;DEFAULT_CIPHERS&#039; from &#039;urllib3.util.ssl_&#039;
(https://urllib3.readthedocs.io/en/latest/v2-migration-guide.html#importerror-cannot-import-name-default-ciphers-from-urllib3-util
-ssl)
・Unable to import boto3 because of botocore dependancies on urllib3s removed DEFAULT_CIPHERS #2921
(https://github.com/boto/botocore/issues/2921)
・botocore(boto3)とは？
(https://pypi.org/project/botocore/)
・urllib3 2.0.2
(https://pypi.org/project/urllib3/2.0.2/)


