.zip ファイルアーカイブで Python Lambda 関数をデプロイする - AWS Lambda

.zip ファイルアーカイブで Python Lambda 関数をデプロイする

注記

Python 2.7 ランタイムのサポートは、2021 年 7 月 15 日で終了します。詳細については、「ランタイムサポートポリシー」を参照してください。

AWS Lambda 関数のコードは、スクリプトまたはコンパイルされたプログラム、さらにそれらの依存関係で構成されます。デプロイパッケージを使用して、Lambda に関数コードをデプロイします。Lambda は、コンテナイメージと .zip ファイルアーカイブの 2 種類のデプロイパッケージをサポートしています。

.zip ファイルのデプロイパッケージを作成するには、コマンドラインツール用の組み込み .zip ファイルアーカイブユーティリティまたは他の .zip ファイルユーティリティ (7zip など) を使用できます。.zip ファイルをデプロイパッケージとして使用するには、次の要件に留意してください。

  • .zip ファイルには、関数のコードと、関数のコード (該当する場合) を Lambda で実行するために使用される依存関係が含まれています。関数が標準ライブラリまたは AWS SDK ライブラリにのみ依存する場合は、これらのライブラリを .zip ファイルに含める必要はありません。これらのライブラリは、サポートされている Lambda ランタイム環境とともに含まれています。

  • .zip ファイルのサイズが 50 MB を超える場合は、Amazon Simple Storage Service (Amazon S3) バケットから関数にアップロードすることをお勧めします。

  • デプロイパッケージにネイティブライブラリが含まれている場合は、AWS Serverless Application Model(AWS SAM) でデプロイパッケージを構築できます。AWS SAMCLI sam build コマンドを --use-container と共に使用して、デプロイパッケージを作成できます。このオプションでは、Lambda 実行環境と互換性のある Docker イメージ内にデプロイパッケージを構築します。

    詳細については、AWS Serverless Application Model デベロッパーガイドsam build を参照してください。

  • この関数の命令セットアーキテクチャと互換性を持たせるようにデプロイパッケージを構築する必要があります。

  • Lambda は POSIX ファイルアクセス許可を使用するため、.zip ファイルを作成する前に、デプロイパッケージフォルダのアクセス許可を設定する必要がある場合があります。

注記

Python パッケージには、__init__.py ファイルに初期化コードが含まれている場合があります。Python 3.9 より前のバージョンでは、Lambda は関数ハンドラのディレクトリまたは親ディレクトリにあるパッケージの __init__.py コードを実行してませんでした。Python 3.9 以降のリリースでは、Lambda は初期化中にこれらのディレクトリ内のパッケージの init コードを実行します。

Lambda は、実行環境が最初に初期化されたときにだけ init コードを実行し、その初期化された環境での各関数呼び出しに対しては実行しないことに注意してください。

Prerequisites

サービスAPIオペレーションを呼び出すには、AWS Command Line Interface (AWS CLI) が必要です。    AWS CLI をインストールするには、AWS Command Line Interface ユーザーガイドの「AWS CLI をインストールする」を参照してください。

ランタイム依存関係とは何ですか?

Lambda 関数を作成または更新するには、ランタイム依存関係の有無にかかわらず、デプロイパッケージが必要です。デプロイパッケージは、関数のコードおよび依存関係 (該当する場合) を Lambda で実行するための、ソースバンドルとして機能します。

依存関係には、パッケージ、モジュール、またはその他、関数のコードの Lambda ランタイム環境に含まれていないアセンブリ依存関係などがあります。

以下は、ランタイム依存関係を持たない Lambda 関数を示したものです。

  • 関数のコードが Python 3.8 以降であり、標準の Python 数学ライブラリとロギングライブラリにのみ依存する場合は、.zip ファイルにライブラリを含める必要はありません。これらのライブラリは、Python ランタイムに含まれています。

  • 関数のコードが AWS SDK for Python (Boto3) にだけ依存する場合は、.zip ファイルに boto3 ライブラリを含める必要はありません。これらのライブラリは、Python 3.8 以降のランタイムに含まれています。

注: 最新の機能やセキュリティ更新を有効にするために、Lambda はこれらの Boto3 ライブラリを定期的に更新します。関数で使用する依存関係を完全に制御するには、すべての依存関係をデプロイパッケージでパッケージングします。

依存関係のないデプロイパッケージ

デプロイメントパッケージの .zip ファイルを作成します。

デプロイパッケージを作成するには

  1. コマンドプロンプトを開き、my-math-function プロジェクトディレクトリを作成します。例えば、macOS では次のようになります。

    mkdir my-math-function
  2. my-math-function プロジェクトディレクトリに移動します。

    cd my-math-function
  3. GitHub からサンプルの Python コードの内容をコピーし、lambda_function.py という名前の新しいファイルに保存します。ディレクトリ構造は次のようになります。

    my-math-function$ | lambda_function.py
  4. .zip ファイルのルートに lambda_function.py ファイルを追加します。

    zip my-deployment-package.zip lambda_function.py

    これにより、プロジェクトディレクトリに my-deployment-package.zip ファイルが生成されます。コマンドによって以下の出力が生成されます。

    adding: lambda_function.py (deflated 50%)

依存関係のあるデプロイパッケージ

デプロイメントパッケージの .zip ファイルを作成します。

デプロイパッケージを作成するには

  1. コマンドプロンプトを開き、my-sourcecode-function プロジェクトディレクトリを作成します。例えば、macOS では次のようになります。

    mkdir my-sourcecode-function
  2. my-sourcecode-function プロジェクトディレクトリに移動します。

    cd my-sourcecode-function
  3. 次のサンプル Python コードの内容をコピーし、lambda_function.py という名前の新しいファイルに保存します。

    import requests def main(event, context): response = requests.get("https://www.test.com/") print(response.text) return response.text if __name__ == "__main__": main('', '')

    ディレクトリ構造は次のようになります。

    my-sourcecode-function$ | lambda_function.py
  4. リクエストライブラリを新しい package ディレクトリにインストールします。

    pip install --target ./package requests
  5. ルートにインストール済みライブラリを含むデプロイパッケージを作成します。

    cd package zip -r ../my-deployment-package.zip .

    これにより、プロジェクトディレクトリに my-deployment-package.zip ファイルが生成されます。コマンドによって以下の出力が生成されます。

    adding: chardet/ (stored 0%) adding: chardet/enums.py (deflated 58%) ...
  6. zip ファイルのルートに lambda_function.py ファイルを追加します。

    cd .. zip -g my-deployment-package.zip lambda_function.py

仮想環境の使用

仮想環境で Python 関数を更新する

  1. 仮想環境をアクティブ化します。以下に例を示します。

    ~/my-function$ source myvenv/bin/activate
  2. pip でライブラリをインストールします。

    (myvenv) ~/my-function$ pip install requests
  3. 仮想環境を無効化します。

    (myvenv) ~/my-function$ deactivate
  4. ルートにインストール済みライブラリを含むデプロイパッケージを作成します。

    ~/my-function$cd myvenv/lib/python3.8/site-packages zip -r ../../../../my-deployment-package.zip .

    最後のコマンドは、デプロイメントパッケージを my-function ディレクトリのルートに保存します。

    ヒント

    ライブラリは、site-packages または dist-packages、および最初のフォルダ lib または lib64 に表示されます。特定のパッケージを見つけるには、pip show コマンドを使用します。

  5. デプロイパッケージのルートに関数コードファイルを追加します。

    ~/my-function/myvenv/lib/python3.8/site-packages$ cd ../../../../ ~/my-function$ zip -g my-deployment-package.zip lambda_function.py

    このステップを完了すると、以下のようなディレクトリ構造になります。

    my-deployment-package.zip$ │ lambda_function.py │ __pycache__ │ certifi/ │ certifi-2020.6.20.dist-info/ │ chardet/ │ chardet-3.0.4.dist-info/ ...

.zip ファイルを関数にデプロイします。

新しいコードを関数にデプロイするには、新しい .zip ファイルデプロイパッケージをアップロードします。Lambda コンソールを使用して.zip ファイルを関数にアップロードするか、UpdateFunctionCode CLI コマンドを使用できます。

次の例では、my-deployment-package.zip という名前のファイルをアップロードします。プレフィックス fileb:// を使用して、バイナリ.zip ファイルを Lambda にアップロードします。

~/my-function$ aws lambda update-function-code --function-name MyLambdaFunction --zip-file fileb://my-deployment-package.zip { "FunctionName": "mylambdafunction", "FunctionArn": "arn:aws:lambda:us-west-2:123456789012:function:mylambdafunction", "Runtime": "python3.8", "Role": "arn:aws:iam::123456789012:role/lambda-role", "Handler": "lambda_function.lambda_handler", "CodeSize": 5912988, "CodeSha256": "A2P0NUWq1J+LtSbkuP8tm9uNYqs1TAa3M76ptmZCw5g=", "Version": "$LATEST", "RevisionId": "5afdc7dc-2fcb-4ca8-8f24-947939ca707f", ... }