0
Help us understand the problem. What are the problem?

More than 1 year has passed since last update.

posted at

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

背景

  • 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
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Sign upLogin
0
Help us understand the problem. What are the problem?