AWS SAMでSSL証明書の有効期限をチェックする

SAMテンプレートの記述例とその解説

Takashi Iwamoto
Feb 7 · 7 min read

虎の穴ラボさんの「Python + AWS LambdaでSSL証明書の有効期限をチェックする」を拝見し、この構成ならSAMでデプロイするのが便利そうだと思いました。SAMテンプレートの記述例はこんな感じです。

SAMテンプレートの記述例

AWSTemplateFormatVersion: '2010-09-09'
Transform: AWS::Serverless-2016-10-31
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:
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: 90
Outputs:
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つです。

元記事では、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

また、元記事では、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つ出てきて混乱しそうですが、それぞれ下記の意味となります。

なお、必須ではありませんが、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証明書の期限切れ監視ツールとして実用に耐えるものになっていると思います。ベルトラでも活用できそうなサイトがあれば、実環境に投入してみるつもりです。きっかけをくださった虎の穴ラボさん、ありがとうございます。

VELTRA Engineering

Posts from the VELTRA Engineering team. www.veltra.com

Takashi Iwamoto

Written by

Web developer at VELTRA corporation / Japan Mensa member

VELTRA Engineering

Posts from the VELTRA Engineering team. www.veltra.com

Welcome to a place where words matter. On Medium, smart voices and original ideas take center stage - with no ads in sight. Watch
Follow all the topics you care about, and we’ll deliver the best stories for you to your homepage and inbox. Explore
Get unlimited access to the best stories on Medium — and support writers while you’re at it. Just $5/month. Upgrade