盆暗の学習記録

データサイエンス ,エンジニアリング,ビジネスについて日々学んだことの備忘録としていく予定です。初心者であり独学なので内容には誤りが含まれる可能性が大いにあります。

serverless.ymlでLambdaによるバッチやAPIを作るときによく使う設定メモ

(※Serverless Framework V.3を想定しています)

Docker Imageでデプロイする

LambdaへのImageデプロイ

LambdaはDocker Imageを使ってデプロイすることができます(Lambda のコンテナイメージを使用する - AWS Lambda)。

pip installでいれるサードパーティーのパッケージが必要なときやストレージ上のファイルを同梱してデプロイしたいとき、Imageでデプロイするのが便利です。

PythonのDocker Imageの例は

コンテナイメージで Python Lambda 関数をデプロイする - AWS Lambda

に書いてあります。例えば

FROM public.ecr.aws/lambda/python:3.11
COPY requirements.txt ${LAMBDA_TASK_ROOT}
RUN pip install -r requirements.txt
COPY handler.py ${LAMBDA_TASK_ROOT}
CMD [ "handler.hello" ]

のようにpublic.ecr.aws/lambda/pythonを参照するのが手軽です。この場合ベースOSはAmazon Linux系になるので、それが嫌な場合は任意のベースイメージのもとで作る方法もあります(参考

ServerlesでのImageデプロイ

以下のようにprovider.ecr.imagesにdocker context(path)を書く方法にするとserverless deployのたびに自動でbuildされデプロイされて楽です。

service: example
frameworkVersion: '3'
provider:
  name: aws
  runtime: python3.11
  ecr:
    images:
      appimage:
        path: .

functions:
  hello:
    image:
      name: appimage

詳細な設定については ドキュメント をご覧ください

API Key認証

API Gatewayで作成できるRESTfulなAPIREST APIとHTTP APIの2種類があります。HTTPはより高速で安く、そのぶん低機能です(REST API と HTTP API 間で選択する - Amazon API Gateway)。

REST APIではapi-keyによる認証を付けることができます。簡易的な認証方法として便利です。

serverless.ymlでいうとfunctions.eventsにおいてhttpをつけるとREST APIになり、httpApiをつけるとHTTP APIになります。

API Keyによる認証はserverless.ymlを以下のように書き換えることで設定できます

provider:
  name: aws
  apiGateway:
    apiKeys: # API KEYを生成するよう設定
      - myKey

functions:
  myapi:
    handler: handler.myapi
    events:
      - http: # REST API
          path: /myapi
          method: get
          private: true  # API KEYを使用するよう設定

(参考:Serverless Framework - AWS Lambda Events - REST API (API Gateway v1)

エンドポイントのタイプを変える

ちなみに、REST API

  1. エッジ最適化(edge-optimized) API
  2. リージョン別(regional)API
  3. プライベート(private)API

の3種類あり、デフォルトでエッジ最適化になるのですが、エッジ最適化は1つのAWSアカウントにつき120個までしか作成できず、この上限を引き上げることは現在のところできません。

リージョン別APIも上限を引き上げることはできませんが600個が上限になるので気軽にAPIを量産することができます。

provider:
  name: aws
  endpointType: REGIONAL

エンドポイントタイプはendpointTypeの項目を設定することで変えることができます。