LoginSignup
2
0

More than 3 years have passed since last update.

[AWS SAM] [CloudFormation] Lambda 実行ロググループを明示的に指定する

Posted at

背景

  • AWS SAM を使って、API Gateway + Lambda のデプロイを自動化しています
  • 複数環境それぞれで Lambda 関数名を変えています
  • 本ページでは、Lambda 用実行ロググループを明示的に作成・管理する際の注意点をまとめています

AWS SAM における Lambda 用実行ロググループの基礎知識

  • デフォルトでは、何も指定しなくとも /aws/lambda/{Lambda関数名} の名前で自動で CloudWatch ロググループを作ってくれます
  • とはいえ、以下クラスメソッド様の記事で解説されている通り、自前のテンプレートで管理した方が良いです

先に Lambda 関数が作られると失敗する

  • 当初、以下のように Lambda ロググループ名を !Sub /aws/lambda/${Lambda関数} のように Lambda 関数を参照する形で指定していました
  # Lambda ロググループ
  LambdaHandlerForQiitaLogGroup:
    Type: AWS::Logs::LogGroup
    Properties:
      LogGroupName: !Sub /aws/lambda/${LambdaHandlerForQiita}
      RetentionInDays: 180
  • しかし、この書き方だと sam build 時にエラーとなる場合がありました
  • 理由は、Lambda 関数を !Sub = 参照しているため Lambda 関数が先に作られている必要があるにも関わらず、Lambda ロググループのリソースが先に作成されてしまったためです
    • リソースの作成順は AWS SAM が自動判断しており、検証した限りでは yaml 内での定義順は関係ありませんでした

回避策

  • DependsOn 属性 を利用して、「Lambda 関数 → ロググループ」の順にリソースが作成されるよう制御
  • ロググループ名は !Sub 参照が使えないため、!Join を使って /aws/lambda/{Lambda関数名} となるよう生成
    • Lambda 関数名を FunctionName プロパティ で明示的に指定しておかないと、lambda-handler-for-qiita-A1B2C3D4E5F のように末尾にランダムな文字列が付加され、分かりにくくなってしまうので注意
# Lambda 関数名の Mapping 定義は以下も参照
# https://qiita.com/gotousua/items/48efb57cebef6d46f2ba#%E3%83%9E%E3%83%83%E3%83%94%E3%83%B3%E3%82%B0--mappings-
Mappings:
  SystemTypeMap:
    general:
      LambdaName: lambda-handler-for-qiita

Resources:
  # Lambda 関数
  LambdaHandlerForQiita:
    Type: AWS::Serverless::Function
    Dependson: LambdaHandlerForQiitaLogGroup
    Properties:
      FunctionName: !FindInMap [ SystemTypeMap, !Ref SystemType, LambdaName ]

  # Lambda のログ用ロググループ
  LambdaHandlerForQiitaLogGroup:
    Type: AWS::Logs::LogGroup
    Properties:
      # Lambda より先にロググループを作るため、!Sub /aws/lambda/${LambdaHandlerForQiita} とはしない
      LogGroupName: !Join [ "", [/aws/lambda/, !FindInMap [ SystemTypeMap, !Ref SystemType, LambdaName ]]]
      RetentionInDays: 180
2
0
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0