ブログ

はじめての AWS Lambda

AWS Lambda は、サーバーレスのプログラム実行環境サービスです。マネージドサービスの実行環境はクラウドサービスの大きなメリットの一つです。しかし、クラウドネイティブなサービスのため興味があってもなかなか手が出ないという方もいらっしゃるのではないでしょうか。今回は AWS Lambda を初めて使ってみようという方を対象に検討すべきポイントをいくつかご紹介したいと思います。

AWS Lambda のメリット

冒頭で述べたように、AWS Lambda はサーバーレスのプログラム実行環境サービスです。

まずは AWS Lambda のメリットについて見ていきましょう。

  • サーバーやOSの管理コストを削減できる
    • AWS Lambda はマネージドサービス/サーバーレスのプログラム実行環境サービスのため、利用者は EC2 等のサーバーやOS上のミドルウェアの管理が不要です。
  • リクエストに応じてオートスケーリングする
    • リクエストの増加に応じて AWS Lambda インスタンスは自動的にスケーリングされます。しかし同時実行数には制限があるため注意が必要です。
      (詳細は後述します)
  • 他のAWSサービスと柔軟に組み合わせことができる
    • 他の AWS サービスと柔軟に組み合わせて AWS Lambda をキックすることが可能です。主な例としては CloudWatch Alerm で閾値に達した時のアクションとしてプログラムを実行したり Amazon EventBridge で周期などをスケジューリングして実行することが可能です。

このように AWS Lambda ではクラウドならではの様々なメリットがあります。
次の章からは実際に導入する際に気をつけたいポイントについて簡単に解説していきます。

AWS Lambda のポイント① 同時実行数に気をつけよう

AWS Lambda はリクエストに応じてオートスケーリングすることが可能ですが同時実行数には制限が設けられています。デフォルトでは同一リージョン内につき、1000 に制限 されています。

同時実行数の制限はスロットリングと呼ばれています。AWS公式ブログ にスロットリングのトラブルシューティングが記述されていますのでご紹介致します。公式ブログ内では主に次の対策を推奨しています。

  • スロットリングした APIの再試行 を行う
  • Provisioned concurrency で事前に AWS Lambda インスタンスをスケーリングする
  • Lambda インスタンスのメモリを増強して実行速度を向上する
  • サービスクォータの緩和をリクエストする

AWS Lambda のポイント② 実行時間に気をつけよう

 AWS Lambda は実行時間が制限されています。最長15分までの制限となっておりサービスクォータの緩和申請の対象外となっています。

そこで、1つの AWS Lambda あたりの実行時間を短縮するために次の内容を検討しましょう。

  • Lambda インスタンスのメモリを増強して実行速度を向上する
    • こちらは前述の同時実行数対策と同じになります。メモリを変更すると実行時間毎にかかる料金も変動しますので予算と照らし合わせてご検討下さい。
  • 同期処理がネックの場合、非同期処理化を検討する
    • AWS Lambda で実行している処理に同期処理が含まれている場合は応答時間が発生してネックになりがちです。可能な限り非同期処理を取り入れて AWS Lambda の処理中に待ち時間が発生しないようにすることで実行時間の削減に繋がります。
  • 処理を疎結合にする
    • 前述のような取り組みを行っても一つの AWS Lambda では応答時間の制限で完結しきれないケースもあるかと思います。そのような場合は処理を複数の Lambda で実行することを検討しましょう。AWS Step Functions で Lambda を組み合わせることが可能です。
      AWS Step Functions では単純に結合させるだけでなく、条件分岐や繰り返し処理、待機時間を設けることも可能です。失敗時の通知やリトライなどを簡単に組み合わせられるのもメリットです。

AWS Lambda のポイント③ シークレット情報の取り扱いに気をつけよう

AWS Lambda は外部サービスと組み合わせて使うケースもあります。例としては RDS などのデータベースと連携してデータをインサート/取得したり、外部APIにアクセスして連携を行うケースです。

ユーザー名やパスワードの取り扱いに注意が必要となりますが、AWS Secrets Manager でコード内にシークレット情報を含めずに取得、利用することが可能です。

ここでは Python で AWS Secrets Manager の値を取得する例を紹介したいと思います。AWS Secrets Manager では目的に応じたタイプのシークレットを作成できます。

Amazon RDS データベースの認証情報では特定の RDS に対してのユーザー/パスワードのセットを作成することが可能でパスワードのローテションも可能です。

外部APIへのアクセス等の汎用的なシークレットを作成したい場合は、その他のシークレットのタイプを選択しましょう。

作成したいシークレットを保存するときにサンプルコードを取得することができます。

実際に Lambda からシークレット情報を取得してみましょう。
ランタイム Python 3.9 を作成します。

ソースコードに先ほどのサンプルを例にしたコードを記載します

import boto3
import base64
from botocore.exceptions import ClientError


def lambda_handler(event, context):

    secret_name = "hoge_secret"
    region_name = "ap-northeast-1"

    # Create a Secrets Manager client
    session = boto3.session.Session()
    client = session.client(
        service_name='secretsmanager',
        region_name=region_name
    )

    try:
        get_secret_value_response = client.get_secret_value(
            SecretId=secret_name
        )
        secret_data = get_secret_value_response['SecretString']
        return secret_data
        
    except ClientError as e:
        if e.response['Error']['Code'] == 'DecryptionFailureException':
            raise e
        elif e.response['Error']['Code'] == 'InternalServiceErrorException':
            raise e
        elif e.response['Error']['Code'] == 'InvalidParameterException':
            raise e
        elif e.response['Error']['Code'] == 'InvalidRequestException':
            raise e
        elif e.response['Error']['Code'] == 'ResourceNotFoundException':
            raise e
    else:
        if 'SecretString' in get_secret_value_response:
            secret = get_secret_value_response['SecretString']
        else:
            decoded_binary_secret = base64.b64decode(get_secret_value_response['SecretBinary'])

テスト実行すると、AWS Secrets Manager に記載した値を取得できていることが確認できます。

はじめての AWS Lambda(まとめ)

AWS Lambda は有名で強力なサーバーレスサービスですがハードルが高いサービスのひとつかと思い、検討すべきポイントをいくつかご紹介しました。

クラウドネイティブな開発やサーバーレスに興味がある方はお気軽にご相談下さい。
老舗 AWS パートナーの弊社が豊富な実績をもとにサポートさせていただきます。

元記事発行日: 2022年09月27日、最終更新日: 2022年09月27日