CloudWatch Logs のリソースポリシーがサイズ制限に抵触した場合の対処方法

Step Functions でステートマシンを作成するごとに、CloudWatch Logs のリソースポリシーが肥大化していきます。対策として、"Resource": ["arn:aws:logs:ap-northeast-1::log-group:/aws/vendedlogs/states/*:*"]に対するロググループの作成とログイベントの書き込みを許可するアクションを追加することが考えられます。
2022.03.09

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

困っていた内容

Step Functions でログ記録を有効にし、CloudWatch Logs へ出力しています。

ステートマシンを多く作ったところ、CloudWatch Logs リソースポリシーのサイズ制限に抵触してしまいました。

CloudWatch Logs のリソースポリシーがどうなっているかを確認したいのですが、確認方法と修正の仕方が分かりません。

どうすればいいですか?

どう対応すればいいの?

AWS CLI から直接 CloudWatch Logs のリソースポリシーを書き換えることで回避が可能です。

作成するリソースポリシー

resource-policy.json

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "AWSLogDeliveryWrite",
      "Effect": "Allow",
      "Principal": {
        "Service": "delivery.logs.amazonaws.com"
      },
      "Action": [
        "logs:CreateLogStream",
        "logs:PutLogEvents"
      ],
      "Resource": [
        "arn:aws:logs:ap-northeast-1:<AcctountID>:log-group:/aws/vendedlogs/states/*:*"
      ],
      "Condition": {
        "StringEquals": {
          "aws:SourceAccount": "<AcctountID>"
        },
        "ArnLike": {
          "aws:SourceArn": "arn:aws:logs:ap-northeast-1:<AcctountID>:*"
        }
      }
    }
  ]
}

AWS CLI コマンド

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

やってみた

始めに、CloudWatch Logs のリソースポリシーは以下の AWS CLI コマンドで確認が可能です。

$ aws logs describe-resource-policies --region ap-northeast-1
{
    "resourcePolicies": [
        {
            "policyName": "AWSLogDeliveryWrite20150319",
            "policyDocument": "
            {
                "Version": "2012-10-17",
                "Statement": [
                    {
                        "Sid": "AWSLogDeliveryWrite",
                        "Effect": "Allow",
                        "Principal": {
                            "Service": "delivery.logs.amazonaws.com"
                        },
                        "Action": [
                            "logs:CreateLogStream",
                            "logs:PutLogEvents"
                        ],
                        "Resource": "arn:aws:logs:ap-northeast-1:<AcctountID>:log-group:/aws/vendedlogs/states/Hello-Logs:log-stream:*",
                        "Condition": {
                            "StringEquals": {
                                "aws:SourceAccount": "<AcctountID>"
                            },
                            "ArnLike": {
                                "aws:SourceArn": "arn:aws:logs:ap-northeast-1:<AcctountID>:*"
                            }
                        }
                    }
                ]
            }
            ",
            "lastUpdatedTime": 1643874816836
        }
    ]
}

Step Functions でステートマシンを作成するごとに、徐々にリソースポリシーが肥大化していきます。例えば、MyStateMachineHello001 という名前のステートマシンを作成し、ログを CloudWatch Logs のロググループへ出力する設定をすると、以下のようにロググループへの書き込みを許可する設定が追加されます。

$ aws logs describe-resource-policies --region ap-northeast-1
{
    "resourcePolicies": [
        {
            "policyName": "AWSLogDeliveryWrite20150319",
            "policyDocument": "
            {
                "Version": "2012-10-17",
                "Statement": [
                    {
                        "Sid": "AWSLogDeliveryWrite",
                        "Effect": "Allow",
                        "Principal": {
                            "Service": "delivery.logs.amazonaws.com"
                        },
                        "Action": [
                            "logs:CreateLogStream",
                            "logs:PutLogEvents"
                        ],
                        "Resource": [
                            "arn:aws:logs:ap-northeast-1:<AcctountID>:log-group:/aws/vendedlogs/states/Hello-Logs:log-stream:*",
                            "arn:aws:logs:ap-northeast-1:<AcctountID>:log-group:/aws/vendedlogs/states/MyStateMachineHello001-Logs:log-stream:*"
                        ],
                        "Condition": {
                            "StringEquals": {
                                "aws:SourceAccount": "<AcctountID>"
                            },
                            "ArnLike": {
                                "aws:SourceArn": "arn:aws:logs:ap-northeast-1:<AcctountID>:*"
                            }
                        }
                    }
                ]
            }
            ",
            "lastUpdatedTime": 1644819835837
        }
    ]
}

ドキュメントでは、ポリシーがサイズ制限に近づくと、/aws/vendedlogs/ でスタートするロググループを自動的に有効にするとの記載がありますが、本稿での検証時では自動的に有効になりませんでした。

Amazon CloudWatch Logs リソースポリシーのサイズ制限 - AWS Step Functions

CloudWatch Logs リソースポリシーは 5120 文字に制限されています。CloudWatch Logs は、ポリシーがこのサイズ制限に近づいていることを検出すると、/aws/vendedlogs/ でスタートするロググループを自動的に有効にします。

事前に回避できる方法があるかの検証のため、以下のリソースポリシーを設定した後、ステートマシンを追加すると、リソースポリシーが書き換えられるかを検証しました。

作成するリソースポリシー

resource-policy.json

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "AWSLogDeliveryWrite",
      "Effect": "Allow",
      "Principal": {
        "Service": "delivery.logs.amazonaws.com"
      },
      "Action": [
        "logs:CreateLogStream",
        "logs:PutLogEvents"
      ],
      "Resource": [
        "arn:aws:logs:ap-northeast-1:<AcctountID>:log-group:/aws/vendedlogs/states/*:*"
      ],
      "Condition": {
        "StringEquals": {
          "aws:SourceAccount": "<AcctountID>"
        },
        "ArnLike": {
          "aws:SourceArn": "arn:aws:logs:ap-northeast-1:<AcctountID>:*"
        }
      }
    }
  ]
}

AWS CLI コマンド

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

検証結果として、上記の設定後はステートマシンを追加した後も、リソースポリシーの書き換えは行われないことを確認しました。

ステートマシンを追加した後の、describe-resource-policies の結果

$ aws logs describe-resource-policies --region ap-northeast-1
{
    "resourcePolicies": [
        {
            "policyName": "AWSLogDeliveryWrite20150319",
            "policyDocument": "
            {
                "Version": "2012-10-17",
                "Statement": [
                    {
                        "Sid": "AWSLogDeliveryWrite",
                        "Effect": "Allow",
                        "Principal": {
                            "Service": "delivery.logs.amazonaws.com"
                        },
                        "Action": [
                            "logs:CreateLogStream",
                            "logs:PutLogEvents"
                        ],
                        "Resource": "arn:aws:logs:ap-northeast-1:<AcctountID>:log-group:/aws/vendedlogs/states/*:*",
                        "Condition": {
                            "StringEquals": {
                                "aws:SourceAccount": "<AcctountID>"
                            },
                            "ArnLike": {
                                "aws:SourceArn": "arn:aws:logs:ap-northeast-1:<AcctountID>:*"
                            }
                        }
                    }
                ]
            }
            ",
            "lastUpdatedTime": 1644823290152
        }
    ]
}

参考資料

describe-resource-policies — AWS CLI 1.22.51 Command Reference

put-resource-policy — AWS CLI 1.22.54 Command Reference