cdk 引导必须由具有管理员访问权限的用户完成吗?

med*_*y56 6 amazon-web-services amazon-iam aws-cdk

我正在设置一个 CDK 应用程序,以便可以将其部署到多个 AWS 账户(开发和生产)。该产品帐户是在几周前由另一位开发人员启动的,但通过使用在带有附加策略的CDKDeployUser组中调用的用户来按预期工作。使用的策略(适用于产品帐户中与 CDK 相关的所有日常功能)是:CDKDeployUsersCDKDeployPolicy

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "sts:AssumeRole"
            ],
            "Resource": [
                "arn:aws:iam::*:role/cdk-*"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "cloudformation:*"
            ],
            "Resource": [
                "arn:aws:cloudformation:us-west-2:*:*"
            ]
        }
    ]
}
Run Code Online (Sandbox Code Playgroud)

当我设置开发帐户时,我创建了一个完全相同的用户、组、策略并尝试运行,cdk bootstrap但出现了关于能够承担cdk-*新创建的帐户中尚不存在的相关角色的错误。我假设 Cloudformation 会像在产品帐户中一样创建这些角色,但同样,我也不确切知道该帐户是如何引导的。

为了“让它工作”,我向CDKDeployUsers组添加了管理员策略并运行cdk bootstrap,当然引导程序确实创建以前无法使用的必要角色。

那么,引导必须由管理员完成,即使后续 CDK 操作可以用少得多的权限执行,这是众所周知的事情吗?

我在任何地方都找不到它的记录。期望我们每次需要引导时都添加管理策略(或从 CDK v2 升级引导模板),然后再分离它们,这似乎很疯狂。

naf*_*ers 4

因此,我一直在研究同样的问题,并且必须基本上只是运行会吐出的错误cdk bootstrap,同时逐步向角色添加权限。 真的很烦人/麻烦的过程,正如你所说,我真的希望 AWS 能够发布权限,即使只是针对默认的引导配置。

我已成功完成以下角色/权限配置,成功为我引导了帐户。

通过更具体地确定资源范围,可能需要进行一些改进,但希望这会对您的工作有所帮助。

我一直在使用引导模板 v122.20.0上的CDK 版本。

如果使用不同版本的模板,完全有可能不需要其中一些权限。例如,我最初在某个版本上进行测试v10,发现ecr:SetRepositoryPolicy该版本不需要。

{
    "Statement": [
        {
            "Action": [
                "cloudformation:DescribeStackEvents",
                "cloudformation:DeleteStack",
                "cloudformation:CreateChangeSet",
                "cloudformation:DescribeChangeSet",
                "cloudformation:ExecuteChangeSet",
                "cloudformation:DescribeStacks",
                "cloudformation:GetTemplate"
            ],
            "Effect": "Allow",
            "Resource": [
                "arn:aws:cloudformation:*:{account number}:stack/CDKToolkit/*"
            ]
        },
        {
            "Action": [
                "iam:GetRole",
                "iam:UntagRole",
                "iam:GetPolicy",
                "iam:TagRole",
                "iam:CreateRole",
                "iam:DeleteRole",
                "iam:AttachRolePolicy",
                "iam:PutRolePolicy",
                "iam:TagPolicy",
                "iam:DetachRolePolicy",
                "iam:DeleteRolePolicy",
                "iam:UntagPolicy",
                "iam:UpdateRole",
                "iam:GetRolePolicy"
            ],
            "Effect": "Allow",
            "Resource": [
                "arn:aws:iam::{account number}:policy/*",
                "arn:aws:iam::{account number}:role/cdk-*"
            ]
        },
        {
            "Action": [
                "s3:PutEncryptionConfiguration",
                "s3:PutBucketPublicAccessBlock",
                "s3:PutBucketPolicy",
                "s3:CreateBucket",
                "s3:DeleteBucketPolicy",
                "s3:DeleteBucket",
                "s3:GetBucketPolicy",
                "s3:PutBucketVersioning"
            ],
            "Effect": "Allow",
            "Resource": [
                "arn:aws:s3:::cdk-*"
            ]
        },
        {
            "Action": [
                "ssm:PutParameter",
                "ssm:DeleteParameter",
                "ssm:GetParameters",
                "ssm:GetParameter"
            ],
            "Effect": "Allow",
            "Resource": [
                "arn:aws:ssm:*:{account number}:parameter/cdk-bootstrap/*"
            ]
        },
        {
            "Action": [
                "ecr:DeleteRepository",
                "ecr:DescribeRepositories",
                "ecr:SetRepositoryPolicy"
            ],
            "Effect": "Allow",
            "Resource": [
                "arn:aws:ecr:*:{account number}:repository/cdk-*"
            ]
        },
        {
            "Action": [
                "ecr:CreateRepository"
            ],
            "Effect": "Allow",
            "Resource": [
                "*"
            ]
        }
    ],
    "Version": "2012-10-17"
}
Run Code Online (Sandbox Code Playgroud)

希望这对您有帮助。

编辑:添加是"cloudformation:GetTemplate"因为我刚刚发现需要针对已经引导的帐户重新运行引导程序-.-