CodeSeriesを使用したECSのB/Gデプロイで「Packed policy too large! 」が発生した時の対処方法
事象
CodePipelineのデプロイステージ(ECS B/G with CodeDeploy)で以下エラーが発生する。
対処方法と原因
結論からいうと、CodeDeployのアプリケーション名/デプロイメントグループ名、CodePipelineのアーティファクト名(S3バケット名、プレフィックス)を極力短くすることがユーザにできる唯一の対処方法。
PackedPolicyTooLarge自体は、STSのクォータに抵触した時に出るエラー。
これが何故、CodePipelineのデプロイステージ(ECS B/G with CodeDeploy)で発生するのかだが、デプロイステージにおいて、CodePipelineがサービスロールを引き受ける際に実行されるAPIであるAssumeRoleのセッションポリシーのサイズがクォータに抵触したことが原因。
本エラー発生時のCloudTrailのイベント。
{
"eventVersion": "1.08",
"userIdentity": {
"type": "AWSService",
"invokedBy": "codepipeline.amazonaws.com"
},
"eventTime": "2024-07-27T05:22:07Z",
"eventSource": "sts.amazonaws.com",
"eventName": "AssumeRole",
"awsRegion": "ap-northeast-1",
"sourceIPAddress": "codepipeline.amazonaws.com",
"userAgent": "codepipeline.amazonaws.com",
"errorCode": "PackedPolicyTooLargeException",
"errorMessage": "Packed policy consumes 100% of allotted space, please use smaller policy.",
"requestParameters": {
"roleArn": "arn:aws:iam::xxxxxxxxxxxxxx:role/xxxxxx-dev-testsv-codepipeline-role-xxxxxxx",
"roleSessionName": "xxxxxxxxxxxxxx",
"policy": "{\"Statement\":[{\"Effect\":\"Allow\",\"Action\":[\"codedeploy:CreateDeployment\",\"codedeploy:GetDeployment\"],\"Resource\":[\"arn:aws:codedeploy:ap-northeast-1:*:deploymentgroup:xxxxxx-dev-testsv-codedeploy-app-xxxxxxx/*\"]},{\"Effect\":\"Allow\",\"Action\":[\"codedeploy:GetApplication\",\"codedeploy:GetApplicationRevision\",\"codedeploy:RegisterApplicationRevision\"],\"Resource\":[\"arn:aws:codedeploy:ap-northeast-1:*:application:xxxxxx-dev-testsv-codedeploy-app-xxxxxxx\"]},{\"Effect\":\"Allow\",\"Action\":[\"codedeploy:GetDeploymentConfig\",\"ecs:RegisterTaskDefinition\",\"ecs:TagResource\",\"iam:PassRole\",\"kms:DescribeKey\",\"kms:GenerateDataKey*\",\"kms:Encrypt\",\"kms:ReEncrypt*\",\"kms:Decrypt\"],\"Resource\":[\"*\"]},{\"Effect\":\"Allow\",\"Action\":[\"s3:GetObject\",\"s3:GetObjectVersion\",\"s3:GetObjectTagging\",\"s3:GetObjectVersionTagging\"],\"Resource\":[\"arn:aws:s3:::xxxxxx-dev-bucket-codepipeline-artifact/xxxxxx-dev-testsv-co/SourceArti/xxxxxxx\",\"arn:aws:s3:::xxxxxx-dev-bucket-codepipeline-artifact/xxxxxx-dev-testsv-co/httpd/xxxxxxx\",\"arn:aws:s3:::xxxxxx-dev-bucket-codepipeline-artifact/xxxxxx-dev-testsv-co/php/xxxxxxx\",\"arn:aws:s3:::xxxxxx-dev-bucket-codepipeline-artifact/xxxxxx-dev-testsv-co/TaskdefArt/xxxxxxx\"]}]}",
"durationSeconds": 900
},
"responseElements": null,
"requestID": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"eventID": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"readOnly": true,
"resources": [
{
"accountId": "xxxxxxxxxxxxxx",
"type": "AWS::iam::Role",
"ARN": "arn:aws:iam::xxxxxxxxxxxxxx:role/xxxxxx-dev-testsv-codepipeline-role-xxxxxxx"
}
],
"eventType": "AwsApiCall",
"managementEvent": true,
"recipientAccountId": "xxxxxxxxxxxxxx",
"sharedEventID": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"eventCategory": "Management"
}
本エラー発生時は、CloudTrailのイベントで出力されているrequestParametersのpolicyの箇所を削る必要があるが、このパラメータをユーザ側で直接どうこうはできない。
ただ、このパラメータのResource区にはデプロイステージで参照されている、CodeDeployのアプリケーション名/デプロイメントグループ名、CodePipelineのアーティファクト名(S3バケット名、プレフィックス)が含まれているので、これらを極力短くすることで、間接的にrequestParametersのpolicyを削ることできるので、これがユーザ側にできる唯一の対象方法となる。
CodePipelineのデプロイステージ(ECS B/G with CodeDeploy)において、ECSタスクで複数のコンテナを動かす場合、Resource区に含まれるアーティファクトの数がコンテナの数×になるので、特にセッションポリシーのサイズがクォータに抵触しやすい。
尚、AssumeRoleのセッションポリシーのサイズがどの位(クォータ抵触のサイズを100とした際)かは、同種のAPIが成功した時のCloudTrailのイベントを確認すれば分かる。
このエラーの質の悪いところは、CodeDeployのアプリケーション名/デプロイメントグループ名、CodePipelineのアーティファクト名(S3バケット名、プレフィックス)を作成、設定時の文字数上限には全く抵触してないのに、いざCI/CDを動かしてみると、これらリソースの文字数が原因でエラーが発生すること。
また、どれくらい文字数を削ればよいかが、Try & エラーでしか分からないところである。
AssumeRoleのセッションポリシーのサイズの上限緩和をできるようにして下さい!AWSさん🥺
Discussion