Ruby Lambda 関数で .zip ファイルアーカイブを使用する - AWS Lambda

Ruby Lambda 関数で .zip ファイルアーカイブを使用する

AWS Lambda 関数のコードは、関数のハンドラーコードを含む .rb ファイルと、そのコードが依存する追加の依存関係 (gem) で構成されています。この関数コードを Lambda にデプロイするには、デプロイパッケージを使用します。このパッケージは、.zip ファイルアーカイブでもコンテナイメージでもかまいません。Ruby でコンテナイメージを使用する方法の詳細については、「コンテナイメージで Ruby Lambda 関数をデプロイする」を参照してください。

.zip ファイルのデプロイパッケージを .zip ファイルアーカイブとして作成するには、コマンドラインツール用の組み込み .zip ファイルアーカイブユーティリティ、または他の .zip ファイルユーティリティ (7zip など) を使用します。次のセクションに示す例では、Linux または macOS 環境でコマンドライン zip ツールを使用していることを前提としています。Windows で同じコマンドを使用するには、Windows Subsystem for Linux をインストールして、Windows 統合バージョンの Ubuntu と Bash を取得します

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

以下のセクションのコマンド例では、バンドラーユーティリティを使用してデプロイパッケージに依存関係を追加します。バンドラーをインストールするには、以下のコマンドを実行します。

gem install bundler

Ruby の依存関係

Ruby ランタイムを使用する Lambda 関数の場合、依存関係には任意の Ruby gem を使用できます。.zip アーカイブを使用して関数をデプロイする場合、これらの依存関係を関数コードとともに .zip ファイルに追加するか、Lambda レイヤーを使用できます。レイヤーは、追加のコードまたはその他のコンテンツを含むことができる個別の .zip ファイルです。Lambda レイヤーの使用の詳細については、「Lambda レイヤーでの作業」を参照してください。

Ruby ランタイムには AWS SDK for Ruby が含まれます。関数で SDK を使用する場合は、それをコードにバンドルする必要はありません。ただし、依存関係を完全に制御したり、特定のバージョンの SDK を使用したりするには、関数のデプロイパッケージに追加することができます。SDK は .zip ファイルに含めるか、Lambda レイヤーを使用して追加することができます。.zip ファイルまたは Lambda レイヤー内の依存関係は、ランタイムに含まれるバージョンよりも優先されます。ご使用のランタイムバージョンに含まれている SDK for Ruby のバージョンを確認するには、「ランタイムに含まれる SDK バージョン」を参照してください。

AWS 責任分担モデルでは、関数のデプロイパッケージに含まれる依存関係を管理する責任があります。これには、更新とセキュリティパッチの適用が含まれます。関数のデプロイパッケージ内の依存関係を更新するには、まず新しい .zip ファイルを作成し、そのファイルを Lambda にアップロードします。詳細については、「依存関係を含む .zip デプロイパッケージを作成する」と「.zip ファイルを使用した Ruby Lambda 関数の作成と更新」を参照してください。

依存関係のない .zip デプロイパッケージを作成する

関数コードに依存関係がない場合、.zip ファイルには関数のハンドラーコードを含む .rb ファイルのみが含まれます。任意の zip ユーティリティを使用して、.rb ファイルをルートとする .zip ファイルを作成します。.rb ファイルが .zip ファイルのルートにない場合、Lambda はコードを実行できません。

.zip ファイルをデプロイして新しい Lambda 関数を作成する方法の詳細、既存の Lambda 関数を更新する方法の詳細については、「.zip ファイルを使用した Ruby Lambda 関数の作成と更新」を参照してください。

依存関係を含む .zip デプロイパッケージを作成する

関数コードが追加の Ruby gem に依存している場合、これらの依存関係を関数コードとともに .zip ファイルに追加するか、Lambda レイヤーを使用できます。このセクションでは、依存関係を .zip デプロイパッケージに含める方法について説明します。依存関係をレイヤーに含める方法については、「依存関係の Ruby レイヤーを作成する」を参照してください。

関数コードがプロジェクトディレクトリの lambda_function.rb という名前のファイルに保存されているとします。次の CLI コマンドの例では、関数コードとその依存関係を格納している my_deployment_package.zip という名前の .zip ファイルを作成します。

デプロイパッケージを作成するには
  1. プロジェクトディレクトリに、依存関係を指定する Gemfile を作成します。

    bundle init
  2. 任意のテキストエディタを使用して、Gemfile を編集して関数の依存関係を指定します。例えば、TZInfo gem を使用するには、Gemfile を次のように編集します。

    source "https://rubygems.org" gem "tzinfo"
  3. 次のコマンドを実行して、Gemfile で指定した gem をプロジェクトディレクトリにインストールします。このコマンドでは vendor/bundle を gem インストールのデフォルトパスとして設定します。

    bundle config set --local path 'vendor/bundle' && bundle install

    次のような出力が表示されます。

    Fetching gem metadata from https://rubygems.org/........... Resolving dependencies... Using bundler 2.4.13 Fetching tzinfo 2.0.6 Installing tzinfo 2.0.6 ...
    注記

    後で gem をグローバルにインストールし直すには、次のコマンドを実行します。

    bundle config set --local system 'true'
  4. 関数のハンドラーコードを含む lambda_function.rb ファイルと、前のステップでインストールした依存関係を格納した .zip ファイルアーカイブを作成します。

    zip -r my_deployment_package.zip lambda_function.rb vendor

    次のような出力が表示されます。

    adding: lambda_function.rb (deflated 37%) adding: vendor/ (stored 0%) adding: vendor/bundle/ (stored 0%) adding: vendor/bundle/ruby/ (stored 0%) adding: vendor/bundle/ruby/3.2.0/ (stored 0%) adding: vendor/bundle/ruby/3.2.0/build_info/ (stored 0%) adding: vendor/bundle/ruby/3.2.0/cache/ (stored 0%) adding: vendor/bundle/ruby/3.2.0/cache/aws-eventstream-1.0.1.gem (deflated 36%) ...

依存関係の Ruby レイヤーを作成する

このセクションでは、依存関係をレイヤーに含める方法について説明します。依存関係をデプロイパッケージに含める方法については、「依存関係を含む .zip デプロイパッケージを作成する」を参照してください。

関数にレイヤーを追加すると、Lambda はレイヤーのコンテンツをその実行環境の /opt ディレクトリに読み込みます。Lambda ランタイムごとに、PATH 変数には /opt ディレクトリ内の特定のフォルダパスがあらかじめ含まれます。PATH 変数がレイヤーコンテンツを取得できるようにするには、レイヤーの .zip ファイルの依存関係が次のフォルダーパスにある必要があります。

  • ruby/gems/2.7.0 (GEM_PATH)

  • ruby/lib (RUBYLIB)

例えば、レイヤーの.zip ファイルの構造は次のようになります。

json.zip └ ruby/gems/2.7.0/ | build_info | cache | doc | extensions | gems | └ json-2.1.0 └ specifications └ json-2.1.0.gemspec

さらに、Lambda は /opt/lib ディレクトリ内のライブラリ、および /opt/bin ディレクトリ内のバイナリを自動的に検出します。Lambda がレイヤーのコンテンツを正しく検出できるように、次の構造でレイヤーを作成することもできます。

custom-layer.zip └ lib | lib_1 | lib_2 └ bin | bin_1 | bin_2

レイヤーをパッケージ化したら、「Lambda でのレイヤーの作成と削除」および「関数へのレイヤーの追加」を参照してレイヤーの設定を完了してください。

ネイティブライブラリとともに .zip デプロイパッケージを作成する

nokogirinio4rmysql などの多くの一般的な Ruby gem には、C で書かれたネイティブの拡張機能が含まれています。C コードを含むライブラリをデプロイパッケージに追加するときは、パッケージを正しく構築し、Lambda 実行環境と互換性があることを確認する必要があります。

本番環境のアプリケーションでは、AWS Serverless Application Model (AWS SAM) を使用してコードをビルドしてデプロイすることをお勧めします。AWS SAM では、Lambda のような Docker コンテナ内部に関数を構築するのに、sam build --use-container オプションを使用します。AWS SAM を使用して関数コードをデプロイする方法の詳細については、「AWS SAM デベロッパーガイド」の「アプリケーションの構築」を参照してください。

AWS SAM を使用せずに gem を含む .zip デプロイパッケージをネイティブ拡張で作成するには、代わりにコンテナを使用して Lambda Ruby ランタイム環境と同じ環境に依存関係をバンドルすることもできます。これらの手順を完了するには、ビルドマシンに Docker がインストールされている必要があります。Docker のインストールの詳細については、「Docker Engine のインストール」を参照してください。

Docker コンテナに.zip デプロイパッケージを作成するには
  1. コンテナを保存するフォルダをローカルビルドマシンに作成します。そのフォルダ内に、dockerfile という名前のファイルを作成し、次のコードを貼り付けます。

    FROM public.ecr.aws/sam/build-ruby3.2:latest-x86_64 RUN gem update bundler CMD "/bin/bash"
  2. dockerfile を作成したフォルダ内で、次のコマンドを実行して Docker コンテナを作成します。

    docker build -t awsruby32 .
  3. 関数のハンドラーコードが記載された .rb ファイルと関数の依存関係を指定した Gemfile を含むプロジェクトディレクトリに移動します。そのディレクトリ内から、次のコマンドを実行して Lambda Ruby コンテナを起動します。

    Linux/MacOS
    docker run --rm -it -v $PWD:/var/task -w /var/task awsruby32
    注記

    MacOS では、リクエストされたイメージのプラットフォームが検出されたホストプラットフォームと一致しないという警告が表示されることがあります。この警告は無視してください。

    Windows PowerShell
    docker run --rm -it -v ${pwd}:var/task -w /var/task awsruby32

    コンテナが起動すると、bash プロンプトが表示されます。

    bash-4.2#
  4. バンドルユーティリティを設定して、Gemfile で指定した gem をローカルの vendor/bundle ディレクトリにインストールし、依存関係をインストールします。

    bash-4.2# bundle config set --local path 'vendor/bundle' && bundle install
  5. 関数コードとその依存関係を含む .zip デプロイパッケージを作成します。この例では、関数のハンドラーコードを含むファイルには lambda_function.rb という名前が付けられています。

    bash-4.2# zip -r my_deployment_package.zip lambda_function.rb vendor
  6. コンテナを終了し、ローカルプロジェクトディレクトリに戻ります。

    bash-4.2# exit

    これで、.zip ファイルデプロイパッケージを使用して Lambda 関数を作成または更新できます。「.zip ファイルを使用した Ruby Lambda 関数の作成と更新」を参照してください。

.zip ファイルを使用した Ruby Lambda 関数の作成と更新

.zip デプロイパッケージを作成すると、このパッケージを使用して新しい Lambda 関数を作成するか、既存の関数を更新できます。.zip パッケージをデプロイするには、Lambda コンソール、AWS Command Line Interface、Lambda API を使用します。AWS Serverless Application Model (AWS SAM) および AWS CloudFormation を使用して、Lambda 関数を作成および更新することもできます。

Lambda の .zip デプロイパッケージの最大サイズは  250 MB (解凍) です。この制限は、Lambda レイヤーを含む、更新するすべてのファイルの合計サイズに適用されることに注意してください。

Lambda ランタイムには、デプロイパッケージ内のファイルを読み取るアクセス許可が必要です。Linux のアクセス権限の 8 進表記では、Lambda には非実行ファイル用に 644 のアクセス権限 (rw-r--r--) が必要であり、ディレクトリと実行可能ファイル用に 755 のアクセス権限 (rwxr-xr-x) が必要です。

Linux と MacOS で、デプロイパッケージ内のファイルやディレクトリのファイルアクセス権限を変更するには、chmod コマンドを使用します。例えば、実行可能ファイルに正しいアクセス許可を付与するには、次のコマンドを実行します。

chmod 755 <filepath>

Windows でファイルアクセス許可を変更するには、「Microsoft Windows ドキュメント」の「Set, View, Change, or Remove Permissions on an Object」を参照してください。

コンソールを使用して .zip ファイルの関数を作成、更新する

新しい関数を作成するには、まずコンソールで関数を作成し、次に .zip アーカイブをアップロードする必要があります。既存の関数を更新するには、その関数のページを開き、同じ手順に従って更新した .zip ファイルを追加します。

.zip ファイルが 50 MB 未満の場合は、ローカルマシンから直接ファイルをアップロードして関数を作成または更新できます。50 MB を超える .zip ファイルの場合は、まず  Amazon S3 バケットにパッケージをアップロードする必要があります。AWS Management Console を使用して Amazon S3 バケットにファイルをアップロードする手順については、「Amazon S3 の開始方法」を参照してください。AWS CLI を使用してファイルをアップロードするには、「AWS CLI ユーザーガイド」の「オブジェクトの移動」を参照してください。

注記

既存の関数のデプロイパッケージタイプ (.zip またはコンテナイメージ) を変更することはできません。例えば、既存のコンテナイメージ関数を、.zip ファイルアーカイブを使用するように変換することはできません。この場合は、新しい関数を作成する必要があります。

新しい関数を作成するには (コンソール)
  1. Lambda コンソールの [関数] ページを開き、[関数の作成] を選択します。

  2. [一から作成] を選択します。

  3. [基本的な情報] で、以下を行います。

    1. [関数名] に、関数名を入力します。

    2. [ランタイム] で、使用するランタイムを選択します。

    3. (オプション) [アーキテクチャ]で、関数の命令セットアーキテクチャを選択します。デフォルトのアーキテクチャは x86_64 です。関数用の .zip デプロイパッケージと選択した命令セットのアーキテクチャに互換性があることを確認してください。

  4. (オプション) [アクセス権限] で、[デフォルトの実行ロールの変更] を展開します。新しい [実行ロール] を作成することも、既存のロールを使用することもできます。

  5. [関数の作成]を選択します。Lambda は、選択したランタイムを使用して基本的な「Hello world」関数を作成します。

ローカルマシンから  zip アーカイブをアップロードするには (コンソール)
  1. Lambda コンソールの [関数ページ] で、.zip ファイルをアップロードする関数を選択します。

  2. [コード] タブを選択します。

  3. [コードソース] ペインで、[アップロード元] をクリックします。

  4. [.zip ファイル] をクリックします。

  5. .zip ファイルをアップロードするには、次の操作を行います。

    1. [アップロード] をクリックし、ファイルセレクターで .zip ファイルを選択します。

    2. [開く] をクリックします。

    3. [保存] をクリックします。

Amazon S3 バケットから .zip アーカイブをアップロードするには (コンソール)
  1. Lambda コンソールの [関数ページ] で、新しい .zip ファイルをアップロードする関数を選択します。

  2. [コード] タブを選択します。

  3. [コードソース] ペインで、[アップロード元] をクリックします。

  4. [Amazon S3 ロケーション] を選択します。

  5. .zip ファイルの Amazon S3 リンク URL を貼り付けて、[保存] を選択します。

コンソールコードエディタを使用して .zip ファイル関数を更新する

.zip デプロイパッケージを使用する一部の関数では、Lambda コンソールの組み込みコードエディタを使用して、関数コードを直接更新できます。この機能を使用するには、関数が次の基準を満たしている必要があります。

  • 関数が、インタープリター言語ランタイムのいずれか (Python、Node.js、Ruby) を使用する必要があります。

  • 関数のデプロイパッケージが 3 MB 未満である必要があります。

コンテナイメージデプロイパッケージを含む関数の関数コードは、コンソールで直接編集することはできません。

コンソールのコードエディタを使用して関数コードを更新するには
  1. Lambda コンソールの「関数ページ」を開き、関数を選択します。

  2. [コード] タブを選択します。

  3. [コードソース] ペインでソースコードファイルを選択し、統合コードエディタで編集します。

  4. コードの編集が終了したら、[デプロイ] を選択して変更を保存し、関数を更新します。

AWS CLI を使用して .zip ファイルで関数を作成、更新する

AWS CLI を使用して新しい関数を作成したり、.zip ファイルを使用して既存の関数を更新したりできます。create-function コマンドと update-function-code を使用して、.zip パッケージをデプロイします。.zip ファイルが 50 MB 未満の場合は、ローカルビルドマシン上のファイルの場所から .zip パッケージをアップロードできます。サイズの大きいファイルの場合は、Amazon S3 バケットから .zip パッケージをアップロードする必要があります。AWS CLI を使用して Amazon S3 バケットにファイルをアップロードする方法については、「AWS CLI ユーザーガイド」の「オブジェクトの移動」を参照してください。

注記

AWS CLI を使用して Amazon S3 バケットから .zip ファイルをアップロードする場合、このバケットは関数と同じ AWS リージョン に配置する必要があります。

AWS CLI を含む .zip ファイルを使用して新しい関数を作成するには、以下を指定する必要があります。

  • 関数の名前 (--function-name)

  • 関数のランタイム (--runtime)

  • 関数の実行ロール (--role) の Amazon リソースネーム (ARN)

  • 関数コード内のハンドラーメソッド (--handler) の名前

.zip ファイルの場所も指定する必要があります。.zip ファイルがローカルビルドマシン上のフォルダにある場合は、次のコマンド例に示すように、--zip-file オプションを使用してファイルパスを指定します。

aws lambda create-function --function-name myFunction \ --runtime ruby3.2 --handler lambda_function.lambda_handler \ --role arn:aws:iam::111122223333:role/service-role/my-lambda-role \ --zip-file fileb://myFunction.zip

Amazon S3 バケット内の .zip ファイルの場所を指定するには、以下のコマンド例にある --code オプションを使用します。S3ObjectVersion パラメータは、バージョン管理下のオブジェクトにのみ使用する必要があります。

aws lambda create-function --function-name myFunction \ --runtime ruby3.2 --handler lambda_function.lambda_handler \ --role arn:aws:iam::111122223333:role/service-role/my-lambda-role \ --code S3Bucket=myBucketName,S3Key=myFileName.zip,S3ObjectVersion=myObjectVersion

CLI を使用して既存の関数を更新するには、--function-name パラメータを使用して関数の名前を指定します。関数コードの更新に使用する .zip ファイルの場所も指定する必要があります。.zip ファイルがローカルビルドマシン上のフォルダにある場合は、次のコマンド例に示すように、--zip-file オプションを使用してファイルパスを指定します。

aws lambda update-function-code --function-name myFunction \ --zip-file fileb://myFunction.zip

Amazon S3 バケット内の .zip ファイルの場所を指定するには、以下のコマンド例にある --s3-bucket および --s3-key オプションを使用します。--s3-object-version パラメータは、バージョン管理下のオブジェクトにのみ使用する必要があります。

aws lambda update-function-code --function-name myFunction \ --s3-bucket myBucketName --s3-key myFileName.zip --s3-object-version myObject Version

Lambda API を使用して .zip ファイルで関数を作成、更新する

.zip ファイルアーカイブを使用して関数を作成および更新するには、以下の API オペレーションを使用します。

AWS SAM を使用して .zip ファイルで関数を作成、更新する

AWS Serverless Application Model (AWS SAM) は、AWS のサーバーレスアプリケーションの構築と実行のプロセスを合理化するのに役立つツールキットです。YAML または JSON テンプレートでアプリケーションのリソースを定義し、AWS SAM コマンドラインインターフェイス (AWS SAM CLI) を使用して、アプリケーションを構築、パッケージ化、デプロイします。AWS SAM テンプレートから Lambda 関数を構築すると、AWS SAM は関数コードと指定した任意の依存関係を含む .zip デプロイパッケージまたはコンテナイメージを自動的に作成します。AWS SAM を使用して Lambda 関数を構築およびデプロイする方法の詳細については、「AWS Serverless Application Model 開発者ガイドの」の「AWS SAM の開始方法」を参照してください。

AWS SAM を使用して、既存の .zip ファイルアーカイブを使用する Lambda 関数を作成できます。AWS SAM を使用して Lambda 関数を作成するには、.zip  ファイルを Amazon S3 バケットまたはビルドマシンのローカルフォルダに保存します。AWS CLI を使用して Amazon S3 バケットにファイルをアップロードする方法については、「AWS CLI ユーザーガイド」の「オブジェクトの移動」を参照してください。

AWS SAM テンプレートでは、Lambda 関数は AWS::Serverless::Function のリソースにより指定されます。このリソースで次のプロパティを設定し、.zip ファイルアーカイブを使用して関数を作成します。

  • PackageTypeZip に設定

  • CodeUri - 関数コードの Amazon S3 URI、ローカルフォルダへのパス、または FunctionCode オブジェクトに設定

  • Runtime - 選択したランタイムに設定

AWS SAM では、.zip ファイルが 50 MB を超える場合、この .zip ファイルを最初に Amazon S3 バケットにアップロードする必要はありません。AWS SAM では、ローカルビルドマシン上の場所から、最大許容サイズ 250 MB (解凍) の .zip パッケージをアップロードできます。

AWS SAM で .zip ファイルを使用して関数をデプロイする方法の詳細については、「AWS SAM 開発者ガイド」の「AWS::Serverless::Function」を参照してください。

AWS CloudFormation を使用して .zip ファイルで関数を作成、更新する

AWS CloudFormation を使用して、.zip ファイルアーカイブを使用する Lambda 関数を作成できます。.zip ファイルから Lambda 関数を作成するには、最初にファイルを Amazon S3 バケットにアップロードする必要があります。AWS CLI を使用して Amazon S3 バケットにファイルをアップロードする方法については、「AWS CLI ユーザーガイド」の「オブジェクトの移動」を参照してください。

AWS CloudFormation テンプレートでは、Lambda 関数は AWS::Lambda::Function のリソースにより指定されます。このリソースで次のプロパティを設定し、.zip ファイルアーカイブを使用して関数を作成します。

  • PackageTypeZip に設定

  • CodeS3Bucket および S3Key フィールドに Amazon S3 バケット名と .zip ファイル名を入力

  • Runtime - 選択したランタイムに設定

AWS CloudFormation が生成する .zip ファイルは、4 MB を超えることはできません。AWS CloudFormation で .zip ファイルを使用して関数をデプロイする方法の詳細については、「AWS CloudFormation ユーザーガイド」の「AWS::Lambda::Function」を参照してください。