CloudWatch Logs のリソースポリシーがサイズ制限に抵触した場合の対処方法
困っていた内容
Step Functions でログ記録を有効にし、CloudWatch Logs へ出力しています。
ステートマシンを多く作ったところ、CloudWatch Logs リソースポリシーのサイズ制限に抵触してしまいました。
CloudWatch Logs のリソースポリシーがどうなっているかを確認したいのですが、確認方法と修正の仕方が分かりません。
どうすればいいですか?
どう対応すればいいの?
AWS CLI から直接 CloudWatch Logs のリソースポリシーを書き換えることで回避が可能です。
作成するリソースポリシー
{ "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/ でスタートするロググループを自動的に有効にします。
事前に回避できる方法があるかの検証のため、以下のリソースポリシーを設定した後、ステートマシンを追加すると、リソースポリシーが書き換えられるかを検証しました。
作成するリソースポリシー
{ "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