🦅

CodeSeriesを使用したECSのB/Gデプロイで「Packed policy too large! 」が発生した時の対処方法

2025/01/03に公開

事象

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