首页 > 解决方案 > 为什么 aws lambda 会收到“AccessDeniedExceptionKMS”错误消息?

问题描述

我刚刚将一个 lambda(使用来自 gitlab runner 的 Terraform)部署到一个新的 aws 帐户。此管道将 lambda 部署到另一个(开发/测试)帐户没有问题,但是当我尝试部署到我的产品帐户时,我收到以下错误:

KMS 访问被拒绝...

我正在磨练声明,“密文是指不存在的客户主密钥,在该区域不存在,或者您不允许访问。”

我已经确认 env vars 的加密配置设置为使用默认 aws/lambda 密钥而不是客户主密钥。这似乎与指客户主密钥的错误语言相矛盾......?

lambda 承担的角色确实有一个包含两个 kms 操作的策略:

        "Sid": "AWSKeyManagementService",

        "Action": [

            "kms:Decrypt",

            "kms:DescribeKey"

        ]

通过消除过程,我想知道问题是否在于 kms 密钥上基于资源的策略的缺失。查看 kms 密钥,在 aws managed 下,我发现 aws/lambda 密钥具有以下密钥策略:

{
    "Version": "2012-10-17",
    "Id": "auto-awslambda",
    "Statement": [
        {
            "Sid": "Allow access through AWS Lambda for all principals in the account that are authorized to use AWS Lambda",
            "Effect": "Allow",
            "Principal": {
                "AWS": "*"
            },
            "Action": [
                "kms:Encrypt",
                "kms:Decrypt",
                "kms:ReEncrypt*",
                "kms:GenerateDataKey*",
                "kms:CreateGrant",
                "kms:DescribeKey"
            ],
            "Resource": "*",
            "Condition": {
                "StringEquals": {
                    "kms:ViaService": "lambda.us-east-1.amazonaws.com",
                    "kms:CallerAccount": "REDACTED"#<-- Account where lambda deployed
                }
            }
        },
        {
            "Sid": "Allow direct access to key metadata to the account",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::REDACTED:root"#<-- Account where lambda deployed
            },
            "Action": [
                "kms:Describe*",
                "kms:Get*",
                "kms:List*",
                "kms:RevokeGrant"
            ],
            "Resource": "*"
        }
    ]
}

这是非常令人费解的。任何指针表示赞赏!

标签: amazon-web-servicesaws-lambdaterraform

解决方案


这通过简单地删除 lambda 然后重新运行我的管道以重新部署它来解决。我所能得出的结论是,在第一次部署中有些东西被破坏了。


推荐阅读