17.4K Views
January 10, 24
スライド概要
Serverless LT初心者向け LT大会 #41
https://serverlesslt.connpass.com/event/305399/
Lambda+PythonでLambda Layerを 使うときにハマったこと Serverless LT初心者向け LT大会 #41 (うえち こうへい) 上地 航平
目次 ● Lambda と Lambda Layerの概要 ○ ○ ○ AWS Lambdaとは? Lambda Layerをざっくり理解しよう Lambda Layerのユースケース ● 実際にLambda Layerを使ってみた ○ ○ ○ ○ step1. レイヤーコンテンツをパッケージ化する step2. Lambda layerとしてアップロードする ハマったエラー ■ ʻDEFAULT_CIPHERSʼ ImportErrorエラー つまり、どのように解消したか
自己紹介 ❏ 名前 ❏ ❏ 上地航平(うえち こうへい ) 経歴 ❏ スケボー業界 (未経験転職 )…>クラウド運用 …>開発 ←イマココ ❏ ❏ 社内業務の効率化・フォロー・自動化を担うサービスの開発と運用に従事 好きなAWSサービス ❏ CloudFormation
Lambda と Lambda Layerの概要
AWS Lambdaとは? ❏ AWSが提供する FaaS(Function as a Service) ❏ サーバーのプロビジョニング / 管理が不要 ❏ 短い関数など、すぐプログラムの実行ができるサービス ❏ 対応言語:Java、Go、PowerShell、Node.js、C#、Python、Ruby (よくある質問 -> Q: AWS Lambda がサポートする言語は何ですか? https://aws.amazon.com/jp/lambda/faqs/ ) ❏ リクエストベースの従量料金体制
Python書きたい AWS Lambdaとは? ❏ Lambdaを使うと、何が嬉しいのか? ❏ コーディング前の下準備が不要 【従来の構成】 ・VPC、EC2を構築 ・Pythonをインストール ...大変 ④コーディング ⑤プログラム実行 VPCやEC2といった インフラ環境から用意する必 要がある。 ③環境構築 (言語やミドルウェア) ①VPC構築 ②EC2構築
AWS Lambdaとは? ❏ Lambdaを使うと、何が嬉しいのか? ❏ コーディング前の下準備が不要 Python書きたい → Lambdaならすぐ書ける !嬉 しい! ②コーディング ③プログラム実行 【Lambda(サーバーレス )構成】 インフラ環境は不要のため、 コーディングから初める事が可能 ①Lambda構築
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を活用することで、コードの再利用や外部ライブラリの使用が可能になります。
Lambda Layerのユースケース ① Lambda関数でコーディング中、外部ライブラリを使いたくなった時に活躍 標準ライブラリ以外の外部ライブラリを使う場合、Lambda Layerが必要になる。 ● 標準ライブラリとは?(デフォルト使用可能) Pythonをインストールした時点で使えるモジュール (.pyファイル) 例:Python 例:datetime,time,json,os などなど ● 外部ライブラリとは?(lambda Layerが必要) “pip install 〇〇 “ で別途インストールする必要のあるモジュール (.py ファイル) 例:requests,pandas などなど
Lambda Layerのユースケース ① Lambda関数でコーディング中、外部ライブラリを使いたくなった時に活躍 標準ライブラリ以外の外部ライブラリを使う場合、Lambda Layerが必要になる。 例:Python
Lambda Layerのユースケース ② 複数のLamdba関数間でコードの再利用が可能となる。 Lambda関数から切り離し、Lambda Layerへアップロードすることで依存関係が低下する。 Lambda関数自体のコード記述量も少なくなり軽量化する。 def lambda_handler(): 処理A() 処理B() … def 処理A … … … def 処理B … … … Lambda関数① Lambda関数② Lambda関数③
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関数③
実際にLambda Layerを使ってみた
実際にLambda Layerを使ってみた slack にメッセージを送信するLambda関数をPython3.9で実装する。 slack APIにリクエスト送信する仮定でrequests外部ライブラリが必要となる。 実行 外部ライブラリである”requests”が使用できない のでエラーとなる。
step1. 外部ライブラリをパッケージ化する 現状、Lambda関数に外部ライブラリrequestsが含まれておらず使用できない。 ローカル環境でrequestsライブラリを含むPython実行環境を作成し.zip化する。 # ① ローカルPC環境で外部ライブラリをパッケージ化する mkdir python pip install -t python requests zip -r9 layer.zip python ● カレントディレクトリにpythonという名前のフォルダを作成する。 ● そのフォルダ内にrequestsライブラリとその依存関係をインストールする。 ● .zip形式でパッケージ化する。
step2. Lambda layerとしてアップロードする ② zipファイルをアップロード ① Lambdaコンソールから「レイヤーの作成」
step2. Lambda layerとしてアップロードする ③Lambda Layerが作成され、ARNが表示されるのでコピーしておく。
step2. Lambda layerとしてアップロードする 対象のLambda関数下部より、「レイヤーの追加」セクションがあるのでクリック
step2. Lambda layerとしてアップロードする 詳細画面に遷移するので 「ARNを指定する(Specify an ARN)」を選択 アップロードしたLambda LayerのARNを入力する。 ↳ requestsライブラリを使えるようになる。
ハマったエラー ● Lambda関数を実行したところSlackメッセージ送信できなかった。 ʻDEFAULT_CIPHERSʼ ImportErrorエラーが出てしまった。 "errorMessage": "Unable to import module 'lambda_function': cannot import name 'DEFAULT_CIPHERS' from 'urllib3.util.ssl_' (/opt/python/urllib3/util/ssl_.py)", ● 調査結果 似た事象が 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
つまり、どのように解消したか 以下の手順でレイヤーコンテンツをパッケージ化する事で、requestsとurllib3の外部ラ イブラリの依存関係が正常となり解消する。 # ① requirements.txtファイルを生成 vim requirements.txt # ② requirements.txtファイルに以下2行を必ず追記する。 同様のステップ 2.で 作成したzipパッケージをアップ ロードする。 requests #(ここでurllib3ライブラリのverを2未満となるように指定) urllib3<2 # ③ ローカルPC環境で外部ライブラリをパッケージ化する mkdir python pip install -r requirements.txt -t ./python zip -r9 layer.zip python 解消
実行確認の結果:正常 実行 無事、Slackにもメッセージを受信できました。
参照資料 ・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 'DEFAULT_CIPHERS' from 'urllib3.util.ssl_' (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/)