CloudFront アクセスログの CloudWatch Logs設定時のポリシーエラーをワイルドカードで回避してみた

CloudFront アクセスログの CloudWatch Logs設定時のポリシーエラーをワイルドカードで回避してみた

GUI 操作で自動追加された CloudWatch Logs リソースポリシーをワイルドカードを用いた設定に変更することで、CloudFront の標準アクセスログを多数設定した環境で発生したエラーを回避しました。
Clock Icon2025.02.16

2025年のアップデートで、CloudFrontの標準アクセスログをCloudWatchLogsに出力する事が可能になりました。

CloudFront ダッシュボードから CloudWatch Logs へのアクセスログ出力を設定すると、CloudWatch Logs への書き込みを許可するリソースポリシーが自動的に追加されます。しかし、このリソースポリシーが文字数制限に達し、エラーが発生することがあります。

  • エラー画面
    DeiverToCloudWatchLogs

  • エラーメッセージ
    Supplied Policy document is breaching Cloudwatch Logs policy length limit.

CloudWatch Logs リソースポリシーは 5,120 文字に制限されています。
CloudWatch ログリソースポリシーのサイズ制限

今回、CloudWatch Logs のリソースポリシーがサイズ制限に達する問題を解決するため、GUI 操作で自動的に追加されたリソースポリシーをワイルドカードを用いた設定に変更しました。その手順を紹介します

CLI作業

バージニアリージョンで AWS CloudShell を起動し、AWS CLI を使用して操作を行いました。

$ aws --version
aws-cli/2.23.13 Python/3.12.6 Linux/6.1.127-135.201.amzn2023.x86_64 exec-env/CloudShell exe/x86_64.amzn.2023

ポリシードキュメントの取得

CloudWatch Logs リソースポリシーを取得しました。

aws logs describe-resource-policies | jq -r '.resourcePolicies[].policyDocument | fromjson' > tmp.json

ポリシードキュメント修正

  • 修正前
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "AWSLogDeliveryWrite1596844968",
      "Effect": "Allow",
      "Principal": {
        "Service": "delivery.logs.amazonaws.com"
      },
      "Action": [
        "logs:CreateLogStream",
        "logs:PutLogEvents"
      ],
      "Resource": "arn:aws:logs:us-east-1:000000000000:log-group:cloudfront/xxxxxxxx:log-stream:*",
      "Condition": {
        "StringEquals": {
          "aws:SourceAccount": "000000000000"
        },
        "ArnLike": {
          "aws:SourceArn": "arn:aws:logs:us-east-1:000000000000:delivery-source:CreatedByCloudFront-xxxxxxxx1"
        }
      }
    },
    {
      "Sid": "AWSLogDeliveryWrite2109549799",
      "Effect": "Allow",
      "Principal": {
        "Service": "delivery.logs.amazonaws.com"
      },
      "Action": [
        "logs:CreateLogStream",
        "logs:PutLogEvents"
      ],
      "Resource": "arn:aws:logs:us-east-1:000000000000:log-group:*",
      "Condition": {
        "StringEquals": {
          "aws:SourceAccount": "000000000000"
        },
        "ArnLike": {
          "aws:SourceArn": "arn:aws:logs:us-east-1:000000000000:delivery-source:CreatedByCloudFront-xxxxxxxx2"
        }
      }
    }
  ]
}

Resource の「log-group」と、Condition の CloudFrontの指定をワイルドカードとして集約したドキュメントを用意しました。

  • 修正後
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "AWSLogDeliveryWrite1596844968",
      "Effect": "Allow",
      "Principal": {
        "Service": "delivery.logs.amazonaws.com"
      },
      "Action": [
        "logs:CreateLogStream",
        "logs:PutLogEvents"
      ],
      "Resource": "arn:aws:logs:us-east-1:000000000000:log-group:*",
      "Condition": {
        "StringEquals": {
          "aws:SourceAccount": "000000000000"
        },
        "ArnLike": {
          "aws:SourceArn": "arn:aws:logs:us-east-1:000000000000:delivery-source:CreatedByCloudFront-*"
        }
      }
    }
  ]
}

今回、ロググループ以下をワイルドカードで指定する設定を試しましたが、他の重要なログが存在する場合は、アクセスログ用のロググループ名をプレフィックスで指定したり、重要なロググループを除外する設定にすることを推奨します。

ポリシードキュメントの反映

文字数節約の為、改行やスペースを省略したJSONファイルを用意しました。

cat tmp.json | jq . -c > tmp2.json

CLIを利用して、CloudWatch Logs リソースポリシーの更新を実施しました。

aws logs put-resource-policy --policy-name AWSLogDeliveryWrite20150319 --policy-document file://tmp2.json

まとめ

CloudWatch Logs のリソースポリシーは、AWS WAF や Step Functions の CloudWatch Logs 出力を有効にする場合にも使用されます。

適切な Logs のリソースポリシー管理方法、IaC管理の実現性については今後検討を試みたいと思いますが、CloudWatch Logs へのログ出力設定を行った CloudFront ディストリビューションを多数設置する場合には、定期的にリソースポリシーの見直しを実施し、必要であれば集約することをおすすめします

参考リンク

https://dev.classmethod.jp/articles/cloudfront-access-log-update-202411/

https://dev.classmethod.jp/articles/tsnote-cloudwatch-logs-resource-policy-size-restrictions-001/

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.