Serverless Frameworkで、AWS Lambda function用に作られるCloudWatch Logsの期限を指定する

  • 4
    いいね
  • 0
    コメント

某所でServerless Frameworkが採用されており、コンソールでCloudWatch Logsをみると、Never Expireのlogsが沢山できていた。
これは真綿で首を絞めるような課金になるので、serverless.yml上でlogRetentionInDaysを設定するやり方を調べた。

$ sls --version
1.11.0

標準リソースの上書き機能を使う

そのまんまのサンプルが案内されていました。

serverless/resources.md | serverless/serverless

You can override the specific CloudFormation resource to apply your own options. For example, if you want to set AWS::Logs::LogGroup retention time to 30 days, override it with above table's Name Template.

なるほど、標準でつくられるLogGroup(/aws/lambda/{service_name}-{stage}-{function_name})の定義を上書きできるんだ。

上書き用名前指定の書式は、{normalizedFunctionName} + LogGroupとなっている。

例えば次の例,function名をmainとしている場合、MainLogGroupRetentionInDaysを付与してあげればよい。

serverless.yml
---
service: myservice

# ...

functions:
  main:
    handler: lambda_function.lambda_handler

resources:
  Resources:
    MainLogGroup:
      Properties:
        RetentionInDays: "30"

--noDeploy(-n)(1.12.x以降はsls package)でCFnテンプレートだけ作ってみると、ちゃんとそのようになっていることが確認できる。

  "Resources": {
    "MainLogGroup": {
      "Type": "AWS::Logs::LogGroup",
      "Properties": {
        "LogGroupName": "/aws/lambda/myservice-development-main",
        "RetentionInDays": "30"
      }
    },

function名に-_が入っている場合、それぞれ予約文字列のDashUnderscoreを使えばよいとのこと。
名前自体がDashだったりするケースは調べていません。

環境(stage)によって期限を変更したい場合

例えばcustom属性を使って、stage名で引っ張ってくれば使い分けができますね。

serverless.yml
custom:
  logRetentionInDays:
    development: "14"  # stage[development]は14日
    production: "90"   # stage[production]は90日
    default: "3"       # stageが見つからなかったらこれにfallbackするために設定

resources:
  Resources:
    MainLogGroup:
      Properties:
        RetentionInDays: ${self:custom.logRetentionInDays.${opt:stage, self:provider.stage}, self:custom.logRetentionInDays.default}

デフォルトにfallbackするかどうかはお好みかな。