Skip to content

Deploys an AWS Lambda Layer with RubyGems you specified. RubyGems are built using an official AWS Lambda Ruby runtime Docker container.

License

Notifications You must be signed in to change notification settings

shu-i-chi/ruby-aws-lambda-layer-deployer-for-rubygems

Repository files navigation

Ruby AWS Lambda Layer Deployer for RubyGems

English: README.en.md

RubyGemsを指定して、AWS Lambda Layerをデプロイ(新規作成・更新)します。 RubyGemsのビルドは、AWS Lambda Rubyランタイムの公式Dockerコンテナ内で行います。

目次

前提条件

対象RubyGems

Gemfileに指定してbundle installできるRubyGems。

環境

  • Bash

ツール

使い方

例として、ruby-mysqlをAWS Lambda Layerとしてデプロイします。

  1. Gemfileに、AWS Lambda LayerとしたいRubyGemsを指定します

    # frozen_string_literal: true
    
    source "https://rubygems.org"
    
    gem "ruby-mysql", "~> 4.1.0"
    
  2. config.shに、デプロイするAWS Lambda Layerの設定をします:

    • lambda_layer_name:AWS Lambda Layer名
    • lambda_layer_description:AWS Lambda Layerの説明文
    • compatible_runtimes:AWS Lambda Rubyランタイムの互換性のあるバージョン
      • "ruby3.2"のように指定します
      • 複数指定する場合は、半角スペース で区切ってください(例:"ruby2.7" "ruby3.2"
    • compatible_architectures:互換性のあるアーキテクチャ
      • "x86_64""arm64"のいずれか、あるいは両方を指定できます
      • 両方を指定する場合は、半角スペース で区切ってください("x86_64" "arm64"
    # AWS Lambda Layer Settings
    #   * Modify Gemfile too to install desired RubyGems.
    
    lambda_layer_name="rubygems-mysql"
    lambda_layer_description="RubyGem 'ruby-mysql' 4.1.0: https://rubygems.org/gems/ruby-mysql/versions/4.1.0"
    
    compatible_runtimes=("ruby3.2") # Use a space ' ' as a delimiter; "ruby2.7" "ruby3.2"
    compatible_architectures=("x86_64" "arm64") # Use a space ' ' as a delimiter; "x86_64" "arm64"
  3. (必要な場合)Dockerfileに、RubyGemsをビルドするのに必要となるライブラリを追加します。

    AWS LambdaのRubyランタイムのDockerコンテナ内でビルドを行うので、 あらかじめコンテナ作成時にyum install -y <ライブラリ>を加える必要があります。

    DockerfileのRUN命令を使って、RUN yum install -y <ライブラリ>を追記してください:

    # Install additionally required libraries for building RubyGems
    RUN yum groupinstall -y "Development Tools"
    
    RUN yum install -y <ライブラリ1> # 追記
    RUN yum install -y <ライブラリ2> # 追記
  4. スクリプト「deploy-ruby-aws-lambda-layer-for-rubygems.sh」を実行します:

    • 途中で、AWS Lambda Layerの設定内容確認のプロンプトを表示する場合(デフォルトの動作):

      ./deploy-ruby-aws-lambda-layer-for-rubygems.sh
    • もしプロンプトをスキップしたい場合:

      オプション-y--yes、あるいは--skip-promptを指定して実行する。

      ./deploy-ruby-aws-lambda-layer-for-rubygems.sh -y

仕組み

スクリプト「deploy-ruby-aws-lambda-layer-for-rubygems.sh」は、種々のケアのため長大ですが、主要な動作ロジックは単純です。

やること

AWS Lambda Layerは、AWS Lambdaランタイムの/opt/配下に配置されます。 また、AWS LambdaのRubyランタイムでは、RubyGemsをrequireするための参照パスのひとつGEM_PATHに、パス/opt/ruby/gems/3.2.0(Ruby 3.2ランタイムの場合)が設定されています。

そこで、AWS Lambda Layerとしてデプロイするzipパッケージの構造を、ruby/gems/3.2.0/配下にRubyGemsをインストールしたディレクトリ構成にします:

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

https://docs.aws.amazon.com/lambda/latest/dg/packaging-layers.html より引用;一部加工)

こうすれば、追加のパスの設定等をせずに、AWS Lambda Ruby関数内からrequireして呼び出すことができるようになります。

参考:https://docs.aws.amazon.com/lambda/latest/dg/packaging-layers.html

スクリプト「deploy-ruby-aws-lambda-layer-for-rubygems.sh」の主要な動作ロジック

  1. AWS LambdaのRubyランタイムのコンテナを起動する(関係するファイル:Dockerfile、docker-compose.yaml)

    • ENTRYPOINTは上書きする(そのままだと、コンテナ起動時にLambda関数を実行しようとするため)
    • RubyGemsのビルドに必要なライブラリは、あらかじめyum installしておく
    • ビルドしたRubyGemsを格納するために、Dockerホスト(以下ローカル)のカレントディレクトリをマウントする
  2. AWS LambdaのRubyランタイムのコンテナ内にはBundlerがインストールされているので、このBundlerを使って、RubyGemsをビルドする(関係するファイル:Gemfile)

    • bundle installする前に、あらかじめコンテナ内でbundle config set --local path ./tmpを行い、 手順1でマウントしたローカルのカレントディレクトリ直下の./tmp/ディレクトリ内に、RubyGemsをビルドするように設定する
  3. コンテナを停止する

    • ローカルのカレントディレクトリの./tmp/内に、RubyGemsがビルドされている状態になる
  4. ビルドしたRubyGemsのディレクトリ構造を、AWS Lambda Layer用に変更する

    • 変更前:./tmp/ruby/3.2.0/...(Ruby 3.2ランタイムでビルドした場合)
    • 変更後:./built_rubygems/ruby/gems/3.2.0/...(作業の簡便さのために、./tmp/から./built_rubygems/に移動した)
  5. 手順4の./built_rubygems/ruby/gems/3.2.0/...のディレクトリruby/以下を、zipパッケージにする

  6. 手順5のzipパッケージを指定して、AWS Lambda Layerをデプロイする

    • aws-cliを使う場合、aws lambda publish-layer-versionを使う

      • オプション--zip-fileで、手順4のzipパッケージを指定する
      aws lambda publish-layer-version --layer-name <AWS Lambda Layer名> \
          --description <AWS Lambda Layer説明文> \
          --zip-file fileb://<zipパッケージパス> \
          --compatible-runtimes <互換性のあるAWS LambdaのRubyランタイムのバージョン> \
          --compatible-architectures <互換性のあるアーキテクチャ>

About

Deploys an AWS Lambda Layer with RubyGems you specified. RubyGems are built using an official AWS Lambda Ruby runtime Docker container.

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published