我有一个 AWS Lambda 函数,需要将消息发送到加密的 SQS 队列。有一次,我发现我的 AWS Lambda 函数可以将消息发送到这个加密的 SQS 队列。在我开始工作后,我对权限进行了一些调整,使它们更加具体。然后它突然停止工作,即使在我恢复到非常广泛的权限之后。
现在我总是收到以下错误:
KMS.AccessDeniedException: The ciphertext refers to a customer master key that does not exist, does not exist in this region, or you are not allowed to access.
我的 CMK 具有以下策略,并且只允许使用它:
{
"Sid": "Allow specific lambda to use this key",
"Effect": "Allow",
"Principal": {
"Service": "lambda.amazonaws.com"
},
"Action": [
"kms:Decrypt",
"kms:GenerateDataKey*"
],
"Resource": "arn:aws:lambda:XXXXXX:function:XXXXXX"
}
我编辑了资源,但我对 ARN 进行了三次检查,结果是正确的。
我的 Lambda 函数附加了以下策略:
{
"Action": "sqs:*",
"Resource": "*",
"Effect": "Allow"
},
{
"Action": "kms:*",
"Resource": "*",
"Effect": "Allow"
},
这难道不足以让我的 Lambda 向这个 SQS 队列发送消息吗?就像我上面提到的那样,这比我试图限制我的 Lambda 上的策略更有效,然后即使在我将其改回之后它也停止工作。
我在这里错过了什么?我不确定我还能改变什么以及为什么它起作用然后它停止工作......
编辑
似乎有效但现在无效的权限:
CMK 政策
{
"Sid": "Allow AWS Lambda to use this key",
"Effect": "Allow",
"Principal": {
"Service": "lambda.amazonaws.com"
},
"Action": [
"kms:Decrypt",
"kms:GenerateDataKey*"
],
"Resource": "*"
}
Lambda 政策
{
"Action": "sqs:*",
"Resource": "*",
"Effect": "Allow"
},
{
"Action": "kms:*",
"Resource": "*",
"Effect": "Allow"
}
编辑 2
一定有一些我不明白的东西在起作用,因为这无法预测......
我对 CDK 进行了以下更改:
第一次改变:
IAM Statement Changes
┌───┬──────────┬────────┬─────────────────────┬──────────────────────────────────────────────────────────────────┬───────────┐
│ │ Resource │ Effect │ Action │ Principal │ Condition │
├───┼──────────┼────────┼─────────────────────┼──────────────────────────────────────────────────────────────────┼───────────┤
│ + │ * │ Allow │ kms:GenerateDataKey │ AWS:${lambda---------------------------------------/ServiceRole} │ │
└───┴──────────┴────────┴─────────────────────┴──────────────────────────────────────────────────────────────────┴───────────┘
结果:我可以再次向 SQS 队列发送消息
第二个变化:
IAM Statement Changes
┌───┬──────────┬────────┬─────────────────────┬──────────────────────────────────────────────────────────────────┬───────────┐
│ │ Resource │ Effect │ Action │ Principal │ Condition │
├───┼──────────┼────────┼─────────────────────┼──────────────────────────────────────────────────────────────────┼───────────┤
│ - │ * │ Allow │ kms:GenerateDataKey │ AWS:${lambda---------------------------------------/ServiceRole} │ │
├───┼──────────┼────────┼─────────────────────┼──────────────────────────────────────────────────────────────────┼───────────┤
│ + │ * │ Allow │ kms:* │ AWS:${lambda---------------------------------------/ServiceRole} │ │
└───┴──────────┴────────┴─────────────────────┴──────────────────────────────────────────────────────────────────┴───────────┘
结果:我无法再向 SQS 队列发送消息?!?为什么?
第三次变化:
IAM Statement Changes
┌───┬──────────┬────────┬─────────────────────┬──────────────────────────────────────────────────────────────────┬───────────┐
│ │ Resource │ Effect │ Action │ Principal │ Condition │
├───┼──────────┼────────┼─────────────────────┼──────────────────────────────────────────────────────────────────┼───────────┤
│ - │ * │ Allow │ kms:* │ AWS:${lambda---------------------------------------/ServiceRole} │ │
├───┼──────────┼────────┼─────────────────────┼──────────────────────────────────────────────────────────────────┼───────────┤
│ + │ * │ Allow │ kms:GenerateDataKey │ AWS:${lambda---------------------------------------/ServiceRole} │ │
└───┴──────────┴────────┴─────────────────────┴──────────────────────────────────────────────────────────────────┴───────────┘
结果:我仍然无法再向 SQS 队列发送消息?!?这里发生了什么?这是与第一次更改相同的策略状态....