Serverless Framework Functions プロパティ(2)

前回の記事

前回に引き続き serverless.yml の Functions プロパティについてまとめていきたいと思います。

基本的には以下のドキュメントを読んでまとめ、思うところを徒然に書いていきます。内容の保証はしません、というか間違ってる可能性も多いにあるので鵜呑みにせず一次情報に当たってください。

www.serverless.com

アーキテクチャ

Lambda の CPU アーキテクチャを指定します。

provider.architecture, functions.<function name>.architecture に記載します。

arm64 の場合

serverless.yml
functions:
  hello:
    architecture: arm64

インテルの場合はドキュメントに記載がないですが、x86_64 を書けばよいと思います。

ランタイム管理

セキュリティパッチ等のランタイム更新タイミングをモードとして指定します。

provider.runtimeManagement, functions.<function name>.runtimeManagement に記載します。

モードは auto, onFunctionUpdate, manual(デフォルト値) が指定可能です。

各モードの詳細はこちら。

docs.aws.amazon.com

provider に設定する場合、auto, onFunctionUpdate が利用可能です。

serverless.yml
provider:
  runtimeManagement: onFunctionUpdate

functions に設定する場合は3つのモードすべて記述することができます。この場合、mode の他に arn を指定する必要があります。

serverless.yml
functions:
  hello:
    runtimeManagement:
      mode: manual
      arn: <aws runtime arn>

"aws runtime arn" って何でしょうか? CloudFormation での記載方法と同じように ランタイム識別子である python3.9 とか nodejs16.x とかを記載すればよいのでしょうか。

識別子の一覧は以下参照。

docs.aws.amazon.com

SnapStart

コールドスタート問題を解消するためにキャッシュされた関数のスナップショットから起動する機能です。2023/2 現在では Java11 ランタイムのみでサポートされます。他にもいろいろと制限があるのでご注意。

docs.aws.amazon.com

functions.<function name>.snapStart に記載します。

serverless.yml
functions:
  hello:
    runtime: java11
    snapStart: true

VPC 設定

VPC Lambda 用設定です。

provider.vpc, functions.<function name>.vpc に記載します。

serverless.yml
functions:
  hello:
    vpc:
      securityGroupIds:
        - securityGroupId1
        - securityGroupId2
      subnetIds:
        - subnetId1
        - subnetId2

provider に設定しているが、一部の関数には適用したくない(パブリック Lambdaとしたい)場合には ~ で継承しないように設定できます。

serverless.yml
provider:
  name: aws
  vpc:
    securityGroupIds:
      - securityGroupId1
      - securityGroupId2
    subnetIds:
      - subnetId1
      - subnetId2

functions:
  hello: # パブリックな Lambda となる
    handler: handler.hello
    vpc: ~
  users: # provider 継承により VPC Lambda となる
    handler: handler.users

実行ロールについて 上記の設定を行った場合、デフォルトでは "AWSLambdaVPCAccessExecutionRole" がアタッチされます。

カスタムロールを利用する場合は、ENI の create, describe, delete 権限が必要なことに注意してください。

docs.aws.amazon.com

インターネットアクセスについて

デフォルトでは VPC Lambda はインターネットアクセスができないため、VPC エンドポイントや NAT GW の設定が必要なことに注意してください。

環境変数

provider.environment, function.<function name>.environment に記載します。両方に同じ環境変数が存在する場合は functions の値で上書きされます。

serverless.yml
provider:
  name: aws
  environment:
    SYSTEM_NAME: mySystem
    TABLE_NAME: tableName1
 
functions:
  hello: # 2つの環境変数を継承する
    handler: handler.hello
  users:
    handler: handler.users
    environment: # SYSTEM_NAME を継承し、TABLE_NAME は上書きする
      TABLE_NAME: tableName2

外の値を参照したい場合の書き方については以下参照。

www.serverless.com

タグ

provider.tags, functions.<function name>.tags に記載します。両方に同じタグが記載されている場合は functions の値で上書きされます。

serverless.yml
provider:
  tags:
    foo: bar
    baz: qux

functions:
  hello: # 2つのタグを継承する
    handler: handler.hello
  users:
    handler: handler.users
    tags: # baz を継承し、foo は上書きする
      foo: quux

Lambda レイヤー

functions.<function name>.layers に記載します。

serverless.yml
functions:
  hello:
    handler: handler.hello
    layers:
      - arn:aws:lambda:region:XXXXXX:layer:LayerName:Y

ロググループ

functions.<function name> 直下に disableLogs, logRetentionInDays, logDataProtectionPolicy を指定します。

デフォルトでは Serverless Framework により Lambda のロググループを新規作成されますが、これを無効化するために disableLogs が利用できます。

logRetentionInDays は文字通りログ保管期間(日数)の設定です。

logDataProtectionPolicy はログのマスク処理の設定をします。Serverless 側のドキュメントには詳細な記載方法がなかったのですが、AWS 公式ドキュメント記載のポリシー構文に従って書けばよさそうです。

docs.aws.amazon.com

serverless.yml
functions:
  hello:
    handler: handler.hello
    disableLogs: true # ロググループを新規作成しない
  goodBye:
    handler: handler.goodBye
    logRetentionInDays: 14 # 14日間保持
    logDataProtectionPolicy: # ポリシー構文に従い記述
      Name: data-protection-policy

既存のロググループを指定するときはどうするんだろう...(ベストプラクティスからはかけ離れていることは承知の上で)。

バージョニング

Serverless Framework では serverless deploy の度にバージョンを上げていきます。古いバージョンはフレームワークの管理対象ではないため自分で削除していく必要があります。

serverless deploy を2回やったときの図

関数バージョンをオフにするには provider.versionFunctions = false を設定します。

serverless.yml
provider:
  versionFunctions: false

DLQ

リトライが失敗した際の DLQ 送信先を設定します。

functions.<function name>.onError に SNS トピック ARN を設定します。resources で定義した SNS を組込関数(Ref, Fn::GetAtt など)で指定することもできそうです。

serverless.yml
functions:
  hello:
    handler: handler.hello
    onError: arn:aws:sns:us-east-1:XXXXXX:test

SQS のサポートは現状はないようなので、今後に期待。

KMS キー

環境変数を暗号化するための KMS キーを設定します。

service.awsKmsKeyArn, functions.<function name>.awsKmsKeyArn で指定することができ、functionsservice の値を継承または上書きします。

serverless.yml
service:
  awsKmsKeyArn: arn:aws:kms:us-east-1:XXXXXX:key/some-hash

provider:
  name: aws
  environment:
    TABLE_NAME: tableName1

functions:
  hello:
    handler: handler.hello
    awsKmsKeyArn: arn:aws:kms:us-east-1:XXXXXX:key/some-hash # キー上書き
    environment:
      TABLE_NAME: tableName2
  goodbye: # キー継承
    handler: handler.goodbye

X-Ray

X-Ray トレースを有効化します。

provider.tracing, functions.<function name>.tracing で設定します。functionsprovider の設定を継承または上書きします。

serverless.yml
provider:
  name: aws
  runtime: nodejs14.x
  tracing:
    lambda: true

functions:
  hello:
    handler: handler.hello
    tracing: Active
  goodbye:
    handler: handler.goodbye
    tracing: PassThrough

定義可能な値は Active, PassThrough です。

docs.aws.amazon.com

非同期呼出

送信先

非同期に実行された Lambda 関数の処理結果を他の Lambda や AWS サービスに送ることができます。ターゲットとして同じサービス内の Lambda 関数、外部の Lambda 関数、EventBridge イベントバス、SQS キュー、SNS トピックを設定できます。

functions.<function name>.destinationsonSuccess, onFailure に識別子※を設定します。※同じ serverless.yml 内で解決可能な関数名もしくは ARN。

ARN に CloudFormation 組込関数を利用する場合は明示的に type を指定する必要があります。

typesns, sqs, eventBus, function から選択します。

serverless.yml
functions:
  asyncHello:
    handler: handler.asyncHello
    destinations:
      onSuccess: otherFunctionInService # 同じサービス内の他 Lambda 関数(serverless 内で解決可能)
      onFailure: arn:aws:sns:us-east-1:xxxx:some-topic-name # SNS トピック ARN
  asyncGoodBye:
    handler: handler.asyncGoodBye
    destinations:
      onFailure:
        type: sns # ARN に CloudFormation 組込関数を利用する場合
        arn:
          Ref: SomeTopicName

ほぼ SAM と同じ書きぶりですね。

docs.aws.amazon.com

リトライ試行

リトライ期間とリトライ回数を設定します。

リトライ期間は functions.<function name>.maximumEventAge, リトライ回数は functions.<function name>.maximumRetryAttempts に設定します。

それぞれ、60 ~ 21600 秒(6時間)、0 ~ 2 (回)で設定できます。

serverless.yml
functions:
  asyncHello:
    handler: handler.asyncHello
    maximumEventAge: 7200
    maximumRetryAttempts: 1

maximumEventAgemaximumRetryAttempts は片方しか必要なくても両方定義する必要があるようです。

blog.serverworks.co.jp

エラーハンドリングについては以下の記事がとても参考になります。

dev.classmethod.jp

EFS

これは個人的にほとんど使わなそうなので軽く。。。というか EFS マウントできるんですね。恥ずかしながら初めて知りました(VPC Lambda やったことないからという言い訳をしておきます)。

functions.<function name>.fileSystemConfig に マウント先の localMountPath と EFS の ARN arn を指定します。

serverless.yml
functions:
  hello:
    handler: handler.hello
    fileSystemConfig:
      localMountPath: /mnt/example
      arn: arn:aws:elasticfilesystem:us-east-1:111111111111:access-point/fsap-0d0d0d0d0d0d0d0d0
    vpc:
      securityGroupIds:
        - securityGroupId1
      subnetIds:
        - subnetId1

エフェメラルストレージ

Lambda の /tmp サイズです。

functions.<function name>.ephemeralStorageSize に設定します。512 ~ 10240 MB で指定可能です。

functions:
  helloEphemeral:
    handler: handler.handler
    ephemeralStorageSize: 1024

Lambda Hashing Algorithm 移行

この章は現在 v3 を利用していて provider.lambdaHashingVersion = 20200924 を設定している人のためのマイグレーションガイドのようです。

provider.lambdaHashingVersion は Serverless Framework が関数のパッケージングに利用するハッシュアルゴリズムのバージョンですが、v3 では諸々の問題が修正され、初めから v3 を利用する人にとってはあまり関係がなさそうなので割愛します。

現在は非推奨ですね。

www.serverless.com

感想

2回にわたって Functions プロパティを見てきました。大体把握しましたが実際に書いてみないとなんともという感じですね。

そういえば、Lambda の基本的な設定であるメモリやタイムアウト設定はどこにあるんでしょうか。

ドキュメント一番上の functions 記載例の中にしれっと memorySize, timeout, provisionedConcurrency などの設定が入っていますね。全部が全部親切にドキュメンテーションされているわけではないので詰まったら都度ググるが正解ですかね。

ちなみに今回はドキュメントを読んでいきましたが、最新版をいち早く見るにはやはりリポジトリ直で見るのがよさそうです。ついこの間GAされた機能もサポートされていてスピード感がすごい。examples もとても充実していますね。

github.com

以上で Function の回を終わります。次回は API Gateway 設定か StepFunctions 周りを見ていきたいと思います。