巨人の肩の上に立つ OSSリーディングで読み解く「AWS Powertools」の正体

川端2022.07.05

ニュートンの有名な言葉で「巨人の肩の上に立つ」(If I have seen further it is by standing on the shoulders of giants.)があります。

偉大なニュートンでも、謙虚な面もあるんだなーと想像を膨らませつつ、まさにエンジニアリングも同じような世界で、勉強会やオープンソースソフトウェア(OSS)など先達が残してくれたものから多くを学び・発見を得ることができます。

今回は、そんな言葉を思い出させたエピソードをご紹介します。

「勉強会」は新たな出会い

勉強会は参加するのももちろんですが、そのスライドや動画を見るだけでも新たな出会いがあります。

私は今、AWSのサーバーレスサービスのAmazon OpenSearch ServiceAWS Lambdaを組み合わせたプロジェクトを担当しているのですが、そこで参考になるネタがないか外部で開催された勉強会のスライドを眺めていました。

すると、ある勉強会でOpenSearchを利用したソリューションがOSSで公開されていることに目が留まりました。

SIEM on Amazon OpenSearch Service

https://github.com/aws-samples/siem-on-amazon-opensearch-service

SIEMとはセキュリティインシデントを調査するためのプロダクトで、OpenSearchやLambdaを利用しログの相関分析や可視化ができます。

「OSS」は宝の山

エンジニアにとって OSS は宝の山です。

そのプロダクトを利用することはもちろん、気軽にコードをのぞくことができるので、その道の達人が残してくれたテクニックや新たな発想を発見できます。

ちまたでは、これを「OSSコードリーディング」と呼んでいます。

今回も OSSコードリーディングをしていると、複数Lambdaを組み合わせた時のビルド&デプロイ方法が参考になったり、Lambdaの中で見知らぬライブラリが利用されているのを発見しました。

見知らぬライブラリ「AWS Powertools」とは

https://github.com/awslabs/aws-lambda-powertools-python

調べてみると、AWS Lambda上で利用できる、Pythonのためのユーティリティライブラリで、Java、Typescript版も用意されているようです。

Lambda関数のパッケージとしてLambda Layerが用意されているのですぐに試すこともできます。

https://awslabs.github.io/aws-lambda-powertools-python/latest/#install

arn:aws:lambda:{region}:017000801446:layer:AWSLambdaPowertoolsPython:21

その中からいくつか気になったものをご紹介します。

Logging

https://awslabs.github.io/aws-lambda-powertools-python/latest/core/logger/

ログ出力を便利にするユーティリティです。

Lambdaはサーバーレスという特性上、実行状況などをログとして残すことが重要になってきます。というのもログを残すことで、その後の解析やトラブルシューティングをスムーズに進めることができるからです。

例えば、特にカスタマイズしていない、組み込みのLoggingライブラリでログを出力すると以下のような形式で出力されます。

組み込みのLoggingパッケージ

from logging import getLogger
logger = getLogger(__name__)
logger.info("message")

出力例

[INFO] 2021-05-03T11:47:12.294Z 52fdfc07-2182-154f-163f-5f0f9a621d72 message

一方で、Lambda Powertools Pythonを利用するとログをJSON形式に構成し直して出力してくれます。

Lambda Powertools Python

from aws_lambda_powertools import Logger
logger = Logger(service="payment")
logger.info("message")

出力例

{
    "level": "INFO",
    "location": "lambda_handler:42",
    "message": "message",
    "timestamp": "2021-05-03 11:47:12,294+0000",
    "service": "payment"
}

ログはCloudWatchに送信した後、別のサービスに連携することも考えらます。

そんな場合には、JSON形式のほうが取り扱いが便利ですね。

また、Lambdaの中に入ってくるeventを自動でキャプチャしてくれるアノーテションや、パーセンテージでログの出力頻度を変更しサンプリングできる関数があるなど、標準のLoggingライブラリがより使いやすくなる印象です。

Tracing

https://awslabs.github.io/aws-lambda-powertools-python/latest/core/tracer/

TracingはAWS SDK Xrayの薄いラッパーとなっています。

AWS Xrayはサーバーレス間の実行状況やレイテンシを追跡することができます。

Lambdaを追跡するためにはSDK Xrayを組み込む必要があるのですが、そのSDKを使いやすくする機能が含まれているようです。

例えば、サポートされているライブラリに自動でパッチが適用され、追跡が可能となる機能が提供されています。

AWS SDK Xray

import boto3
import requests
from aws_xray_sdk.core import xray_recorder
from aws_xray_sdk.core import patch_all
patch_all()

@xray_recorder.capture('example')
def lambda_handler(event, context):
    r = requests.get('https://www.python.org/')
    print(r.status_code)
    ...

Lambda Powertootls

import requests
from aws_lambda_powertools import Tracer
tracer = Tracer()

@tracer.capture_lambda_handler
def lambda_handler(event, context):
    r = requests.get('https://www.python.org/')
    print(r.status_code)
    ...

また、コールドスタートか判別できる値をアノーテーションとして自動的に付与する機能やAWS環境外でLambdaを実行した時に、自動的に無効となる機能が便利そうでした。

まとめ

このように、わたしたちは日々、勉強会やOSSからいろいろなことを学び・発見し、自身のプロダクトをブラッシュアップしています。

一方で、先達が残してくれたものから発見・勉強できる世界であることに感謝しつつ、だた消費するだけでなく貢献ができないか意識を新たにする機会になりました。

この記事を書いた人

川端

アプリケーションエンジニア、お寿司が大好き

#OSS#AWS

この記事をシェアする

この記事の目次