AWS Lambda Layers でライブラリを共通化する

記事タイトルとURLをコピーする

はじめに

こんにちは、技術一課の山中です。

re:Invent 2018 にて AWS Lambda Layers が発表されました!


新機能 – AWS Lambda :あらゆるプログラム言語への対応と一般的なコンポーネントの共有 | Amazon Web Services ブログ


例えば ロギングモジュール等、今まで複数の Lambda ファンクションから呼び出すライブラリがあっても各ファンクションごとにパッケージングする必要がありました。 今回発表された AWS Lambda Layers を利用することで共通モジュール / 共通処理を Layer 化して複数の Lambda ファンクションから利用することができるようです。

というわけで、早速試していきます。

共通プログラム作成

今回は試しに、ロギング部分と Amazon SNS によるメッセージング部分を Layer として共通化してみたいとおもいます。 実際に書いた Python ファイルはそれぞれ以下のとおりです。

log.py

import logging


# ログオブジェクト作成
def get_logger(workername, loglevel):
    # ログの出力名を設定
    logger = logging.getLogger(workername)
    # ログレベルの設定
    logger.setLevel(int(loglevel))

    log_handler = logging.StreamHandler()
    logger.addHandler(log_handler)

    # ログの出力形式の設定
    log_handler.setFormatter(
        logging.Formatter('%(asctime)s, %(process)d, %(levelname)s, %(message)s')
    )

    return logger

sns.py

import boto3


# sns 接続
def get_sns_client():
    return boto3.client('sns')


# SNS メッセージ送信処理
def publish_message(topic_arn, subject, message):
    client = get_sns_client()
    client.publish(
        TopicArn=topic_arn, 
        Subject=subject,
        Message=message,
    )

log.py がロギング用、 sns.py が SNS によるメッセージング用となります。 作成した Python ファイル及びライブリ群を以下のように zip ファイルにまとめます。

layer.zip
│ python/log.py
│ python/sns.py
└ python/lib/python3.7/site-packages/[libraries]

この作成した zip ファイルを Lambda Layer として登録していきます。

Lambda Layer の作成

Lambdaのコンソールから [Layers] を選択し、 [Create layer] ボタンをクリックします。

Layer 作戦画面にて先程作成した layer.zip ファイルをアップロードし、適当な名前を付け作成します。

これで Layer が完成です。簡単ですね!

Lambda ファンクションの作成

Layer を利用して Lambda ファンクションを作成していきます。

今回はランタイムを Python 3.7 、 IAM Role として SNS へのフルアクセスポリシーを持つロールを選択しました。

作成が完了したら、 [Layers] を選択後 [Add a layer] ボタンをクリックします。

先程作成した Layer を選択し、 [Add] ボタンをクリックします。これだけで、 Layer の追加は完了です。

次にメインの Lambda ファンクションのコードを書いていきます。

今回は以下のような簡単なコードを書いてみました。

from log import get_logger
from sns import publish_message

# ログの出力名を設定
logger = get_logger('sample-function', 20)


def lambda_handler(event, context):
    logger.info('input event : {}'.format(event))

    logger.info('Start send message')
    publish_message(
        'arn:aws:sns:ap-northeast-1:000000000000:dev',
        'Test Subject',
        'Test Message',
    )
    logger.info('Finish send message')

コードの 1 行目及び 2 行目で Layer から利用する機能をインポートしています。

後は [Save] ボタンをクリックして作成完了です!

試してみる

では早速テストしていきましょう。 適当にテストイベントを作成します。

[Test] ボタンをクリックします。

インポートエラーも起こさず、きちんとログが出力されています!

メールはどうでしょうか。

きちんと届いています!

おわりに

コードの共通化が AWS Lambda Layers を利用すると簡単に実装できました。 ロギング等ほとんどのファンクションで利用するコードを共通化することで、メインのコードに集中及び簡素化することができます。

Layer 化する単位や関数等はプロジェクトによって、考慮する必要はありますがどんどん使っていきたいですね!