背景
- AWS SAM を使って、API Gateway + Lambda のデプロイを自動化しています
- 複数環境それぞれで Lambda 関数名を変えています
- 例では
lambda-handler-for-qiita[|-r1|-r2]
の3通りを定義しています - 詳細は別記事の [AWS SAM] [CloudFormation] 環境ごとに設定値を切り替える方法 - Qiita をご参照ください
- 例では
- 本ページでは、Lambda 用実行ロググループを明示的に作成・管理する際の注意点をまとめています
AWS SAM における Lambda 用実行ロググループの基礎知識
- デフォルトでは、何も指定しなくとも
/aws/lambda/{Lambda関数名}
の名前で自動で CloudWatch ロググループを作ってくれます - とはいえ、以下クラスメソッド様の記事で解説されている通り、自前のテンプレートで管理した方が良いです
-
【小ネタ】AWS SAMでLambda関数を作成する場合はCloudWatch LogsのLog Groupも同時に作った方がいいという話 | Developers.IO
- 理由
- Lambda関数のLog Groupが存在する前提のテンプレートになっているとスタックの作成に失敗する可能性がある
- Lambda関数が作成するLog Groupはリテンションが無期限になっている
- AWS SAMによって作成されたスタックを削除した場合Log Groupが残り続ける
- そもそもLog GroupはLambda関数には必須のAWSリソースなのでそれも含めてテンプレートを作成した方がよい
- 理由
-
【小ネタ】AWS SAMでLambda関数を作成する場合はCloudWatch LogsのLog Groupも同時に作った方がいいという話 | Developers.IO
先に 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 関数名を FunctionName プロパティ で明示的に指定しておかないと、
# 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