AWS SAMでSSL証明書の有効期限をチェックする
SAMテンプレートの記述例とその解説
虎の穴ラボさんの「Python + AWS LambdaでSSL証明書の有効期限をチェックする」を拝見し、この構成ならSAMでデプロイするのが便利そうだと思いました。SAMテンプレートの記述例はこんな感じです。
SAMテンプレートの記述例
AWSTemplateFormatVersion: '2010-09-09'
Transform: AWS::Serverless-2016-10-31Parameters:
Urls:
Type: String
Description: "Domains to remind (comma separated)"
Default: "example.com"
BufferDays:
Type: Number
Description: "Days to start reminding"
Default: 30
IncommingWebhooks:
Type: String
Description: "URL of Slack Incoming Webhook"
Default: "https://hooks.slack.com/services/*"Resources:
RemindFunction:
Type: AWS::Serverless::Function
Properties:
CodeUri: remind/
Handler: app.lambda_handler
Runtime: python3.7
Timeout: 10
Environment:
Variables:
Urls: !Ref Urls
BufferDays: !Ref BufferDays
IncommingWebhooks: !Ref IncommingWebhooks
Events:
RemindSchedule:
Type: Schedule
Properties:
Schedule: "cron(0 1 * * ? *)"
RemindFunctionLogGroup:
Type: AWS::Logs::LogGroup
DependsOn: RemindFunction
Properties:
LogGroupName: !Sub /aws/lambda/${RemindFunction}
RetentionInDays: 90Outputs:
RemindFunction:
Description: "Remind Function ARN"
Value: !GetAtt RemindFunction.Arn
RemindFunctionRole:
Description: "Implicit IAM Role created for Remind function"
Value: !GetAtt RemindFunctionRole.Arn
RemindFunctionLogGroup:
Description: "Log Group for Remind Function"
Value: !GetAtt RemindFunctionLogGroup.Arn
RemindFunctionRemindSchedule:
Description: "Schedule for Remind Function"
Value: !GetAtt RemindFunctionRemindSchedule.Arn
記述のポイント
以下、記述のポイントを解説します。ポイントは3つです。
1. sam deploy時のパラメータで環境変数を渡す
元記事では、3つの環境変数をLambda関数に渡しています。
- チェック対象のドメイン (Urls)
- 通知対象とする日数の閾値 (BufferDays)
- Slack通知用URL (IncommingWebhooks)
その要件をSAMで実現するため記述したのが下記の部分です。 sam deploy
時にデフォルトパラメータを上書きすることで、Lambda関数に環境変数を渡せます。
Parameters:
Urls:
Type: String
Description: "Domains to remind (comma separated)"
Default: "example.com"
BufferDays:
Type: Number
Description: "Days to start reminding"
Default: 30
IncommingWebhooks:
Type: String
Description: "URL of Slack Incoming Webhook"
Default: "https://hooks.slack.com/services/*"Resources:
RemindFunction:
Type: AWS::Serverless::Function
Properties:
-- (中略) --
Environment:
Variables:
Urls: !Ref Urls
BufferDays: !Ref BufferDays
IncommingWebhooks: !Ref IncommingWebhooks
2. Cron式でスケジュールを定義する
また、元記事では、CloudWatchのイベントでLambda関数の実行スケジュールを定義しています。JSTの10:00なら「0 1 * * ? *
」のようにCron式で指定するわけです。
SAMテンプレートでも、このCron式が使えます。下記が該当部分です。
Resources:
RemindFunction:
Type: AWS::Serverless::Function
Properties:
-- (中略) --
Events:
RemindSchedule:
Type: Schedule
Properties:
Schedule: "cron(0 1 * * ? *)"
「Schedule」が2つ出てきて混乱しそうですが、それぞれ下記の意味となります。
- Lambda関数のEventsプロパティにScheduleオブジェクトを指定
- ScheduleオブジェクトのScheduleプロパティでCron式を指定
3. CloudWatchログの保持期間を指定する(任意)
なお、必須ではありませんが、CloudWatchのLogGroupリソースを明示的に記述すると、ログイベントの保持期間が指定できます。今回は下記のように90日間としました。
Resources:
-- (中略) --
RemindFunctionLogGroup:
Type: AWS::Logs::LogGroup
DependsOn: RemindFunction
Properties:
LogGroupName: !Sub /aws/lambda/${RemindFunction}
RetentionInDays: 90
こうすると、不要なログイベントが残り続けて課金対象となるのを防げます。もちろん、あえて残しておきたい場合は記述しなくて構いません。
デプロイ
さて、SAMテンプレートができたら、あとはビルドしてデプロイするのみです。下記のコマンドを実行すれば、Lambda関数の作成からCloudWatchの設定までが、あれよあれよという間に進んでいきます。
$ sam build
$ sam deploy --guided
元記事のLambdaコードも含め、下記のGitHubリポジトリにまとめています。よろしければご参照ください。
元記事のLambdaコードのおかげで、SSL証明書の期限切れ監視ツールとして実用に耐えるものになっていると思います。ベルトラでも活用できそうなサイトがあれば、実環境に投入してみるつもりです。きっかけをくださった虎の穴ラボさん、ありがとうございます。