エンジニアレポート

AWS Lambdaのレイヤーを使ってみた

2020年08月11日 PythonAWSLambda

データスタジアムのエンジニア二宮です。 当社でも大小様々なサーバーレスシステムの構築、とりわけAWS Lambdaの利用は増えてきています。

今回は、Lambdaのレイヤーを使ってみたのでそのご紹介です。

Lambda関数が増えてくると、いつも同じライブラリと一緒にzipで固めてアップロードということを繰り返してソースが肥大化しがちです。

しかしレイヤーを使えば共通部分を切り出して各関数をサイズダウンすることができます。

では具体的に見ていきましょう。

RDSに接続するLambda関数をPythonで作成するとします。

(*1)一般的にLambdaからRDSへアクセスするのはコネクション数上限の点でバッドプラクティス(*2)とされていますが、今回は高頻度で呼ばれる処理ではないので問題ないと考えています。
(*2) 6/30にGAリリースされたRDS Proxyでこの問題は解決されそうです。これはまた別の機会に…。

まずライブラリPyMySqlをローカルでpip install。

それからデータベースへのアクセス情報はSecrets Managerで管理することにして、呼び出し用のメソッド(シークレット作成時に表示されるサンプルを元にsecret_nameを引数に渡すようにしただけ)は別ファイルにします。

※この場合、VPCとセキュリティグループを設定したり、Secrets ManagerへアクセスできるIAMポリシーが割り当てられたロールを設定したりする必要があります。

そうすると大体こんな構成になります。

メインのlambda_function.pyのimportはこうですね。

ここから、DBアクセスに関わる共通部分をレイヤーとして切り出します。
レイヤーはzipアップロードする必要があるためzipで固めます。今回の例だと以下のような構成になります。

ポイントとしては各言語ごとに指定のフォルダに格納するようにしてください。

では、レイヤーを作成します。
コンソールの左ペイン「Addtional Resources → レイヤー」から「レイヤーの作成」に進みます。

下の「レイヤーの作成」画面から、先ほどつくったzipファイルをアップします。

また、ここで「互換性のあるランタイム」を複数選択できるので、呼び出し元の関数と合わせておきます。

レイヤーが作成されると、バージョンも発行されます。

次に、レイヤーとして共通部分を切り出した関数側(lambda_function.py)です。

デザイナーの「Layers」から「レイヤーの追加」に進んで、上で作成したレイヤーとバージョンを選択します。

これだけで完了です!
関数本体は1ファイルだけとなりました。

呼び出し元関数のimportも変更ありません。

ソース管理としてもよりビジネスロジックに集中でき、開発・保守がやりやすくなりますね。

1つの関数が呼び出せるレイヤーの数や、デプロイパッケージの合計サイズといった制限はあるので、気をつけながら上手に使っていきたいところです。

エンジニア募集中

データスタジアムでは一緒に働いていただけるエンジニアを絶賛募集中です!

野球、サッカー、バスケをはじめとして色々なスポーツの仕事があります。

AWSやAzure、動画やAIなど技術的にもチャレンジできる職場です。

テクノロジーの力で、日本のスポーツを一緒に発展させていきましょう!

<募集中のポジション(2020年8月1日現在)>

開発エンジニア(速報サービス)

開発エンジニア(スポーツチーム向けサービス)

インフラエンジニア

最新記事

エンジニアトップ エンジニアインタビュー エンジニアレポート

  • 採用情報
  • おしらせ
  • 掲載事例

ページトップヘ