CloudFront アクセスログの CloudWatch Logs設定時のポリシーエラーをワイルドカードで回避してみた
2025年のアップデートで、CloudFrontの標準アクセスログをCloudWatchLogsに出力する事が可能になりました。
CloudFront ダッシュボードから CloudWatch Logs へのアクセスログ出力を設定すると、CloudWatch Logs への書き込みを許可するリソースポリシーが自動的に追加されます。しかし、このリソースポリシーが文字数制限に達し、エラーが発生することがあります。
-
エラー画面
-
エラーメッセージ
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 ディストリビューションを多数設置する場合には、定期的にリソースポリシーの見直しを実施し、必要であれば集約することをおすすめします
参考リンク