この記事は公開されてから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