Lambda.InvokeAccessDenied 来自 Kinesis Firehose

Lambda.InvokeAccessDenied from Kinesis Firehose

我正在尝试使用 Firehose 传输流设置 Lambda 转换。我为 Firehose 定义了一个 IAM 角色,其中包括以下策略文档:

{
    "Statement": {
        "Action": [
            "lambda:InvokeFunction",
            "lambda:GetFunctionConfiguration"
        ],
        "Resource": [<Arn>, ...],
        "Effect": "Allow"
    }
}

我还授予 sts:AssumeRole 从 Firehose 访问 Lambda 角色的权限。

这理论上应该授予我的 Firehose "Invoke" 访问指定的 lambda ARN 的权限。但是转换失败

{
  "errorCode":"Lambda.InvokeAccessDenied",
  "errorMessage":"Access was denied. Ensure that the access policy allows access to the Lambda function."
}

而且 Lambda 控制台没有明显的函数调用。我的 IAM 组件配置是否正确?还是这里出了什么问题?

创建新流时,kinesis 流会创建默认的 IAM 策略来触发 lambda?

我能够测试将数据从 Kinesis 流发送到 lambda。

我的政策如下,

{ "Sid": "", "Effect": "Allow", "Action": [ "lambda:InvokeFunction", "lambda:GetFunctionConfiguration" ], "Resource": "lambda-arn" }, { "Sid": "", "Effect": "Allow", "Action": [ "logs:PutLogEvents" ], "Resource":[ “*” ] }, { "Sid": "", "Effect": "Allow", "Action": [ "kinesis:DescribeStream", "kinesis:GetShardIterator", "kinesis:GetRecords" ], "Resource": "kinesis-arn" },

在我的 Firehose 的 ProcessingConfiguration 的其他地方,我提供了一个角色来执行没有足够权限的 lambda。通过移除

- ParameterName: RoleArn
  ParameterValue:
    Fn::GetAtt: [<Role>, Arn]

从 ProcessingConfiguration 配置集中,lambda 能够使用适当的 role/policy 成功执行。

这句话对我有用。请注意资源末尾的 :*

{
    "Sid": "",
    "Effect": "Allow",
    "Action": [
        "lambda:InvokeFunction",
        "lambda:GetFunctionConfiguration"
    ],
    "Resource": "arn:aws:lambda:us-west-2:11111111111:function:transform-lambda:*"
}