CloudWatch Logsの保持期間をAWS Configでチェックして自動設定する

CloudWatch Logsの保持期間を自動設定できるようにSystems ManagerのAutomationを作成しました。
2020.11.04

CloudWatch Logsは様々なログを格納することができて便利ですが、デフォルトでは保持期間が設定されません。
無駄なコストを抑えるために保持期間を「AWS Config」でチェックして、保持期間が設定されていなければ通知&自動設定してみたいと思います。

AWS Configのルール作成

最初にAWS Configのコンソールから、CloudWatch Logsの保持期間をチェックするルールを作成します。

01-config-rule

ログの保持期間をチェックするルールはAWSから提供されています。
検索ボックスで「cw-loggroup」などで検索して、該当のルール「cw-loggroup-retention-period-check」を選択してください。

02-select-cw-log-retention-check

必要に応じて名前や、トリガー、パラメーターを設定してください。トリガーの頻度(チェックする間隔)は「1時間」「3時間」「6時間」「12時間」「24時間」から選択できます。

パラメーターは、チェックしたいロググループを「LogGroupNames」に個別に指定することも可能ですが、今回は全てをチェック対象にしたいので指定はしていません。 (自分以外のユーザーがLambda関数を追加した際なども、自動でログ保持期間を設定したい為です)

「MinRetentionTime」はチェックする保持期間(日)です。ここで指定した日数より短い保持期間の場合に「非準拠」として検知します。指定がなければデフォルトで365日になります。

03-config-rules

レビュー画面で問題なければ「ルールの追加」をクリックしてルールを作成します。

04-review-settings

ルールを作成すると初回チェックがおこなわれます。下記は2件のロググループがルールに準拠していないことを検知しています。

05-detail-rules

実際にCloudWatch Logsのロググループは下記のように「保持期間」を設定していません。

07-no-retention-loggroup

先程のルール画面で該当ルールをクリックすると詳細が表示されます。下記画像の「注釈欄」にあるように、先程の2つのロググループに保持期間が無い旨のメッセージが出ています。

06-detail-no-complience-group

SNS Topicの作成

次に非準拠なリソースを検知した際にメール通知する設定を行います。作業の詳細は省略しますが、Amazon SNSにて下記のように通知先のメールアドレスをサブスクリプションに登録しましょう。

08-sns-topic

修復アクション用のIAM Roleの作成

修復アクションとは

ルールに非準拠なリソースを検知した際に、メール通知など何らかのアクションを実行することができます。このアクションのことを「修復アクション」といいます。

修復アクションは、必ずしも非準拠な状態を正しい状態に修復する必要はありません。ログ保持期間であれば、内容によっては半年で破棄していいものや、1年間は保持が必要なものなど、ログにより要件が異なる場合が考えられます。

そのため修復アクションで、メール通知のみ行い保持期間の設定は担当者が個別に設定するといった運用が必要な場合があります。

メール通知する修復アクションのIAM Role

まずはメール通知を試してみようと思うので、下記のようにsns:Publishの権限を持ったIAM Roleを作成します。
(保持期間の自動設定は後ほど紹介します)

09-iam-role-sns-publish

修復アクションはSystems Mangerの「Automation」というサービスで実行されるので、SSMの信頼関係を設定しておきます。

10-trusted-relation-ssm

AWS Configのルール変更

先程作成したルールには修復アクションが設定されていないので、まずは「メール通知する修復アクション」を設定してみましょう。

AWS Configの画面より、該当のルールを選択して「アクション」から「修復の管理」を選択します。

11-manage-repair-config

各項目を次のように選択します。

設定項目 設定内容
修復方法 自動修復
修復アクションの詳細 AWS-PublishSNSNotification(推奨)

修復アクションの「AWS-PublishSNSNotification」はSystems Managerで提供されているAWSマネージドなAutomationのドキュメントです。

12-set-publish-sns

SNS通知するためのパラメータも設定します。

パラメーター 設定内容
TopicArn 先程作成した通知用SNSトピックのARN
Message 通知メールに記載するメッセージ。適当なものを作成してください。
AutomationAssumeRole 修復アクション実行に必要なIAM Role。先程作成したIAM RoleのARNを指定。

13-set-parameters

修復アクションが設定できたら確認してみます。AWS Configのルールから「再評価」を選択します。

14-re-check

再度ルールのチェックが実行されるので、修復アクションが実行されて通知メールが届きました。
(非準拠のロググループが2つあったので、同じメールが2通届きました)

15-sns-massage

ルールの評価結果も下記のように、修復アクションが実行されたことが分かります。

16-check-result

Automation Documentの作成

非準拠なリソース発見時のメール通知は、AWSマネージドなAutomationドキュメントを利用することで簡単に設定できました。

しかし、CloudWatch Logsのロググループの保持期間を自動設定するドキュメントは提供されていないのでユーザーが作成する必要があります。

Systems Mangerのコンソール画面から「ドキュメント」の画面を開いて作成していきます。

20-make-ssm-automation

名前は適当なものを設定してください。下記では「SetCloudWatchLoggroupRetentionDays」としています。肝心のドキュメントの内容ですが、今回は「エディタ」で直接作成します。

21-make-document

エディタが開いたら、次のようにドキュメントのコードを貼り付けて、「新しいバージョンの作成」をクリックします。

(新規作成の場合は画面下の「新しいバージョンをデフォルトとして設定」というチェックボックスはありません。下記の画像は既存ドキュメントを修正した為に表示されているものです)

22-save-document

貼り付けるドキュメントのコード内容は下記です。
非準拠のロググループがあれば次のアクションを実行します。

  • 保持期間を365日に設定(デフォルト)
  • メールの「件名」と「本文」に対象のロググループ名を記載して通知
description: Set CloudWatch Log Group Retension period
schemaVersion: '0.3'
assumeRole: '{{ AutomationAssumeRole }}'
parameters:
  AutomationAssumeRole:
    type: String
    description: (Required) The ARN of the role that allows Automation to perform the actions on your behalf.
  logGroupName:
    type: String
    description: (Required) The name of CloudWatch Loggroup.
  retentionInDays:
    type: Integer
    description: (Optional) Retention Days of cloudwatch loggroup. default 365 days.
    default: 365
  BasePublishMessage:
    type: String
    description: (Optional) The message to include in the SNS notification.
    default: There is no retentionInDays set for the cloudwatch logs. And set RetentionInDays the logs.
  SnsTopicARN:
    type: String
    description: (Required) The ARN of the SNS topic to publish the notification to.
  BaseNotificationSubject:
    type: String
    description: (Optional) Subject of the notification.
    default: CloudWatch Logs Retention Check
mainSteps:
  - name: PutRetentionPolicy
    action: 'aws:executeAwsApi'
    inputs:
      Service: logs
      Api: PutRetentionPolicy
      logGroupName: '{{logGroupName}}'
      retentionInDays: '{{retentionInDays}}'
  - name: PublishMessage
    action: 'aws:executeAwsApi'
    inputs:
      Service: sns
      Api: Publish
      Message: '{{logGroupName}} : {{ BasePublishMessage }}'
      TopicArn: '{{ SnsTopicARN }}'
      Subject: '{{ BaseNotificationSubject }} - {{logGroupName}}'
    isEnd: true

ドキュメントの中でパラメーターをいくつか設定していますが、それぞれの意味は「詳細」タブで確認可能です。

40-custom-document-parameters

名前 説明
AutomationAssumeRole (必須)修復アクションに必要なIAM RoleのArn
logGroupName (必須)修復対象のCloudWatch Logsのロググループ
retentionInDays (オプション)ロググループの保持期間(デフォルトで365日)
BasePublishMessage (オプション)メール通知するメッセージ内容
SnsTopicARN (必須)メール通知するSNS TopicのArn
BaseNotificationSubject (オプション)通知メールの件名

参考ページ:Systems Manager オートメーションアクションのリファレンス - AWS Systems Manager

ロググループの保持期間を設定する修復アクションのIAM Role

先程作成したIAM Roleはメール通知する権限のみでした。このIAM Roleにロググループの保持期間を設定する権限logs:PutRetentionPolicyを追加します。
(今回はインラインポリシーとして追加しています。)

23-add-cloudwatch-role-for-cw-logs-put-retension-policy

修復アクションの再設定

次にAWS Configの修復アクションを変更します。既存のアクションを編集する場合、うまくパラメーターが設定できなかったので、メール通知する修復アクションを削除して再設定します。

24-delete-sns-publish-action

改めて「修復の管理」を選択して新しいアクションを設定します。

25-manage-rule

修復アクションのプルダウンから、先程作成したAutmationを選択しましょう。

26-edit-repair-action

新たに修復アクションを設定し直した場合、パラメーターが次のように表示されているはずです。

27-set-parameters

パラメーターは次のように設定してください。

28-set-parameters-2

項目 設定内容
リソースIDパラメータ logGroupName

今回は、ルールに非準拠なルールに対して自動修復(保持期間の設定)を行いますが、対象のロググループを指定する必要があります。AWSを利用しているとLambdaの追加時など任意のタイミングでロググループが作成されることがあるので、チェックのタイミングでロググループを指定するのは困難ですね。

「リソースIDパラメータ」を使うことで、非準拠のリソースIDを修復アクションに渡すことができるので、今回は「logGroupName」を指定します。

その他のパラメータ設定は下記のとおりです。

パラメータ 設定内容
AutomationAssumeRole (必須)先程修正したIAM RoleのArnを指定してください
BasePublishMessage (オプション)適当なものを指定してください。指定が無ければAutomationでデフォルト指定したものになります。
retentionInDays (オプション)指定があれば記入してください。指定がなければAutomationでデフォルト指定したもの(365日)になります。
logGroupName 設定不要。リソースIDパラメータで非準拠のリソースIDが渡されます。
SnsTopicARN (必須)メール通知するSNS TopicのArnを指定してください。
BaseNotificationSubject (オプション)通知メールの件名を指定してください。指定が無ければAutomationでデフォルト指定したものになります。

動作確認

修復アクションが再設定できたら、「再評価」を実行して動作確認してみましょう。

29-re-assesment

非準拠のロググループが2つあるので、2通メールが届きました。1通目は/aws/lambda/us-east-1.my-lambda-edge-ip-restrictionというロググループに対する通知です。

メールタイトルを「CloudWatch Logs Retention Check - 対象のロググループ名」としています。また本文にもロググループ名を載せるようにしています。

30-notification-repair-cw-logs-1

2通目はcloudtrail-cloudwatchlogs-seoulというロググループに対する通知であることが分かります。

31-notification-repair-cw-logs-2

この修復アクションを利用することで、対象のロググループ名を通知メールから確認できるようになりました。

AWS Configの画面でも「ステータス」に「修復アクションが実行された」ことが分かります。

41-set-remediation-1

また、CloudWatch Logsを確認すると、保持期間がたしかに12ヶ月(365日)に設定されていることも確認できました。

32-set-retention-days

さらにもう少し動作確認してみます。実際の場面を想定して、「運用中にロググループが追加された時に、追加されたロググループだけアクション実行」できることを確認してみます。

改めて保持期間が設定されていないロググループ(/test/mylog-group)を作成してみます。

33-add-log-group

AWS Config側でもう一度「再評価」を実行します。

34-re-assesment-2

先にチェックしていた2つのロググループが「準拠」に変わり、新たに追加したロググループを非準拠として検知しています。

35-result-status

CloudWatch Logsの画面で見ると、追加したロググループの保持期間が設定されていますね。

36-set-retention-added-log-group

修復アクションにより、追加したロググループの通知メールだけ届きました。追加されたロググループもメールタイトルと本文から確認することができました。

37-notification-for-added-resource

もし修復アクションの実行が失敗している場合は、Systems ManagerのAutomationの画面から確認することができます。

42-automation-result

2020年11月6日追記 : 今回ご紹介した環境をCloudFormationで作成できるようにしてみました。よろしければご参考にしていただければと思います。

最後に

AWSの環境構築をしていると、構築時点ではリソースが利用されていないことで、ロググループが出力されず保持期間を設定できないということがあります。

定期的にログの出力有無をチェックして設定する運用も面倒なので、自動でチェック・保持期間を設定する方法を考えてみました。

どなたかのお役に立てれば幸いです。